From 682836daacdd3dc486187c9d60479b372895a470 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 29 Jul 2017 10:32:36 +0200 Subject: Implement "see through" installation semantics for utility libraries --- build2/install/init.cxx | 16 +++++++++------- build2/install/rule.cxx | 27 ++++++++++++++++++++------- build2/install/rule.hxx | 10 ++++++++++ 3 files changed, 39 insertions(+), 14 deletions(-) (limited to 'build2/install') diff --git a/build2/install/init.cxx b/build2/install/init.cxx index 6a5114d..1d51be2 100644 --- a/build2/install/init.cxx +++ b/build2/install/init.cxx @@ -124,9 +124,6 @@ namespace build2 var_pool.rw (r).insert (string ("install.") + n + ".subdirs"); } - static const alias_rule alias_; - static const file_rule file_; - void boot (scope& r, const location&, unique_ptr&) { @@ -200,11 +197,16 @@ namespace build2 // Register our alias and file rules. // - bs.rules.insert (perform_install_id, "install.alias", alias_); - bs.rules.insert (perform_uninstall_id, "uninstall.alias", alias_); + { + const auto& ar (alias_rule::instance); + const auto& fr (file_rule::instance); - bs.rules.insert (perform_install_id, "install.file", file_); - bs.rules.insert (perform_uninstall_id, "uinstall.file", file_); + bs.rules.insert (perform_install_id, "install.alias", ar); + bs.rules.insert (perform_uninstall_id, "uninstall.alias", ar); + + bs.rules.insert (perform_install_id, "install.file", fr); + bs.rules.insert (perform_uninstall_id, "uinstall.file", fr); + } // Configuration. // diff --git a/build2/install/rule.cxx b/build2/install/rule.cxx index 8611247..f2fc233 100644 --- a/build2/install/rule.cxx +++ b/build2/install/rule.cxx @@ -38,20 +38,32 @@ namespace build2 // alias_rule // + const alias_rule alias_rule::instance; + match_result alias_rule:: match (action, target&, const string&) const { return true; } + const target* alias_rule:: + filter (action, const target& t, prerequisite_member p) const + { + return &p.search (t); + } + recipe alias_rule:: apply (action a, target& t) const { tracer trace ("install::alias_rule::apply"); - for (const prerequisite& p: group_prerequisites (t)) + for (prerequisite_member p: group_prerequisite_members (a, t)) { - const target& pt (search (t, p)); + // Let a customized rule have its say. + // + const target* pt (filter (a, t, p)); + if (pt == nullptr) + continue; // Check if this prerequisite is explicitly "not installable", // that is, there is the 'install' variable and its value is @@ -65,16 +77,15 @@ namespace build2 // // Note: not the same as lookup() above. // - auto l (pt["install"]); - + auto l ((*pt)["install"]); if (l && cast (l).string () == "false") { - l5 ([&]{trace << "ignoring " << pt;}); + l5 ([&]{trace << "ignoring " << *pt;}); continue; } - build2::match (a, pt); - t.prerequisite_targets.push_back (&pt); + build2::match (a, *pt); + t.prerequisite_targets.push_back (pt); } return default_recipe; @@ -82,6 +93,8 @@ namespace build2 // file_rule // + const file_rule file_rule::instance; + struct match_data { bool install; diff --git a/build2/install/rule.hxx b/build2/install/rule.hxx index 76259c9..ad0d8ec 100644 --- a/build2/install/rule.hxx +++ b/build2/install/rule.hxx @@ -19,6 +19,8 @@ namespace build2 class alias_rule: public rule { public: + static const alias_rule instance; + alias_rule () {} virtual match_result @@ -26,6 +28,12 @@ namespace build2 virtual recipe apply (action, target&) const override; + + // Return NULL if this prerequisite should be ignored and pointer to its + // target otherwise. The default implementation accepts all prerequsites. + // + virtual const target* + filter (action, const target&, prerequisite_member) const; }; struct install_dir; @@ -33,6 +41,8 @@ namespace build2 class file_rule: public rule { public: + static const file_rule instance; + file_rule () {} virtual match_result -- cgit v1.1