diff options
-rw-r--r-- | tools/minicargo/build.cpp | 24 | ||||
-rw-r--r-- | tools/minicargo/helpers.h | 7 | ||||
-rw-r--r-- | tools/minicargo/manifest.cpp | 21 | ||||
-rw-r--r-- | tools/minicargo/manifest.h | 4 |
4 files changed, 54 insertions, 2 deletions
diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp index 00733271..5f2d7b15 100644 --- a/tools/minicargo/build.cpp +++ b/tools/minicargo/build.cpp @@ -468,6 +468,17 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& env.push_back("OUT_DIR", out_dir.str()); env.push_back("CARGO_MANIFEST_DIR", manifest.directory().to_absolute()); env.push_back("CARGO_PKG_VERSION", ::format(manifest.version())); + for(const auto& dep : manifest.dependencies()) + { + if( ! dep.is_disabled() ) + { + const auto& m = dep.get_package(); + for(const auto& p : m.build_script_output().downstream_env) + { + env.push_back(p.first.c_str(), p.second.c_str()); + } + } + } return this->spawn_process_mrustc(args, ::std::move(env), outfile + "_dbg.txt"); } @@ -500,6 +511,8 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& StringListKV env; env.push_back("CARGO_MANIFEST_DIR", manifest.directory().to_absolute()); env.push_back("CARGO_PKG_VERSION", ::format(manifest.version())); + // TODO: If there's any dependencies marked as `links = foo` then grab `DEP_FOO_<varname>` from its metadata + // (build script output) if( this->spawn_process_mrustc(args, ::std::move(env), outfile + "_dbg.txt") ) return outfile; @@ -576,6 +589,17 @@ bool Builder::build_library(const PackageManifest& manifest) const env.push_back("OPT_LEVEL", "2"); env.push_back("DEBUG", "0"); env.push_back("PROFILE", "release"); + for(const auto& dep : manifest.dependencies()) + { + if( ! dep.is_disabled() ) + { + const auto& m = dep.get_package(); + for(const auto& p : m.build_script_output().downstream_env) + { + env.push_back(p.first.c_str(), p.second.c_str()); + } + } + } #if _WIN32 #else diff --git a/tools/minicargo/helpers.h b/tools/minicargo/helpers.h index 9f97b5bb..8111483a 100644 --- a/tools/minicargo/helpers.h +++ b/tools/minicargo/helpers.h @@ -40,6 +40,13 @@ public: os.write(sv.m_start, sv.m_len); return os; } + + const char* begin() const { + return m_start; + } + const char* end() const { + return m_start+m_len; + } }; diff --git a/tools/minicargo/manifest.cpp b/tools/minicargo/manifest.cpp index adae89ec..668100fc 100644 --- a/tools/minicargo/manifest.cpp +++ b/tools/minicargo/manifest.cpp @@ -111,7 +111,12 @@ PackageManifest PackageManifest::load_from_toml(const ::std::string& path) } else if( key == "links" ) { - // Metadata only + if(rv.m_links != "" ) + { + // TODO: Warn/error + throw ::std::runtime_error("Package 'links' attribute set twice"); + } + rv.m_links = key_val.value.as_string(); } else { @@ -717,7 +722,19 @@ void PackageManifest::load_build_script(const ::std::string& path) } // - Ignore else { - DEBUG("TODO: '" << key << "' = '" << value << "'"); + if( this->m_links != "" && line.find_first_of('-') == ::std::string::npos ) { + ::std::string varname; + varname += "DEP_"; + for(auto c : this->m_links) + varname += ::std::toupper(c); + varname += "_"; + for(auto c : key) + varname += ::std::toupper(c); + rv.downstream_env.push_back(::std::make_pair( varname, static_cast<::std::string>(value) )); + } + else { + DEBUG("TODO: '" << key << "' = '" << value << "'"); + } } } } diff --git a/tools/minicargo/manifest.h b/tools/minicargo/manifest.h index d4874881..043bb438 100644 --- a/tools/minicargo/manifest.h +++ b/tools/minicargo/manifest.h @@ -222,6 +222,9 @@ public: ::std::vector<::std::string> rustc_flags; // cargo:rustc-env=FOO=BAR ::std::vector<::std::string> rustc_env; + + // cargo:foo=bar when [package]links=baz + ::std::vector<::std::pair<::std::string, ::std::string>> downstream_env; }; class PackageManifest @@ -230,6 +233,7 @@ class PackageManifest ::std::string m_name; PackageVersion m_version; + ::std::string m_links; ::std::string m_build_script; |