diff options
-rw-r--r-- | script-overrides/stable-1.19.0/build_libc.txt | 2 | ||||
-rw-r--r-- | tools/minicargo/build.cpp | 51 | ||||
-rw-r--r-- | tools/minicargo/main.cpp | 13 |
3 files changed, 55 insertions, 11 deletions
diff --git a/script-overrides/stable-1.19.0/build_libc.txt b/script-overrides/stable-1.19.0/build_libc.txt new file mode 100644 index 00000000..aa2eb983 --- /dev/null +++ b/script-overrides/stable-1.19.0/build_libc.txt @@ -0,0 +1,2 @@ +cargo:rustc-cfg=stdbuild +cargo:rerun-if-changed=build.rs
\ No newline at end of file diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp index b4e736d2..c44c0601 100644 --- a/tools/minicargo/build.cpp +++ b/tools/minicargo/build.cpp @@ -81,6 +81,37 @@ class Builder } }; + struct Timestamp + { +#if _WIN32 + FILETIME m_val; +#else + time_t m_val; +#endif + static Timestamp infinite_past() { +#if _WIN32 + return Timestamp { FILETIME { 0, 0 } }; +#else + return Timestamp { 0 } +#endif + } + + bool operator==(const Timestamp& x) const { +#if _WIN32 + return m_val.dwHighDateTime == x.m_val.dwHighDateTime && m_val.dwLowDateTime == x.m_val.dwLowDateTime; +#else + return m_val == x.m_val; +#endif + } + bool operator<(const Timestamp& x) const { +#if _WIN32 + return m_val.dwHighDateTime == x.m_val.dwHighDateTime ? m_val.dwLowDateTime < x.m_val.dwLowDateTime : m_val.dwHighDateTime < x.m_val.dwHighDateTime; +#else + return m_val < x.m_val; +#endif + } + }; + ::helpers::path m_build_script_overrides; public: @@ -96,10 +127,10 @@ private: bool spawn_process(const StringList& args, const ::helpers::path& logfile) const; - time_t get_timestamp(const ::helpers::path& path) const; + Timestamp get_timestamp(const ::helpers::path& path) const; }; -void MiniCargo_Build(const PackageManifest& manifest) +void MiniCargo_Build(const PackageManifest& manifest, ::helpers::path override_path) { BuildList list; @@ -113,8 +144,7 @@ void MiniCargo_Build(const PackageManifest& manifest) } // Build dependencies - // TODO: Take this path as input. (XXX HACK) - Builder builder { "overrides/nightly-2017-07-08" }; + Builder builder { override_path }; for(const auto& p : list.iter()) { if( ! builder.build_library(p) ) @@ -192,7 +222,7 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& auto ts_result = this->get_timestamp(outfile); if( force_rebuild ) { } - else if( ts_result == 0/*Timestamp::infinite_past()*/ ) { + else if( ts_result == Timestamp::infinite_past() ) { // Rebuild (missing) } //else if( ts_result < this->get_timestamp("../bin/mrustc") || ts_result < this->get_timestamp("bin/minicargo") ) { @@ -348,18 +378,23 @@ bool Builder::spawn_process(const StringList& args, const ::helpers::path& logfi return true; } -time_t Builder::get_timestamp(const ::helpers::path& path) const +Builder::Timestamp Builder::get_timestamp(const ::helpers::path& path) const { #if _WIN32 + FILETIME out; + auto handle = CreateFile(path.str().c_str(), GENERIC_READ, 0, nullptr, 0, 0, NULL); + if(handle == NULL) return Timestamp::infinite_past(); + GetFileTime(handle, nullptr, nullptr, &out); + return Timestamp { out }; #else struct stat s; if( stat(path.str().c_str(), &s) == 0 ) { - return s.st_mtime; + return Timestamp { s.st_mtime }; } else { - return 0; + return Timestamp::infinite_past(); } #endif } diff --git a/tools/minicargo/main.cpp b/tools/minicargo/main.cpp index 236b9d77..decedd6a 100644 --- a/tools/minicargo/main.cpp +++ b/tools/minicargo/main.cpp @@ -12,7 +12,7 @@ #include "helpers.h" #include "repository.h" -extern void MiniCargo_Build(const PackageManifest& manifest); +extern void MiniCargo_Build(const PackageManifest& manifest, ::helpers::path override_path); struct ProgramOptions { @@ -54,7 +54,7 @@ int main(int argc, const char* argv[]) m.load_dependencies(repo); // 3. Build dependency tree - MiniCargo_Build(m); + MiniCargo_Build(m, opts.override_directory ? ::helpers::path(opts.override_directory) : ::helpers::path() ); } catch(const ::std::exception& e) { @@ -100,7 +100,14 @@ int ProgramOptions::parse(int argc, const char* argv[]) ::std::cerr << "Flag " << arg << " takes an argument" << ::std::endl; return 1; } - //this->build_script_override_dir = argv[++i]; + this->override_directory = argv[++i]; + } + else if( ::std::strcmp(arg, "--vendor-dir") == 0 ) { + if(i+1 == argc) { + ::std::cerr << "Flag " << arg << " takes an argument" << ::std::endl; + return 1; + } + this->vendor_dir = argv[++i]; } else { ::std::cerr << "Unknown flag " << arg << ::std::endl; |