diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-07-31 12:52:20 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-07-31 12:52:20 +0200 |
commit | bbd0f3bb21442a2833916110cbe8e9a07e9f4c1f (patch) | |
tree | d25de6f2bcfa4b6cabe1fd55a1b8f508005de4c1 /build/bin/module.cxx | |
parent | 729b56300c441a0d63c7d2013eb5a881211d352b (diff) |
Essential install module functionality
Diffstat (limited to 'build/bin/module.cxx')
-rw-r--r-- | build/bin/module.cxx | 56 |
1 files changed, 43 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"); } } } |