From bbd0f3bb21442a2833916110cbe8e9a07e9f4c1f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 31 Jul 2015 12:52:20 +0200 Subject: Essential install module functionality --- build/bin/module.cxx | 56 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 13 deletions(-) (limited to 'build/bin/module.cxx') 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 #include +#include #include #include @@ -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&, 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 (); tts.insert (); tts.insert (); @@ -54,7 +55,7 @@ namespace build // Register rules. // { - auto& rs (base.rules); + auto& rs (b.rules); rs.insert (default_id, "bin.obj", obj_); rs.insert (update_id, "bin.obj", obj_); @@ -63,6 +64,8 @@ namespace build rs.insert (default_id, "bin.lib", lib_); rs.insert (update_id, "bin.lib", lib_); rs.insert (clean_id, "bin.lib", lib_); + + rs.insert (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 (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 (b, "lib"); // Install into install.lib. + + install::path (b, "lib"); // Install into install.lib. + install::mode (b, "644"); } } } -- cgit v1.1