summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-09-08 18:15:19 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-09-08 18:15:19 +0800
commita132d6482e458a1b5c48b5115c0ddaefd918ecf9 (patch)
treef233d34174713681090b66155a6252b1cfa73446
parent1ec80a35fa2d682f42727e6518d482eb410c4801 (diff)
downloadmrust-a132d6482e458a1b5c48b5115c0ddaefd918ecf9.tar.gz
minicargo - Build binaries
-rw-r--r--tools/minicargo/build.cpp30
-rw-r--r--tools/minicargo/manifest.cpp5
-rw-r--r--tools/minicargo/manifest.h10
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();