summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/minicargo/build.cpp24
-rw-r--r--tools/minicargo/helpers.h7
-rw-r--r--tools/minicargo/manifest.cpp21
-rw-r--r--tools/minicargo/manifest.h4
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;