diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-09-24 23:41:31 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-09-24 23:41:31 +0800 |
commit | 8b1b7f50a17e9d38234d0139ed57a716773c886c (patch) | |
tree | 67ecdc9259b90e51da414674daf8a53ef618e369 | |
parent | c6d5beb7cffbe6edb006998b9bfd4a8a911198dd (diff) | |
download | mrust-8b1b7f50a17e9d38234d0139ed57a716773c886c.tar.gz |
minicargo - Specify crate version tags
-rw-r--r-- | tools/minicargo/build.cpp | 57 | ||||
-rw-r--r-- | tools/minicargo/build.h | 1 |
2 files changed, 52 insertions, 6 deletions
diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp index a078e48b..3ace0c94 100644 --- a/tools/minicargo/build.cpp +++ b/tools/minicargo/build.cpp @@ -342,24 +342,45 @@ Builder::Builder(BuildOptions opts): #endif } -bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& target) const +::helpers::path Builder::get_crate_path(const PackageManifest& manifest, const PackageTarget& target, const char** crate_type, ::std::string* out_crate_suffix) const { - const char* crate_type; auto outfile = m_opts.output_dir; + // HACK: If there's no version, don't emit a version tag + ::std::string crate_suffix; +#if 1 + if( manifest.version() != PackageVersion() ) { + crate_suffix = ::format("-", manifest.version()); + for(auto& v : crate_suffix) + if(v == '.') + v = '_'; + } +#endif + switch(target.m_type) { case PackageTarget::Type::Lib: - crate_type = "rlib"; - outfile /= ::format("lib", target.m_name, ".hir"); + if(crate_type) + *crate_type = "rlib"; + outfile /= ::format("lib", target.m_name, crate_suffix, ".hir"); break; case PackageTarget::Type::Bin: - crate_type = "bin"; + if(crate_type) + *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); + if(out_crate_suffix) + *out_crate_suffix = crate_suffix; + return outfile; +} + +bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& target) const +{ + const char* crate_type; + ::std::string crate_suffix; + auto outfile = this->get_crate_path(manifest, target, &crate_type, &crate_suffix); // TODO: Determine if it needs re-running // Rerun if: @@ -392,10 +413,14 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& // TODO: Run commands specified by build script (override) } + ::std::cout << "BUILDING " << target.m_name << " from " << manifest.name() << " v" << manifest.version() << ::std::endl; 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(crate_type); + if( !crate_suffix.empty() ) { + args.push_back("--crate-tag"); args.push_back(crate_suffix.c_str() + 1); + } if( true /*this->enable_debug*/ ) { args.push_back("-g"); //args.push_back("--cfg"); args.push_back("debug_assertions"); @@ -420,6 +445,16 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& for(const auto& feat : manifest.active_features()) { args.push_back("--cfg"); args.push_back(::format("feature=", feat)); } + for(const auto& dep : manifest.dependencies()) + { + if( ! dep.is_disabled() ) + { + const auto& m = dep.get_package(); + auto path = this->get_crate_path(m, m.get_library(), nullptr, nullptr); + args.push_back("--extern"); + args.push_back(::format(m.get_library().m_name, "=", path)); + } + } for(const auto& d : m_opts.lib_search_dirs) { args.push_back("-L"); @@ -448,6 +483,16 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& args.push_back("-L"); args.push_back(d.str().c_str()); } + for(const auto& dep : manifest.build_dependencies()) + { + if( ! dep.is_disabled() ) + { + const auto& m = dep.get_package(); + auto path = this->get_crate_path(m, m.get_library(), nullptr, nullptr); + args.push_back("--extern"); + args.push_back(::format(m.get_library().m_name, "=", path)); + } + } StringListKV env; env.push_back("CARGO_MANIFEST_DIR", manifest.directory().to_absolute()); diff --git a/tools/minicargo/build.h b/tools/minicargo/build.h index 4bbcd158..a1b428a6 100644 --- a/tools/minicargo/build.h +++ b/tools/minicargo/build.h @@ -27,6 +27,7 @@ public: ::std::string build_build_script(const PackageManifest& manifest) const; private: + ::helpers::path get_crate_path(const PackageManifest& manifest, const PackageTarget& target, const char** crate_type, ::std::string* out_crate_suffix) const; bool spawn_process_mrustc(const StringList& args, StringListKV env, const ::helpers::path& logfile) const; bool spawn_process(const char* exe_name, const StringList& args, const StringListKV& env, const ::helpers::path& logfile) const; |