@@ -17,6 +17,7 @@ using namespace dds; | |||
namespace { | |||
/// XXX: Duplicated in compile_exec.cpp !! | |||
template <typename Range, typename Fn> | |||
bool parallel_run(Range&& rng, int n_jobs, Fn&& fn) { | |||
// We don't bother with a nice thread pool, as the overhead of most build | |||
@@ -91,10 +92,10 @@ void build_plan::archive_all(const build_env& env, int njobs) const { | |||
} | |||
void build_plan::link_all(const build_env& env, int njobs) const { | |||
// Generate a pairing between executables and the libraries that own them | |||
std::vector<std::pair<std::reference_wrapper<const library_plan>, | |||
std::reference_wrapper<const link_executable_plan>>> | |||
executables; | |||
for (auto&& lib : iter_libraries(*this)) { | |||
for (auto&& exe : lib.executables()) { | |||
executables.emplace_back(lib, exe); | |||
@@ -112,6 +113,7 @@ void build_plan::link_all(const build_env& env, int njobs) const { | |||
std::vector<test_failure> build_plan::run_all_tests(build_env_ref env, int njobs) const { | |||
using namespace ranges::views; | |||
// Collect executables that are tests | |||
auto test_executables = // | |||
iter_libraries(*this) // | |||
| transform(&library_plan::executables) // |
@@ -5,18 +5,45 @@ | |||
namespace dds { | |||
/** | |||
* Encompases an entire build plan. | |||
* | |||
* A build plan consists of some number of packages, defined as `package_plan` | |||
* objects. | |||
*/ | |||
class build_plan { | |||
/// The packages that are part of this plan. | |||
std::vector<package_plan> _packages; | |||
public: | |||
/** | |||
* Append a new package plan. Returns a reference to the package plan so that it can be further | |||
* tweaked. Note that the reference is not stable. | |||
*/ | |||
package_plan& add_package(package_plan p) noexcept { | |||
return _packages.emplace_back(std::move(p)); | |||
} | |||
/** | |||
* All of the packages in this plan | |||
*/ | |||
auto& packages() const noexcept { return _packages; } | |||
void compile_all(const build_env& env, int njobs) const; | |||
void archive_all(const build_env& env, int njobs) const; | |||
void link_all(const build_env& env, int njobs) const; | |||
/** | |||
* Compile all files in the plan. | |||
*/ | |||
void compile_all(const build_env& env, int njobs) const; | |||
/** | |||
* Generate all static library archive in the plan | |||
*/ | |||
void archive_all(const build_env& env, int njobs) const; | |||
/** | |||
* Link all runtime binaries (executables) in the plan | |||
*/ | |||
void link_all(const build_env& env, int njobs) const; | |||
/** | |||
* Execute all tests defined in the plan. Returns information for every failed test. | |||
*/ | |||
std::vector<test_failure> run_all_tests(build_env_ref env, int njobs) const; | |||
}; | |||
@@ -7,20 +7,47 @@ | |||
namespace dds { | |||
/** | |||
* A package is a top-level component with a name, namespace, and some number of associated | |||
* libraries. A package plan will roughly correspond to either a source distribution or a project | |||
* directory | |||
*/ | |||
class package_plan { | |||
std::string _name; | |||
std::string _namespace; | |||
/// Package name | |||
std::string _name; | |||
/// The package namespace. Used to specify interdependencies | |||
std::string _namespace; | |||
/// The libraries in this package | |||
std::vector<library_plan> _libraries; | |||
public: | |||
/** | |||
* Create a new package plan. | |||
* @param name The name of the package | |||
* @param namespace_ The namespace of the package. Used when specifying linker dependencies. | |||
*/ | |||
package_plan(std::string_view name, std::string_view namespace_) | |||
: _name(name) | |||
, _namespace(namespace_) {} | |||
/** | |||
* Add a library plan to this package plan | |||
* @param lp The `library_plan` to add to the package. Once added, the | |||
* library plan cannot be changed directly. | |||
*/ | |||
void add_library(library_plan lp) { _libraries.emplace_back(std::move(lp)); } | |||
/** | |||
* Get the package name | |||
*/ | |||
auto& name() const noexcept { return _name; } | |||
/** | |||
* The package namespace | |||
*/ | |||
auto& namespace_() const noexcept { return _namespace; } | |||
/** | |||
* The libraries in the package | |||
*/ | |||
auto& libraries() const noexcept { return _libraries; } | |||
}; | |||