From a4796d5b851dac4a546f89c282f65e320076eb10 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 27 Aug 2016 09:53:30 +0200 Subject: Clean up library export, make c and cxx modules project root only So now c and cxx modules can only be loaded in project root scope (normally root.build). Also, the c.std and cxx.std must now be set *before* loading the module to take effect. This means we won't be able to handle old buildfiles anymore but old versions of build2 should be able to handle new *.std placement. --- build2/c/init.cxx | 274 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 143 insertions(+), 131 deletions(-) (limited to 'build2/c') diff --git a/build2/c/init.cxx b/build2/c/init.cxx index c846ae1..4032e07 100644 --- a/build2/c/init.cxx +++ b/build2/c/init.cxx @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -19,24 +20,29 @@ namespace build2 { namespace c { - using cc::config_module; + using cc::compiler_info; - class module: public cc::module + class config_module: public cc::config_module { public: explicit - module (data&& d): common (move (d)), cc::module (move (d)) {} + config_module (config_data&& d) + : config_data (move (d)), cc::config_module (move (d)) {} - bool - translate_std (string&, scope&, const value&) const override; + string + translate_std (const compiler_info&, + scope&, + const string&) const override; }; - bool module:: - translate_std (string& s, scope& r, const value& val) const + using cc::module; + + string config_module:: + translate_std (const compiler_info& ci, scope& rs, const string& v) const { - const string& v (cast (val)); + string r; - if (cid == "msvc") + if (ci.id.type == "msvc") { // Standard-wise, with VC you get what you get. The question is // whether we should verify that the requested standard is provided by @@ -56,128 +62,129 @@ namespace build2 // if (v != "90") { - uint64_t cver (cast (r[x_version_major])); + uint64_t cver (ci.version.major); if ((v == "99" && cver < 16) || // Since VS2010/10.0. (v == "11" && cver < 17)) // Since VS2012/11.0. { - fail << "C" << v << " is not supported by " - << cast (r[x_signature]) << - info << "required by " << project (r) << '@' << r.out_path (); + fail << "C" << v << " is not supported by " << ci.signature << + info << "required by " << project (rs) << '@' << rs.out_path (); } } - - return false; } else { // 90 and 89 are the same standard. Translate 99 to 9x and 11 to 1x // for compatibility with older versions of the compilers. // - s = "-std="; + r = "-std="; if (v == "90") - s += "c90"; + r += "c90"; else if (v == "99") - s += "c9x"; + r += "c9x"; else if (v == "11") - s += "c1x"; + r += "c1x"; else - s += v; // In case the user specifies something like 'gnu11'. - - return true; + r += v; // In case the user specifies something like 'gnu11'. } + + return r; } bool - config_init (scope& r, - scope& b, + config_init (scope& rs, + scope& bs, const location& loc, - unique_ptr& m, - bool first, + unique_ptr& mod, + bool, bool, const variable_map& hints) { tracer trace ("c::config_init"); - l5 ([&]{trace << "for " << b.out_path ();}); + l5 ([&]{trace << "for " << bs.out_path ();}); - if (first) - { - // Load cc.core.vars so that we can cache all the cc.* variables. - // - if (!cast_false (b["cc.core.vars.loaded"])) - load_module ("cc.core.vars", r, b, loc); + // We only support root loading (which means there can only be one). + // + if (&rs != &bs) + fail (loc) << "c.config module must be loaded in project root"; - // Enter all the variables and initialize the module data. - // - auto& v (var_pool); - - cc::config_data d { - cc::lang::c, - - "c", - "c", - "gcc", - - // Note: some overridable, some not. - // - v.insert ("config.c", true), - v.insert ("config.c.poptions", true), - v.insert ("config.c.coptions", true), - v.insert ("config.c.loptions", true), - v.insert ("config.c.libs", true), - - v.insert ("c.path"), - v.insert ("c.poptions"), - v.insert ("c.coptions"), - v.insert ("c.loptions"), - v.insert ("c.libs"), - - v["cc.poptions"], - v["cc.coptions"], - v["cc.loptions"], - v["cc.libs"], - - v.insert ("c.export.poptions"), - v.insert ("c.export.coptions"), - v.insert ("c.export.loptions"), - v.insert ("c.export.libs"), - - v["cc.export.poptions"], - v["cc.export.coptions"], - v["cc.export.loptions"], - v["cc.export.libs"], - - v["cc.type"], - - v.insert ("c.std", true), - - v.insert ("c.id"), - v.insert ("c.id.type"), - v.insert ("c.id.variant"), - - v.insert ("c.version"), - v.insert ("c.version.major"), - v.insert ("c.version.minor"), - v.insert ("c.version.patch"), - v.insert ("c.version.build"), - - v.insert ("c.signature"), - v.insert ("c.checksum"), - - v.insert ("c.target"), - v.insert ("c.target.cpu"), - v.insert ("c.target.vendor"), - v.insert ("c.target.system"), - v.insert ("c.target.version"), - v.insert ("c.target.class") - }; - - assert (m == nullptr); - m.reset (new config_module (move (d))); - } + // Load cc.core.vars so that we can cache all the cc.* variables. + // + if (!cast_false (rs["cc.core.vars.loaded"])) + load_module ("cc.core.vars", rs, rs, loc); - static_cast (*m).init (r, b, loc, first, hints); + // Enter all the variables and initialize the module data. + // + auto& v (var_pool); + + cc::config_data d { + cc::lang::c, + + "c", + "c", + "gcc", + + // Note: some overridable, some not. + // + v.insert ("config.c", true), + v.insert ("config.c.poptions", true), + v.insert ("config.c.coptions", true), + v.insert ("config.c.loptions", true), + v.insert ("config.c.libs", true), + + v.insert ("c.path"), + v.insert ("c.sys_lib_dirs"), + + v.insert ("c.poptions"), + v.insert ("c.coptions"), + v.insert ("c.loptions"), + v.insert ("c.libs"), + + v["cc.poptions"], + v["cc.coptions"], + v["cc.loptions"], + v["cc.libs"], + + v.insert ("c.export.poptions"), + v.insert ("c.export.coptions"), + v.insert ("c.export.loptions"), + v.insert ("c.export.libs"), + + v["cc.export.poptions"], + v["cc.export.coptions"], + v["cc.export.loptions"], + v["cc.export.libs"], + + v["cc.type"], + + v.insert ("c.std", true), + + v.insert ("c.id"), + v.insert ("c.id.type"), + v.insert ("c.id.variant"), + + v.insert ("c.version"), + v.insert ("c.version.major"), + v.insert ("c.version.minor"), + v.insert ("c.version.patch"), + v.insert ("c.version.build"), + + v.insert ("c.signature"), + v.insert ("c.checksum"), + + v.insert ("c.target"), + v.insert ("c.target.cpu"), + v.insert ("c.target.vendor"), + v.insert ("c.target.system"), + v.insert ("c.target.version"), + v.insert ("c.target.class") + }; + + assert (mod == nullptr); + config_module* m; + mod.reset (m = new config_module (move (d))); + m->init (rs, loc, hints); return true; } @@ -195,51 +202,56 @@ namespace build2 }; bool - init (scope& r, - scope& b, + init (scope& rs, + scope& bs, const location& loc, - unique_ptr& m, - bool first, + unique_ptr& mod, + bool, bool, const variable_map& hints) { tracer trace ("c::init"); - l5 ([&]{trace << "for " << b.out_path ();}); + l5 ([&]{trace << "for " << bs.out_path ();}); + + // We only support root loading (which means there can only be one). + // + if (&rs != &bs) + fail (loc) << "c module must be loaded in project root"; // Load c.config. // - if (!cast_false (b["c.config.loaded"])) - load_module ("c.config", r, b, loc, false, hints); + if (!cast_false (rs["c.config.loaded"])) + load_module ("c.config", rs, rs, loc, false, hints); - if (first) - { - config_module& cm (*r.modules.lookup ("c.config")); + config_module& cm (*rs.modules.lookup ("c.config")); - cc::data d { - cm, + cc::data d { + cm, - "c.compile", - "c.link", - "c.install", - "c.uninstall", + "c.compile", + "c.link", + "c.install", + "c.uninstall", - cast (r[cm.x_id]), - cast (r[cm.x_target]), - cast (r[cm.x_target_system]), - cast (r[cm.x_target_class]), + cast (rs[cm.x_id]), + cast (rs[cm.x_target]), + cast (rs[cm.x_target_system]), + cast (rs[cm.x_target_class]), - cast_null (r["pkgconfig.path"]), + cm.tstd, - c::static_type, - hdr, - inc - }; + cast_null (rs["pkgconfig.path"]), + cast (rs[cm.x_sys_lib_dirs]), - assert (m == nullptr); - m.reset (new module (move (d))); - } + c::static_type, + hdr, + inc + }; - static_cast (*m).init (r, b, loc, first, hints); + assert (mod == nullptr); + module* m; + mod.reset (m = new module (move (d))); + m->init (rs, loc, hints); return true; } } -- cgit v1.1