summaryrefslogtreecommitdiff
path: root/tools/minicargo/build.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-06-09 17:13:32 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-06-09 17:13:32 +0800
commit770166eeec3f02b0c6fbac5150c3d5eec2bb211b (patch)
treea431bda7d5b67f023f45710e71283d34198cf643 /tools/minicargo/build.cpp
parentb219ee483dadc4f9f460b0ef445bf3369271675d (diff)
downloadmrust-770166eeec3f02b0c6fbac5150c3d5eec2bb211b.tar.gz
minicargo - Support for integration tests
Diffstat (limited to 'tools/minicargo/build.cpp')
-rw-r--r--tools/minicargo/build.cpp48
1 files changed, 40 insertions, 8 deletions
diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp
index 145a1c1e..64558103 100644
--- a/tools/minicargo/build.cpp
+++ b/tools/minicargo/build.cpp
@@ -63,13 +63,13 @@ extern int _putenv_s(const char*, const char*);
/// Class abstracting access to the compiler
class Builder
{
- BuildOptions m_opts;
+ const BuildOptions& m_opts;
::helpers::path m_compiler_path;
size_t m_total_targets;
mutable size_t m_targets_built;
public:
- Builder(BuildOptions opts, size_t total_targets);
+ Builder(const BuildOptions& opts, size_t total_targets);
bool build_target(const PackageManifest& manifest, const PackageTarget& target, bool is_for_host, size_t index) const;
bool build_library(const PackageManifest& manifest, bool is_for_host, size_t index) const;
@@ -218,6 +218,18 @@ BuildList::BuildList(const PackageManifest& manifest, const BuildOptions& opts):
{
b.m_list.push_back({ &manifest, !cross_compiling, 0 });
}
+ if( opts.mode != BuildOptions::Mode::Normal)
+ {
+ for(const auto& dep : manifest.dev_dependencies())
+ {
+ if( dep.is_disabled() )
+ {
+ continue ;
+ }
+ DEBUG(manifest.name() << ": Dependency " << dep.name());
+ b.add_package(dep.get_package(), 1, !opts.build_script_overrides.is_valid(), !cross_compiling);
+ }
+ }
// TODO: Add the binaries too?
// - They need slightly different treatment.
@@ -261,7 +273,7 @@ BuildList::BuildList(const PackageManifest& manifest, const BuildOptions& opts):
bool BuildList::build(BuildOptions opts, unsigned num_jobs)
{
bool include_build = !opts.build_script_overrides.is_valid();
- Builder builder { ::std::move(opts), m_list.size() };
+ Builder builder { opts, m_list.size() };
// Pre-count how many dependencies are remaining for each package
struct BuildState
@@ -533,14 +545,24 @@ bool BuildList::build(BuildOptions opts, unsigned num_jobs)
}
// Now that all libraries are done, build the binaries (if present)
- return this->m_root_manifest.foreach_binaries([&](const auto& bin_target) {
- return builder.build_target(this->m_root_manifest, bin_target, /*is_for_host=*/false, ~0u);
- });
+ switch(opts.mode)
+ {
+ case BuildOptions::Mode::Normal:
+ return this->m_root_manifest.foreach_binaries([&](const auto& bin_target) {
+ return builder.build_target(this->m_root_manifest, bin_target, /*is_for_host=*/false, ~0u);
+ });
+ case BuildOptions::Mode::Test:
+ // TODO: What about unit tests?
+ return this->m_root_manifest.foreach_ty(PackageTarget::Type::Test, [&](const auto& test_target) {
+ return builder.build_target(this->m_root_manifest, test_target, /*is_for_host=*/true, ~0u);
+ });
+ }
+ throw "unreachable";
}
-Builder::Builder(BuildOptions opts, size_t total_targets):
- m_opts(::std::move(opts)),
+Builder::Builder(const BuildOptions& opts, size_t total_targets):
+ m_opts(opts),
m_total_targets(total_targets),
m_targets_built(0)
{
@@ -641,6 +663,11 @@ Builder::Builder(BuildOptions opts, size_t total_targets):
*crate_type = "bin";
outfile /= ::format(target.m_name, EXESUF);
break;
+ case PackageTarget::Type::Test:
+ if(crate_type)
+ *crate_type = "bin";
+ outfile /= ::format(target.m_name, "-test", EXESUF);
+ break;
default:
throw ::std::runtime_error("Unknown target type being built");
}
@@ -810,6 +837,7 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget&
for(const auto& cmd : manifest.build_script_output().pre_build_commands)
{
// TODO: Run commands specified by build script (override)
+ TODO("Run command `" << cmd << "` from build script override");
}
{
@@ -882,6 +910,10 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget&
args.push_back("--extern");
args.push_back(::format(m.get_library().m_name, "=", path));
}
+ if( target.m_type == PackageTarget::Type::Test /*|| building_unit_tests */)
+ {
+ args.push_back("--test");
+ }
for(const auto& dep : manifest.dependencies())
{
if( ! dep.is_disabled() )