From f7a85ac1c09588b27854cef732b9e7a5e7bf6764 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 27 Sep 2021 20:58:59 +0300 Subject: Invent b.create and b.configure step ids and add support for selfhost module --- bbot/worker/worker.cxx | 147 ++++++++++++++++++++++++++++++------------------- doc/manual.cli | 11 ++-- 2 files changed, 95 insertions(+), 63 deletions(-) diff --git a/bbot/worker/worker.cxx b/bbot/worker/worker.cxx index 8dd06de..49248b1 100644 --- a/bbot/worker/worker.cxx +++ b/bbot/worker/worker.cxx @@ -153,6 +153,13 @@ catch (const system_error& e) // enum class step_id { + // Common fallbacks for bpkg_*_create/b_test_installed_create and + // bpkg_*_configure_build/b_test_installed_configure, respectively. Note: + // not breakpoints. + // + b_create, + b_configure, + // Note that bpkg_module_* options are only used if the main package is a // build system module (using just ~build2 otherwise). They also have no // fallback (build system modules are just too different to try to handle @@ -162,8 +169,8 @@ enum class step_id // steps are not fallbacks, they are always added first). // bpkg_create, // Breakpoint and base. - bpkg_target_create, //: bpkg_create - bpkg_host_create, //: bpkg_create + bpkg_target_create, //: b_create, bpkg_create + bpkg_host_create, //: b_create, bpkg_create bpkg_module_create, //: no fallback bpkg_link, @@ -181,9 +188,9 @@ enum class step_id // its external tests. // bpkg_configure_build, // Breakpoint and base. - bpkg_target_configure_build, //: bpkg_configure_build - bpkg_host_configure_build, //: bpkg_configure_build - bpkg_module_configure_build, //: bpkg_configure_build + bpkg_target_configure_build, //: b_configure, bpkg_configure_build + bpkg_host_configure_build, //: b_configure, bpkg_configure_build + bpkg_module_configure_build, //: b_configure, bpkg_configure_build bpkg_update, bpkg_test, @@ -202,8 +209,8 @@ enum class step_id // Note: skipped for modules. // - b_test_installed_create, - b_test_installed_configure, + b_test_installed_create, //: b_create + b_test_installed_configure, //: b_configure b_test_installed_test, // Note that for a host package this can involve both run-time and build- @@ -242,6 +249,9 @@ enum class step_id }; static const strings step_id_str { + "b.create", + "b.configure", + "bpkg.create", "bpkg.target.create", "bpkg.host.create", @@ -888,6 +898,7 @@ build (size_t argc, const char* argv[]) bool mod (v->second[0] != '-' && v->second.find ('=') == string::npos); if (mod && !v->first.empty () && + v->first != "b.create" && v->first != "bpkg.create" && v->first != "bpkg.target.create" && v->first != "bpkg.host.create" && @@ -903,25 +914,17 @@ build (size_t argc, const char* argv[]) } // Return command arguments for the specified step id, complementing - // *.create[_for_*] steps with un-prefixed arguments. Arguments with more - // specific prefixes come last. + // *.create[_for_*] steps with un-prefixed arguments. If no arguments are + // specified for the step then use the specified fallbacks, potentially + // both. Arguments with more specific prefixes come last. // auto step_args = [] (const std::multimap& args, step_id step, - optional fallback = nullopt) -> cstrings + optional fallback1 = nullopt, + optional fallback2 = nullopt) -> cstrings { cstrings r; - // If no arguments found for the step id, then use the fallback step id, - // if specified. - // - { - const string& s (step_id_str[static_cast (step)]); - - if (args.find (s) == args.end () && fallback) - step = *fallback; - } - // Add arguments for a specified, potentially empty, prefix. // auto add_args = [&args, &r] (const string& prefix) @@ -937,6 +940,7 @@ build (size_t argc, const char* argv[]) // switch (step) { + case step_id::b_create: case step_id::bpkg_create: case step_id::bpkg_target_create: case step_id::bpkg_host_create: @@ -953,16 +957,38 @@ build (size_t argc, const char* argv[]) default: break; } - const string& s (step_id_str[static_cast (step)]); - - for (size_t n (0);; ++n) + auto add_step_args = [&add_args] (step_id step) { - n = s.find ('.', n); + const string& s (step_id_str[static_cast (step)]); - add_args (n == string::npos ? s : string (s, 0, n)); + for (size_t n (0);; ++n) + { + n = s.find ('.', n); - if (n == string::npos) - break; + add_args (n == string::npos ? s : string (s, 0, n)); + + if (n == string::npos) + break; + } + }; + + // If no arguments found for the step id, then use the fallback step + // ids, if specified. + // + if (args.find (step_id_str[static_cast (step)]) != args.end ()) + { + add_step_args (step); + } + else + { + // Note that if we ever need to specify fallback pairs with common + // ancestors, we may want to suppress duplicate ancestor step ids. + // + if (fallback1) + add_step_args (*fallback1); + + if (fallback2) + add_step_args (*fallback2); } return r; @@ -1274,9 +1300,10 @@ build (size_t argc, const char* argv[]) // if (create_target) { - step_id b (step_id::bpkg_create); // Breakpoint. - step_id s (step_id::bpkg_target_create); // Step. - step_id f (step_id::bpkg_create); // Fallback. + step_id b (step_id::bpkg_create); // Breakpoint. + step_id s (step_id::bpkg_target_create); // Step. + step_id f1 (step_id::b_create); // First fallback. + step_id f2 (step_id::bpkg_create); // Second fallback. r.status |= run_bpkg ( b, @@ -1285,9 +1312,9 @@ build (size_t argc, const char* argv[]) "-V", "create", "-d", target_conf, - step_args (modules, s, f), - step_args (env_args, s, f), - step_args (config_args, s, f)); + step_args (modules, s, f1, f2), + step_args (env_args, s, f1, f2), + step_args (config_args, s, f1, f2)); if (!r.status) break; @@ -1297,11 +1324,12 @@ build (size_t argc, const char* argv[]) // if (create_host) { - step_id b (step_id::bpkg_create); - step_id s (step_id::bpkg_host_create); - step_id f (step_id::bpkg_create); + step_id b (step_id::bpkg_create); + step_id s (step_id::bpkg_host_create); + step_id f1 (step_id::b_create); + step_id f2 (step_id::bpkg_create); - if (selfhost) + if (host_pkg && selfhost) { // bpkg create --type host // @@ -1314,9 +1342,9 @@ build (size_t argc, const char* argv[]) "-d", host_conf, "--type", "host", "--name", "host", - step_args (modules, s, f), - step_args (env_args, s, f), - step_args (config_args, s, f)); + step_args (modules, s, f1, f2), + step_args (env_args, s, f1, f2), + step_args (config_args, s, f1, f2)); if (!r.status) break; @@ -1362,7 +1390,6 @@ build (size_t argc, const char* argv[]) if (create_module) { step_id b (step_id::bpkg_create); - step_id s (step_id::bpkg_module_create); // b create() config.config.load=~build2 [ ] // @@ -1378,8 +1405,10 @@ build (size_t argc, const char* argv[]) cstrings cas; string mods; - if (module_pkg) + if (module_pkg && selfhost) { + step_id s (step_id::bpkg_module_create); + for (const string& m: step_args (modules, s)) { if (!mods.empty ()) @@ -1595,10 +1624,11 @@ build (size_t argc, const char* argv[]) host_pkg ? step_id::bpkg_host_configure_build : step_id::bpkg_module_configure_build); - step_id f (step_id::bpkg_configure_build); + step_id f1 (step_id::b_configure); + step_id f2 (step_id::bpkg_configure_build); - cstrings eas (step_args (env_args, s, f)); - cstrings cas (step_args (config_args, s, f)); + cstrings eas (step_args (env_args, s, f1, f2)); + cstrings cas (step_args (config_args, s, f1, f2)); // Main package configuration name. // @@ -2133,15 +2163,6 @@ build (size_t argc, const char* argv[]) { // Create the configuration. // - string mods; // build2 create meta-operation parameters. - - for (const string& m: step_args (modules, - step_id::b_test_installed_create)) - { - mods += mods.empty () ? ", " : " "; - mods += m; - } - // b create(, ) // // Amalgamation directory that will contain configuration subdirectory @@ -2152,6 +2173,15 @@ build (size_t argc, const char* argv[]) { step_id b (step_id::b_test_installed_create); step_id s (step_id::b_test_installed_create); + step_id f (step_id::b_create); + + string mods; // build2 create meta-operation parameters. + + for (const string& m: step_args (modules, s, f)) + { + mods += mods.empty () ? ", " : " "; + mods += m; + } r.status |= run_b ( b, @@ -2159,8 +2189,8 @@ build (size_t argc, const char* argv[]) bkp_step, bkp_status, last_cmd, "-V", "create('" + out_dir.representation () + "'" + mods + ")", - step_args (env_args, s), - step_args (config_args, s)); + step_args (env_args, s, f), + step_args (config_args, s, f)); if (!r.status) break; @@ -2177,6 +2207,7 @@ build (size_t argc, const char* argv[]) // step_id b (step_id::b_test_installed_configure); step_id s (step_id::b_test_installed_configure); + step_id f (step_id::b_configure); dir_path subprj_src_dir (exists (dist_src) ? dist_src / d @@ -2193,8 +2224,8 @@ build (size_t argc, const char* argv[]) "configure('" + subprj_src_dir.representation () + "'@'" + subprj_out_dir.representation () + "')", - step_args (env_args, s), - step_args (config_args, s)); + step_args (env_args, s, f), + step_args (config_args, s, f)); if (!r.status) break; diff --git a/doc/manual.cli b/doc/manual.cli index 10616e3..93ba6f0 100644 --- a/doc/manual.cli +++ b/doc/manual.cli @@ -1076,11 +1076,12 @@ should be used to detect warnings in the logs. The build configurations can belong to multiple classes with their names reflecting some common configuration aspects, such as the operating system, compiler, build options, etc. Predefined class names are \c{default}, \c{all}, -\c{none}, and \c{host}. The default configurations are built by default. A -configuration must also belong to the \c{all} unless it is hidden. A -configuration that is self-hosted must also belong to the \c{host} class. -Valid custom class names must contain only alpha-numeric characters, \c{_}, -\c{+}, \c{-}, and \c{.}, except as the first character for the last +\c{none}, \c{host}, and \c{build2}. The default configurations are built by +default. A configuration must also belong to the \c{all} unless it is hidden. +A configuration that is self-hosted must also belong to the \c{host} class +and, if it is also self-hosted for build system modules, to the \c{build2} +class. Valid custom class names must contain only alpha-numeric characters, +\c{_}, \c{+}, \c{-}, and \c{.}, except as the first character for the last three. Class names that start with \c{_} are reserved for the future hidden/special class functionality. -- cgit v1.1