// file : build2/dist/init.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2017 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include #include #include #include #include #include #include #include using namespace std; using namespace butl; namespace build2 { namespace dist { static const rule rule_; void boot (scope& rs, const location&, unique_ptr& mod) { tracer trace ("dist::boot"); l5 ([&]{trace << "for " << rs.out_path ();}); // Register meta-operation. // rs.meta_operations.insert (dist_id, dist); // Enter module variables. Do it during boot in case they get assigned // in bootstrap.build (which is customary for, e.g., dist.package). // auto& vp (var_pool.rw (rs)); // Note: some overridable, some not. // // config.dist.archives is a list of archive extensions that can be // optionally prefixed with a directory. If it is relative, then it is // prefixed with config.dist.root. Otherwise, the archive is written // to the absolute location. // vp.insert ("config.dist.root", true); vp.insert ("config.dist.archives", true); vp.insert ("config.dist.cmd", true); vp.insert ("dist.root"); vp.insert ("dist.cmd"); vp.insert ("dist.archives"); vp.insert ("dist", variable_visibility::target); // Flag. // Project's package name. // auto& v_d_p ( vp.insert ("dist.package", variable_visibility::project)); // Create the module. // mod.reset (new module (v_d_p)); } bool init (scope& rs, scope&, const location& l, unique_ptr&, bool first, bool, const variable_map& config_hints) { tracer trace ("dist::init"); if (!first) { warn (l) << "multiple dist module initializations"; return true; } const dir_path& out_root (rs.out_path ()); l5 ([&]{trace << "for " << out_root;}); assert (config_hints.empty ()); // We don't known any hints. // Register our wildcard rule. Do it explicitly for the alias to prevent // something like insert(dist_id, test_id) taking precedence. // rs.rules.insert (dist_id, 0, "dist", rule_); rs.rules.insert (dist_id, 0, "dist.alias", rule_); // Configuration. // // Note that we don't use any defaults for root -- the location // must be explicitly specified or we will complain if and when // we try to dist. // bool s (config::specified (rs, "dist")); // Adjust module priority so that the config.dist.* values are saved at // the end of config.build. // if (s) config::save_module (rs, "dist", INT32_MAX); // dist.root // { value& v (rs.assign ("dist.root")); if (s) { if (lookup l = config::optional (rs, "config.dist.root")) v = cast (l); // Strip abs_dir_path. } } // dist.cmd // { value& v (rs.assign ("dist.cmd")); if (s) { if (lookup l = config::required (rs, "config.dist.cmd", path ("install")).first) v = run_search (cast (l), true); } } // dist.archives // { value& v (rs.assign ("dist.archives")); if (s) { if (lookup l = config::optional (rs, "config.dist.archives")) v = *l; } } return true; } } }