aboutsummaryrefslogtreecommitdiff
path: root/build/bin/module.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-07-31 12:52:20 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-07-31 12:52:20 +0200
commitbbd0f3bb21442a2833916110cbe8e9a07e9f4c1f (patch)
treed25de6f2bcfa4b6cabe1fd55a1b8f508005de4c1 /build/bin/module.cxx
parent729b56300c441a0d63c7d2013eb5a881211d352b (diff)
Essential install module functionality
Diffstat (limited to 'build/bin/module.cxx')
-rw-r--r--build/bin/module.cxx56
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");
}
}
}