diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-09-08 18:15:19 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-09-08 18:15:19 +0800 |
commit | a132d6482e458a1b5c48b5115c0ddaefd918ecf9 (patch) | |
tree | f233d34174713681090b66155a6252b1cfa73446 | |
parent | 1ec80a35fa2d682f42727e6518d482eb410c4801 (diff) | |
download | mrust-a132d6482e458a1b5c48b5115c0ddaefd918ecf9.tar.gz |
minicargo - Build binaries
-rw-r--r-- | tools/minicargo/build.cpp | 30 | ||||
-rw-r--r-- | tools/minicargo/manifest.cpp | 5 | ||||
-rw-r--r-- | tools/minicargo/manifest.h | 10 |
3 files changed, 42 insertions, 3 deletions
diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp index 665f567e..d3cb4899 100644 --- a/tools/minicargo/build.cpp +++ b/tools/minicargo/build.cpp @@ -226,7 +226,17 @@ bool MiniCargo_Build(const PackageManifest& manifest, ::helpers::path override_p } // TODO: If the manifest doesn't have a library, build the binary - return builder.build_library(manifest); + if( manifest.has_library() ) + { + if( ! builder.build_library(manifest) ) + { + return false; + } + } + + return manifest.foreach_binaries([&](const auto& bin_target) { + return builder.build_target(manifest, bin_target); + }); } void BuildList::add_dependencies(const PackageManifest& p, unsigned level, bool include_build) @@ -312,7 +322,21 @@ Builder::Builder(::helpers::path output_dir, ::helpers::path override_dir): bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& target) const { - auto outfile = m_output_dir / ::format("lib", target.m_name, ".hir"); + const char* crate_type; + auto outfile = m_output_dir; + switch(target.m_type) + { + case PackageTarget::Type::Lib: + crate_type = "rlib"; + outfile /= ::format("lib", target.m_name, ".hir"); + break; + case PackageTarget::Type::Bin: + crate_type = "bin"; + outfile /= ::format(target.m_name, EXESUF); + break; + default: + throw ::std::runtime_error("Unknown target type being built"); + } //DEBUG("Building " << manifest.name() << ":" << target.m_name << " as " << outfile); // TODO: Determine if it needs re-running @@ -349,7 +373,7 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& StringList args; args.push_back(::helpers::path(manifest.manifest_path()).parent() / ::helpers::path(target.m_path)); args.push_back("--crate-name"); args.push_back(target.m_name.c_str()); - args.push_back("--crate-type"); args.push_back("rlib"); + args.push_back("--crate-type"); args.push_back(crate_type); args.push_back("-o"); args.push_back(outfile); args.push_back("-L"); args.push_back(m_output_dir.str().c_str()); for(const auto& dir : manifest.build_script_output().rustc_link_search) { diff --git a/tools/minicargo/manifest.cpp b/tools/minicargo/manifest.cpp index 7d1ae14e..32735732 100644 --- a/tools/minicargo/manifest.cpp +++ b/tools/minicargo/manifest.cpp @@ -407,6 +407,11 @@ void PackageRef::fill_from_kv(bool was_added, const TomlKeyValue& key_val, size_ } } +bool PackageManifest::has_library() const +{ + auto it = ::std::find_if(m_targets.begin(), m_targets.end(), [](const auto& x) { return x.m_type == PackageTarget::Type::Lib; }); + return it != m_targets.end(); +} const PackageTarget& PackageManifest::get_library() const { auto it = ::std::find_if(m_targets.begin(), m_targets.end(), [](const auto& x) { return x.m_type == PackageTarget::Type::Lib; }); diff --git a/tools/minicargo/manifest.h b/tools/minicargo/manifest.h index c12c333b..99df7843 100644 --- a/tools/minicargo/manifest.h +++ b/tools/minicargo/manifest.h @@ -238,8 +238,18 @@ class PackageManifest public: static PackageManifest load_from_toml(const ::std::string& path); + bool has_library() const; const PackageTarget& get_library() const; + bool foreach_binaries(::std::function<bool(const PackageTarget&)> cb) const { + for(const auto& t : m_targets ) { + if( t.m_type == PackageTarget::Type::Bin ) { + if( !cb(t) ) + return false; + } + } + return true; + } const ::helpers::path directory() const { return ::helpers::path(m_manifest_path).parent(); |