From 0760742386e8e6034bbd619487ef156bc574e408 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 11 Jul 2016 07:23:37 +0200 Subject: Add bin.rc module (resource compiler) --- build2/bin/module.cxx | 105 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 85 insertions(+), 20 deletions(-) (limited to 'build2/bin/module.cxx') diff --git a/build2/bin/module.cxx b/build2/bin/module.cxx index f5e44db..306d8de 100644 --- a/build2/bin/module.cxx +++ b/build2/bin/module.cxx @@ -305,7 +305,7 @@ namespace build2 const path& ar (cast (p.first)); const path& ranlib (v ? cast (v) : path ()); - ar_info ai (guess_ar (ar, ranlib)); + ar_info ari (guess_ar (ar, ranlib)); // If this is a new value (e.g., we are configuring), then print the // report at verbosity level 2 and up (-v). @@ -316,30 +316,31 @@ namespace build2 text << "bin.ar\n" << " exe " << ar << '\n' - << " id " << ai.ar_id << '\n' - << " signature " << ai.ar_signature << '\n' - << " checksum " << ai.ar_checksum; + << " id " << ari.ar_id << '\n' + << " signature " << ari.ar_signature << '\n' + << " checksum " << ari.ar_checksum; if (!ranlib.empty ()) { text << "bin.ranlib\n" << " exe " << ranlib << '\n' - << " id " << ai.ranlib_id << '\n' - << " signature " << ai.ranlib_signature << '\n' - << " checksum " << ai.ranlib_checksum; + << " id " << ari.ranlib_id << '\n' + << " signature " << ari.ranlib_signature << '\n' + << " checksum " << ari.ranlib_checksum; } } - r.assign ("bin.ar.id") = move (ai.ar_id); - r.assign ("bin.ar.signature") = move (ai.ar_signature); - r.assign ("bin.ar.checksum") = move (ai.ar_checksum); + r.assign ("bin.ar.id") = move (ari.ar_id); + r.assign ("bin.ar.signature") = move (ari.ar_signature); + r.assign ("bin.ar.checksum") = move (ari.ar_checksum); if (!ranlib.empty ()) { - r.assign ("bin.ranlib.id") = move (ai.ranlib_id); + r.assign ("bin.ranlib.id") = move (ari.ranlib_id); r.assign ("bin.ranlib.signature") = - move (ai.ranlib_signature); - r.assign ("bin.ranlib.checksum") = move (ai.ranlib_checksum); + move (ari.ranlib_signature); + r.assign ("bin.ranlib.checksum") = + move (ari.ranlib_checksum); } } @@ -464,7 +465,7 @@ namespace build2 path (apply (r["bin.pattern"], ld_d)))); const path& ld (cast (p.first)); - ld_info li (guess_ld (ld)); + ld_info ldi (guess_ld (ld)); // If this is a new value (e.g., we are configuring), then print the // report at verbosity level 2 and up (-v). @@ -473,14 +474,78 @@ namespace build2 { text << "bin.ld\n" << " exe " << ld << '\n' - << " id " << li.ld_id << '\n' - << " signature " << li.ld_signature << '\n' - << " checksum " << li.ld_checksum; + << " id " << ldi.id << '\n' + << " signature " << ldi.signature << '\n' + << " checksum " << ldi.checksum; } - r.assign ("bin.ld.id") = move (li.ld_id); - r.assign ("bin.ld.signature") = move (li.ld_signature); - r.assign ("bin.ld.checksum") = move (li.ld_checksum); + r.assign ("bin.ld.id") = move (ldi.id); + r.assign ("bin.ld.signature") = move (ldi.signature); + r.assign ("bin.ld.checksum") = move (ldi.checksum); + } + + return true; + } + + bool + rc_init (scope& r, + scope& b, + const location& loc, + unique_ptr&, + bool first, + bool, + const variable_map& config_hints) + { + tracer trace ("bin::rc_init"); + l5 ([&]{trace << "for " << b.out_path ();}); + + // Make sure the bin core is loaded. + // + if (!cast_false (b["bin.loaded"])) + load_module ("bin", r, b, loc, false, config_hints); + + // Enter module variables. + // + if (first) + { + auto& v (var_pool); + + v.insert ("config.bin.rc", true); + } + + // Configure. + // + if (first) + { + // config.bin.rc + // + // Use the target to decide on the default rc name. + // + const string& tsys (cast (r["bin.target.system"])); + const char* rc_d (tsys == "win32-msvc" ? "rc" : "windres"); + + auto p (config::required (r, + "config.bin.rc", + path (apply (r["bin.pattern"], rc_d)))); + + const path& rc (cast (p.first)); + rc_info rci (guess_rc (rc)); + + // If this is a new value (e.g., we are configuring), then print the + // report at verbosity level 2 and up (-v). + // + if (verb >= (p.second ? 2 : 3)) + { + text << "bin.rc\n" + << " exe " << rc << '\n' + << " id " << rci.id << '\n' + << " signature " << rci.signature << '\n' + << " checksum " << rci.checksum; + } + + r.assign ("bin.rc.id") = move (rci.id); + r.assign ("bin.rc.signature") = move (rci.signature); + r.assign ("bin.rc.checksum") = move (rci.checksum); } return true; -- cgit v1.1