diff options
Diffstat (limited to 'build/bin')
-rw-r--r-- | build/bin/module.cxx | 56 | ||||
-rw-r--r-- | build/bin/rule.cxx | 2 |
2 files changed, 45 insertions, 13 deletions
diff --git a/build/bin/module.cxx b/build/bin/module.cxx index 5e7888b..7dd5f00 100644 --- a/build/bin/module.cxx +++ b/build/bin/module.cxx @@ -9,6 +9,7 @@ #include <build/diagnostics> #include <build/config/utility> +#include <build/install/utility> #include <build/bin/rule> #include <build/bin/target> @@ -29,19 +30,19 @@ namespace build static const list_value libso_lib ("shared"); extern "C" void - bin_init (scope& root, - scope& base, + bin_init (scope& r, + scope& b, const location&, std::unique_ptr<module>&, bool) { tracer trace ("bin::init"); - level4 ([&]{trace << "for " << base.path ();}); + level4 ([&]{trace << "for " << b.path ();}); // Register target types. // { - auto& tts (base.target_types); + auto& tts (b.target_types); tts.insert<obja> (); tts.insert<objso> (); tts.insert<obj> (); @@ -54,7 +55,7 @@ namespace build // Register rules. // { - auto& rs (base.rules); + auto& rs (b.rules); rs.insert<obj> (default_id, "bin.obj", obj_); rs.insert<obj> (update_id, "bin.obj", obj_); @@ -63,6 +64,8 @@ namespace build rs.insert<lib> (default_id, "bin.lib", lib_); rs.insert<lib> (update_id, "bin.lib", lib_); rs.insert<lib> (clean_id, "bin.lib", lib_); + + rs.insert<lib> (install_id, "bin.lib", lib_); } // Configure. @@ -82,34 +85,61 @@ namespace build // config.bin.lib // { - auto v (base.assign ("bin.lib")); + auto v (b.assign ("bin.lib")); if (!v) - v = required (root, "config.bin.lib", "shared").first; + v = required (r, "config.bin.lib", "both").first; } // config.bin.exe.lib // { - auto v (base.assign ("bin.exe.lib")); + auto v (b.assign ("bin.exe.lib")); if (!v) - v = required (root, "config.bin.exe.lib", exe_lib).first; + v = required (r, "config.bin.exe.lib", exe_lib).first; } // config.bin.liba.lib // { - auto v (base.assign ("bin.liba.lib")); + auto v (b.assign ("bin.liba.lib")); if (!v) - v = required (root, "config.bin.liba.lib", liba_lib).first; + v = required (r, "config.bin.liba.lib", liba_lib).first; } // config.bin.libso.lib // { - auto v (base.assign ("bin.libso.lib")); + auto v (b.assign ("bin.libso.lib")); if (!v) - v = required (root, "config.bin.libso.lib", libso_lib).first; + v = required (r, "config.bin.libso.lib", libso_lib).first; } + + // Configure "installability" of our target types. + // + install::path<exe> (b, "bin"); // Install into install.bin. + + // Should shared libraries have executable bit? That depends on + // who you ask. In Debian, for example, it should not unless, it + // really is executable (i.e., has main()). On the other hand, on + // some systems, this may be required in order for the dynamic + // linker to be able to load the library. So, by default, we will + // keep it executable, especially seeing that this is also the + // behavior of autotools. At the same time, it is easy to override + // this, for example: + // + // config.install.lib.mode=644 + // + // And a library that wants to override any such overrides (e.g., + // because it does have main()) can do: + // + // libso{foo}: install.mode=755 + // + // Everyone is happy then? + // + install::path<libso> (b, "lib"); // Install into install.lib. + + install::path<liba> (b, "lib"); // Install into install.lib. + install::mode<liba> (b, "644"); } } } diff --git a/build/bin/rule.cxx b/build/bin/rule.cxx index 0a7f2ee..eefa069 100644 --- a/build/bin/rule.cxx +++ b/build/bin/rule.cxx @@ -81,6 +81,8 @@ namespace build // the exported options machinery work for the library chains. // See cxx.export.*-related code in cxx/rule.cxx for details. // + // @@ Messes up dependents count. + // for (prerequisite& p: group_prerequisites (t)) { if (p.is_a<lib> () || p.is_a<liba> () || p.is_a<libso> ()) |