diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2023-04-06 22:54:43 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2023-04-11 17:35:40 +0300 |
commit | 9abe5e449cc3dab0715ebc86de2a86e6cb8ecc63 (patch) | |
tree | 83f4126eeac2ee7b8d1d162836f40ebf303f1b7a | |
parent | 1a795ad9f5b8fe368a1e597c1bfb12fa112d2101 (diff) |
Add support for bbot.sys-install step in worker
-rw-r--r-- | bbot/worker/worker.cxx | 586 | ||||
-rw-r--r-- | doc/manual.cli | 270 | ||||
-rw-r--r-- | tests/integration/testscript | 80 |
3 files changed, 874 insertions, 62 deletions
diff --git a/bbot/worker/worker.cxx b/bbot/worker/worker.cxx index 98c17d4..e8c6af7 100644 --- a/bbot/worker/worker.cxx +++ b/bbot/worker/worker.cxx @@ -225,10 +225,17 @@ enum class step_id bpkg_bindist_archive, // Note that this step is considered disabled unless one of the - // bpkg_bindist_* steps is explicitly enabled. + // bpkg_bindist_* steps is explicitly enabled. Note: not a breakpoint. // bbot_sys_install, + bbot_sys_install_apt_get_update, + bbot_sys_install_apt_get_install, + bbot_sys_install_dnf_install, + bbot_sys_install_tar_extract, + + bbot_sys_install_ldconfig, // Note: disabled by default. + // Note: skipped for modules. // b_test_installed_create, //: b_create @@ -267,7 +274,8 @@ enum class step_id bpkg_uninstall, - bbot_sys_uninstall, + bbot_sys_uninstall_apt_get_remove, + bbot_sys_uninstall_dnf_remove, end }; @@ -300,7 +308,6 @@ static const strings step_id_str { "bpkg.test-separate.test", "bpkg.install", - "bbot.install.ldconfig", "bpkg.bindist.debian", @@ -308,6 +315,11 @@ static const strings step_id_str { "bpkg.bindist.archive", "bbot.sys-install", + "bbot.sys-install.apt-get.update", + "bbot.sys-install.apt-get.install", + "bbot.sys-install.dnf.install", + "bbot.sys-install.tar.extract", + "bbot.sys-install.ldconfig", "b.test-installed.create", "b.test-installed.configure", @@ -332,7 +344,8 @@ static const strings step_id_str { "bpkg.uninstall", - "bbot.sys-uninstall", + "bbot.sys-uninstall.apt-get.remove", + "bbot.sys-uninstall.dnf.remove", "end"}; @@ -641,7 +654,9 @@ run_bpkg (step_id step, { return run_cmd (step, t, - log, nullptr /* out */, path () /* out_file */, warn_detect, + log, + nullptr /* out_str */, path () /* out_file */, + warn_detect, "bpkg " + cmd, bkp_step, bkp_status, last_cmd, process_env ("bpkg", envvars), @@ -683,7 +698,7 @@ run_bpkg (step_id step, { return run_cmd (step, t, - log, nullptr /* out_file */, out, warn_detect, + log, nullptr /* out_str */, out, warn_detect, "bpkg " + cmd, bkp_step, bkp_status, last_cmd, process_env ("bpkg", envvars), @@ -826,6 +841,88 @@ run_ldconfig (step_id step, "ldconfig", forward<A> (a)...); } +template <typename... A> +static result_status +run_apt_get (step_id step, + tracer& t, + string& log, const regexes& warn_detect, + const optional<step_id>& bkp_step, + const optional<result_status>& bkp_status, + string& last_cmd, + const string& cmd, A&&... a) +{ + // Note: dumps some of its diagnostics to stdout. + // + return run_cmd (step, + t, + log, + nullptr /* out_str */, path () /* out_file*/, + warn_detect, + "sudo apt-get " + cmd, + bkp_step, bkp_status, last_cmd, + process_env ("sudo"), + "apt-get", cmd, forward<A> (a)...); +} + +template <typename... A> +static result_status +run_dnf (step_id step, + tracer& t, + string& log, const regexes& warn_detect, + const optional<step_id>& bkp_step, + const optional<result_status>& bkp_status, + string& last_cmd, + const string& cmd, A&&... a) +{ + // Note: dumps some of its diagnostics to stdout. + // + return run_cmd (step, + t, + log, + nullptr /* out_str */, path () /* out_file*/, + warn_detect, + "sudo dnf " + cmd, + bkp_step, bkp_status, last_cmd, + process_env ("sudo"), + "dnf", cmd, forward<A> (a)...); +} + +template <typename... A> +static result_status +run_tar (step_id step, + tracer& t, + string& log, const regexes& warn_detect, + const optional<step_id>& bkp_step, + const optional<result_status>& bkp_status, + string& last_cmd, + A&&... a) +{ +#ifndef _WIN32 + return run_cmd (step, + t, + log, + nullptr /* out_str */, path () /* out_file*/, + warn_detect, + "sudo tar", + bkp_step, bkp_status, last_cmd, + process_env ("sudo"), + "tar", forward<A> (a)...); +#else + // Note: using bsdtar which can unpack .zip archives (and also not an MSYS + // executable). + // + return run_cmd (step, + t, + log, + nullptr /* out_str */, path () /* out_file*/, + warn_detect, + "bsdtar", + bkp_step, bkp_status, last_cmd, + process_env ("bsdtar"), + forward<A> (a)...); +#endif +} + // Upload compressed manifest to the specified TFTP URL with curl. Issue // diagnostics and throw failed on invalid manifest or process management // errors and throw io_error for input/output errors or non-zero curl exit. @@ -1766,35 +1863,52 @@ build (size_t argc, const char* argv[]) // optional<dir_path> install_root; + // While building and running tests against the installation created + // either from source or from the archive distribution package we will + // make the bin/ subdirectory of config.install.root, if specified, the + // first entry in the PATH environment variable, except for build system + // modules which supposedly don't install any executables. + // + optional<dir_path> install_bin; + + auto config_install_root = [&step_args, &tgt_args] () -> optional<dir_path> + { + step_id s (step_id::bpkg_target_create); + step_id f1 (step_id::b_create); + step_id f2 (step_id::bpkg_create); + + size_t n (19); + auto space = [] (char c) {return c == ' ' || c == '\t';}; + + for (const char* a: reverse_iterate (step_args (tgt_args, s, f1, f2))) + { + if (strncmp (a, "config.install.root", n) == 0 && + (a[n] == '=' || space (a[n]))) + { + while (space (a[n])) ++n; // Skip spaces. + if (a[n] == '=') ++n; // Skip the equal sign. + while (space (a[n])) ++n; // Skip spaces. + + // Note that the config.install.root variable value may potentially + // be quoted. + // + return dir_path (unquote (a + n)); + } + } + + return nullopt; + }; + if ((target_pkg || selfhost) && !bindist && !step_disabled (step_id::bpkg_install)) { if (!module_pkg) { - step_id s (step_id::bpkg_target_create); - step_id f1 (step_id::b_create); - step_id f2 (step_id::bpkg_create); - - size_t n (19); - auto space = [] (char c) {return c == ' ' || c == '\t';}; - - for (const char* a: reverse_iterate (step_args (tgt_args, s, f1, f2))) - { - if (strncmp (a, "config.install.root", n) == 0 && - (a[n] == '=' || space (a[n]))) - { - while (space (a[n])) ++n; // Skip spaces. - if (a[n] == '=') ++n; // Skip the equal sign. - while (space (a[n])) ++n; // Skip spaces. + install_root = config_install_root (); - // Note that the config.install.root variable value may potentially - // be quoted. - // - install_root = dir_path (unquote (a + n)); - break; - } - } + if (install_root) + install_bin = *install_root / dir_path ("bin"); } else install_root = dir_path (); @@ -3353,6 +3467,8 @@ build (size_t argc, const char* argv[]) // if (install_root) { + // Make install_conf refer to the actual configuration directory. + // install_conf = rwd / (create_install ? install_conf : main_pkg_conf); operation_result& r (add_result ("install")); @@ -3479,6 +3595,13 @@ build (size_t argc, const char* argv[]) change_wd (trace, &r.log, rwd); + // Note that for a host or module package we don't need the target + // configuration anymore, if present. So let's free up the space a + // little bit. + // + if (!target_pkg && create_target) + rm_r (trace, &r.log, rwd / target_conf); + const dir_path& bindist_conf ( create_install ? install_conf : main_pkg_conf); @@ -3689,6 +3812,8 @@ build (size_t argc, const char* argv[]) for (const bindist_file& f: bindist_result.package.files) log_line (" " + f.path.string (), r.log); + + rm.status |= r.status; } // // Fail if the breakpoint refers to a bpkg.bindist.* step but this step @@ -3703,6 +3828,260 @@ build (size_t argc, const char* argv[]) break; } + // Install from the binary distribution package generated on a + // bpkg.bindist.* step. + // + if (sys_install) + { + operation_result& r (add_result ("sys-install")); + + // Fail if the breakpoint refers to the bbot.sys-install step since + // it has no specific command associated. + // + if (bkp_step && *bkp_step == step_id::bbot_sys_install) + { + fail_unreached_breakpoint (add_result ("sys-install")); + break; + } + + // Noop, just for the log record. + // + change_wd (trace, &r.log, rwd); + + // Collect the binary package files. + // + // Specifically, for now we consider files with the system name + // specified as package files. + // + cstrings pfs; + + auto add_package_files = [&pfs] (const vector<bindist_file>& bfs) + { + for (const bindist_file& f: bfs) + { + if (!f.system_name.empty ()) + pfs.push_back (f.path.string ().c_str ()); + } + }; + + add_package_files (bindist_result.package.files); + + for (const bindist_package& d: bindist_result.dependencies) + add_package_files (d.files); + + // Install for the `debian` distribution. + // + if (*bindist == step_id::bpkg_bindist_debian) + { + // Update package index. + // + { + // sudo apt-get update <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // + step_id b (step_id::bbot_sys_install_apt_get_update); + step_id s (step_id::bbot_sys_install_apt_get_update); + + r.status |= run_apt_get ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + "update", + "--assume-yes", + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s)); + + if (!r.status) + break; + } + + // Install. + // + { + // sudo apt-get install <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // <distribution-package-file>... + // + // Note that apt-get install requires a directory separator for an + // argument to be treated as a file rather than name. The paths we + // pass are absolute. + // + step_id b (step_id::bbot_sys_install_apt_get_install); + step_id s (step_id::bbot_sys_install_apt_get_install); + + r.status |= run_apt_get ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + "install", + "--assume-yes", + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s), + pfs); + + if (!r.status) + break; + } + } + // + // Fail if the breakpoint refers to a bbot.sys-install.apt_get.* step + // but the distribution is other than `debian`. + // + else if (bkp_step && + *bkp_step >= step_id::bbot_sys_install_apt_get_update && + *bkp_step <= step_id::bbot_sys_install_apt_get_install) + { + fail_unreached_breakpoint (r); + break; + } + // + // Install for the `fedora` distribution. + // + else if (*bindist == step_id::bpkg_bindist_fedora) + { + // sudo dnf install <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // <distribution-package-file>... + // + step_id b (step_id::bbot_sys_install_dnf_install); + step_id s (step_id::bbot_sys_install_dnf_install); + + r.status |= run_dnf ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + "install", + "--refresh", + "--assumeyes", + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s), + pfs); + + if (!r.status) + break; + } + // + // Fail if the breakpoint refers to a bbot.sys-install.dnf.* step but + // the distribution is other than `fedora`. + // + else if (bkp_step && *bkp_step == step_id::bbot_sys_install_dnf_install) + { + fail_unreached_breakpoint (r); + break; + } + // + // Install for the `archive` distribution. + // + // Since there is no easy way to extract from multiple archives with a + // single command, we run tar in a loop. + // + // Note that it is assumed that the --directory and --strip-components + // options are passed via <*-config-args>. The extracted executables + // can be arranged to be found by setting config.install.root for + // bpkg.target.create, etc (the same way as for installing from + // source). + // + else if (*bindist == step_id::bpkg_bindist_archive) + { + for (const char* f: pfs) + { + // [sudo] tar -xf <distribution-package-file> <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // + step_id b (step_id::bbot_sys_install_tar_extract); + step_id s (step_id::bbot_sys_install_tar_extract); + + r.status |= run_tar ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + "-xf", + f, + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s)); + + if (!r.status) + break; + } + + if (!r.status) + break; + + // Run ldconfig. + // + if (step_enabled (step_id::bbot_sys_install_ldconfig)) + { + // sudo ldconfig <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // + step_id b (step_id::bbot_sys_install_ldconfig); + step_id s (step_id::bbot_sys_install_ldconfig); + + r.status |= run_ldconfig ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s)); + + if (!r.status) + break; + } + // + // Fail if the breakpoint refers to the bbot.sys-install.ldconfig + // step but this step is disabled. + // + else if (bkp_step && *bkp_step == step_id::bbot_sys_install_ldconfig) + { + fail_unreached_breakpoint (r); + break; + } + + if (!module_pkg) + { + if (optional<dir_path> ir = config_install_root ()) + install_bin = *ir / dir_path ("bin"); + } + } + // + // Fail if the breakpoint refers to a + // bbot.sys-install.{tar.extract,ldconfig} step but the distribution + // is other than `archive`. + // + else if (bkp_step && + *bkp_step >= step_id::bbot_sys_install_tar_extract && + *bkp_step <= step_id::bbot_sys_install_ldconfig) + { + fail_unreached_breakpoint (r); + break; + } + else + assert (false); + + rm.status |= r.status; + } + // + // Fail if the breakpoint refers to a bbot.sys-install.* step but this + // step is disabled. + // + else if (bkp_step && + *bkp_step >= step_id::bbot_sys_install && + *bkp_step <= step_id::bbot_sys_install_ldconfig) + { + fail_unreached_breakpoint (add_result ("sys-install")); + break; + } + // Now, if the package is installed, either from source or from the // binary distribution package, the overall plan is as follows: // @@ -3714,7 +4093,7 @@ build (size_t argc, const char* argv[]) // and test them in a separate bpkg configuration(s) against the // installed package. // - if (install_root /*|| sys_install */) // @@ TMP + if (install_root || sys_install) { // Run the internal tests if the project contains "testable" // subprojects, but not for a module. @@ -3723,10 +4102,24 @@ build (size_t argc, const char* argv[]) dir_paths subprj_dirs; // "Testable" package subprojects. + // Collect the "testable" subprojects. + // if (!module_pkg) { - // Collect the "testable" subprojects. + // Make install_conf refer to the actual configuration directory, if + // not yet. // + if (sys_install) + install_conf = rwd / (create_install ? install_conf : main_pkg_conf); + + assert (!rm.results.empty ()); + + // Result of the install or sys-install operation. + // + operation_result& r (rm.results.back ()); + + change_wd (trace, &r.log, install_conf); + for (const b_project_info::subproject& sp: prj.subprojects) { // Retrieve the subproject information similar to how we've done it @@ -3757,13 +4150,13 @@ build (size_t argc, const char* argv[]) // small_vector<string, 1> envvars; - if (!module_pkg && install_root) + if (install_bin) { // Note that we add the $config.install.root/bin directory at the // beginning of the PATH environment variable value, so the // installed executables are found first. // - string paths ("PATH=" + (*install_root / "bin").string ()); + string paths ("PATH=" + install_bin->string ()); if (optional<string> s = getenv ("PATH")) { @@ -4419,8 +4812,6 @@ build (size_t argc, const char* argv[]) fail_unreached_breakpoint (r); break; } - - rm.status |= r.status; } // // Fail if the breakpoint refers to some of the @@ -4434,6 +4825,8 @@ build (size_t argc, const char* argv[]) fail_unreached_breakpoint (r); break; } + + rm.status |= r.status; } // // Fail if the breakpoint refers to some of the test installed steps @@ -4456,7 +4849,130 @@ build (size_t argc, const char* argv[]) *bkp_step >= step_id::b_test_installed_create && *bkp_step <= step_id::bpkg_test_separate_installed_test) { - fail_unreached_breakpoint (add_result ("install")); + fail_unreached_breakpoint (add_result ("test-install")); + break; + } + + // Uninstall, if installed from the binary distribution package. + // + // Note: noop for the archive distribution. + // + if (sys_install && + (*bindist == step_id::bpkg_bindist_debian || + *bindist == step_id::bpkg_bindist_fedora)) + { + operation_result& r (add_result ("sys-uninstall")); + + // Noop, just for the log record. + // + change_wd (trace, &r.log, rwd); + + // Collect the binary package system names. + // + cstrings pns; + + auto add_package_names = [&pns] (const vector<bindist_file>& bfs) + { + for (const bindist_file& f: bfs) + { + if (!f.system_name.empty ()) + pns.push_back (f.system_name.c_str ()); + } + }; + + add_package_names (bindist_result.package.files); + + for (const bindist_package& d: bindist_result.dependencies) + add_package_names (d.files); + + // Uninstall for the `debian` distribution. + // + if (*bindist == step_id::bpkg_bindist_debian) + { + // sudo apt-get remove <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // <distribution-package-name>... + // + step_id b (step_id::bbot_sys_uninstall_apt_get_remove); + step_id s (step_id::bbot_sys_uninstall_apt_get_remove); + + r.status |= run_apt_get ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + "remove", + "--assume-yes", + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s), + pns); + + if (!r.status) + break; + } + // + // Fail if the breakpoint refers to the + // bbot.sys-uninstall.apt-get.remove step but the distribution is + // other than `debian`. + // + else if (bkp_step && + *bkp_step == step_id::bbot_sys_uninstall_apt_get_remove) + { + fail_unreached_breakpoint (r); + break; + } + // + // Uninstall for the `fedora` distribution. + // + else if (*bindist == step_id::bpkg_bindist_fedora) + { + // sudo dnf remove <env-config-args> + // <tgt-config-args> + // <pkg-config-args> + // <distribution-package-name>... + // + step_id b (step_id::bbot_sys_uninstall_dnf_remove); + step_id s (step_id::bbot_sys_uninstall_dnf_remove); + + r.status |= run_dnf ( + b, + trace, r.log, wre, + bkp_step, bkp_status, last_cmd, + "remove", + "--assumeyes", + step_args (env_args, s), + step_args (tgt_args, s), + step_args (pkg_args, s), + pns); + + if (!r.status) + break; + } + // + // Fail if the breakpoint refers to the bbot.sys-uninstall.dnf.remove + // step but the distribution is other than `fedora`. + // + else if (bkp_step && + *bkp_step == step_id::bbot_sys_uninstall_dnf_remove) + { + fail_unreached_breakpoint (r); + break; + } + else + assert (false); + + rm.status |= r.status; + } + // + // Fail if the breakpoint refers to a bbot.sys-uninstall.* step but + // this step is disabled. + // + else if (bkp_step && + *bkp_step >= step_id::bbot_sys_uninstall_apt_get_remove && + *bkp_step <= step_id::bbot_sys_uninstall_dnf_remove) + { + fail_unreached_breakpoint (add_result ("sys-uninstall")); break; } diff --git a/doc/manual.cli b/doc/manual.cli index 5c76c32..2f6d660 100644 --- a/doc/manual.cli +++ b/doc/manual.cli @@ -1067,6 +1067,14 @@ bpkg -v update <package-name> # bpkg.install # bpkg -v install <package-name> + + # If bbot.install.ldconfig step is enabled: + # + { + # bbot.install.ldconfig + # + sudo ldconfig + } } # If bpkg.bindist.{debian,fedora,archive} step is enabled: @@ -1079,6 +1087,51 @@ bpkg -v update <package-name> <package-name> } +# If bbot.sys-install step is enabled: +# +{ + # If <distribution> is 'debian': + # + { + # bbot.sys-install.apt-get.update + # + sudo apt-get update + + # bbot.sys-install.apt-get.install + # + sudo apt-get install <distribution-package-file>... + } + # + # Otherwise, if <distribution> is 'fedora': + # + { + # bbot.sys-install.dnf.install + # + sudo dnf install <distribution-package-file>... + } + # + # Otherwise, if <distribution> is 'archive': + # + { + # For each package file: + # + { + # bbot.sys-install.tar.extract + # + [sudo] tar -xf <distribution-package-file> \\ + <env-config-args> <tgt-config-args> <pkg-config-args> + } + + # If bbot.sys-install.ldconfig step is enabled: + # + { + # bbot.sys-install.ldconfig + # + sudo ldconfig + } + } +} + # If the main package is installed either from source or from the # binary distribution package: # @@ -1152,6 +1205,32 @@ bpkg -v update <package-name> } } +# If the main package is installed from the binary distribution package: +# +{ + # If <distribution> is 'debian': + # + { + # bbot.sys-uninstall.apt-get.remove + # + sudo apt-get remove <distribution-package-name>... + } + # + # Otherwise, if <distribution> is 'fedora': + # + { + # bbot.sys-uninstall.dnf.remove + # + sudo dnf remove <distribution-package-name>... + } + # + # Otherwise, if <distribution> is 'archive': + # + { + # Noop. + } +} + # If the main package is installed from source: # { @@ -1342,6 +1421,14 @@ bpkg -v update -d <host-conf> <package-name> # bpkg.install # bpkg -v install -d <install-conf> <package-name> + + # If bbot.install.ldconfig step is enabled: + # + { + # bbot.install.ldconfig + # + sudo ldconfig + } } # If configuration is self-hosted and @@ -1355,6 +1442,51 @@ bpkg -v update -d <host-conf> <package-name> <package-name> } +# If bbot.sys-install step is enabled: +# +{ + # If <distribution> is 'debian': + # + { + # bbot.sys-install.apt-get.update + # + sudo apt-get update + + # bbot.sys-install.apt-get.install + # + sudo apt-get install <distribution-package-file>... + } + # + # Otherwise, if <distribution> is 'fedora': + # + { + # bbot.sys-install.dnf.install + # + sudo dnf install <distribution-package-file>... + } + # + # Otherwise, if <distribution> is 'archive': + # + { + # For each package file: + # + { + # bbot.sys-install.tar.extract + # + [sudo] tar -xf <distribution-package-file> \\ + <env-config-args> <tgt-config-args> <pkg-config-args> + } + + # If bbot.sys-install.ldconfig step is enabled: + # + { + # bbot.sys-install.ldconfig + # + sudo ldconfig + } + } +} + # If the main package is installed either from source or from the # binary distribution package: # @@ -1476,6 +1608,32 @@ bpkg -v update -d <host-conf> <package-name> } } +# If the main package is installed from the binary distribution package: +# +{ + # If <distribution> is 'debian': + # + { + # bbot.sys-uninstall.apt-get.remove + # + sudo apt-get remove <distribution-package-name>... + } + # + # Otherwise, if <distribution> is 'fedora': + # + { + # bbot.sys-uninstall.dnf.remove + # + sudo dnf remove <distribution-package-name>... + } + # + # Otherwise, if <distribution> is 'archive': + # + { + # Noop. + } +} + # If the main package is installed from source: # { @@ -1639,6 +1797,14 @@ bpkg -v update -d <module-conf> <package-name> # bpkg.install # bpkg -v install -d <install-conf> <package-name> + + # If bbot.install.ldconfig step is enabled: + # + { + # bbot.install.ldconfig + # + sudo ldconfig + } } # If configuration is self-hosted and @@ -1652,6 +1818,51 @@ bpkg -v update -d <module-conf> <package-name> <package-name> } +# If bbot.sys-install step is enabled: +# +{ + # If <distribution> is 'debian': + # + { + # bbot.sys-install.apt-get.update + # + sudo apt-get update + + # bbot.sys-install.apt-get.install + # + sudo apt-get install <distribution-package-file>... + } + # + # Otherwise, if <distribution> is 'fedora': + # + { + # bbot.sys-install.dnf.install + # + sudo dnf install <distribution-package-file>... + } + # + # Otherwise, if <distribution> is 'archive': + # + { + # For each package file: + # + { + # bbot.sys-install.tar.extract + # + [sudo] tar -xf <distribution-package-file> \\ + <env-config-args> <tgt-config-args> <pkg-config-args> + } + + # If bbot.sys-install.ldconfig step is enabled: + # + { + # bbot.sys-install.ldconfig + # + sudo ldconfig + } + } +} + # If the main package is installed either from source or from the # binary distribution package: # @@ -1725,6 +1936,32 @@ bpkg -v update -d <module-conf> <package-name> } } +# If the main package is installed from the binary distribution package: +# +{ + # If <distribution> is 'debian': + # + { + # bbot.sys-uninstall.apt-get.remove + # + sudo apt-get remove <distribution-package-name>... + } + # + # Otherwise, if <distribution> is 'fedora': + # + { + # bbot.sys-uninstall.dnf.remove + # + sudo dnf remove <distribution-package-name>... + } + # + # Otherwise, if <distribution> is 'archive': + # + { + # Noop. + } +} + # If the main package is installed from source: # { @@ -1798,7 +2035,7 @@ to the \c{buildtab} configuration file. Blank lines and lines that start with <tgt-config-arg> = [[+|-]<prefix>:](<variable>|<option>) | \\ (+|-)<prefix>: -<prefix> = <tool>[.<phase>][.<operation>[.<command>]] +<prefix> = <tool>[.<cfg-type>][.<phase>][.<operation>[.<command>]] \ Where \c{<machine-pattern>} is filesystem wildcard pattern that is matched @@ -1850,12 +2087,20 @@ bpkg.install # Disabled by default. # +bbot.install.ldconfig + +# Disabled by default. +# bpkg.bindist.{debian,fedora,archive} # Disabled if bpkg.bindist.* is disabled. # bbot.sys-install +# Disabled by default. +# +bbot.sys-install.ldconfig + b.test-installed.test bpkg.test-separate-installed.update bpkg.test-separate-installed.test @@ -1952,12 +2197,14 @@ linux*-gcc_8 linux-gcc_8 x86_64-linux-gnu \"all gcc-8+:gcc-7+\" If the \c{<tgt-config-arg>} list contains the \c{config.install.root} variable that applies to the \c{bpkg.create} step, then in addition to building and possibly running tests, the \c{bbot} worker will also test installing and -uninstalling each package. Furthermore, if the package contains subprojects -that support the test operation and/or refers to other packages via the -\c{tests}, \c{examples}, or \c{benchmarks} manifest values which are not -excluded by the \c{bbot} controller, then the worker will additionally build -such subprojects/packages against the installation and run their tests (test -installed and test separate installed phases). +uninstalling each package (unless replaced with the \c{bbot.sys-install} +step). Furthermore, if the package contains subprojects that support the test +operation and/or refers to other packages via the \c{tests}, \c{examples}, or +\c{benchmarks} manifest values which are not excluded by the \c{bbot} +controller, then the worker will additionally build such subprojects/packages +against the installation (created either from source or from the binary +distribution package) and run their tests (test installed and test separate +installed phases). Two types of installations can be tested: \i{system} and \i{private}. A system installation uses a well-known location, such as \c{/usr} or \c{/usr/local}, @@ -1977,10 +2224,11 @@ linux*-gcc* linux-gcc-sysinstall x86_64-linux-gnu \"all default gcc\" config.ins linux*-gcc* linux-gcc-prvinstall x86_64-linux-gnu \"all default gcc\" config.install.root=/tmp/install config.cc.poptions=-I/tmp/install/include config.cc.loptions=-L/tmp/install/lib config.bin.rpath=/tmp/install/lib \ -Note also that while building and running tests against the installation the -worker makes the \c{bin} subdirectory of \c{config.install.root} the first -entry in the \c{PATH} environment variable, except for build system modules -which supposedly don't install any executables. +Note also that while building and running tests against the installation +created either from source or from the archive distribution package the worker +makes the \c{bin} subdirectory of \c{config.install.root} the first entry in +the \c{PATH} environment variable, except for build system modules which +supposedly don't install any executables. The \c{bbot} controller normally issues the build task by picking an unbuilt package configuration and one of the produced (via the machine names match) diff --git a/tests/integration/testscript b/tests/integration/testscript index 9488691..597a10f 100644 --- a/tests/integration/testscript +++ b/tests/integration/testscript @@ -51,6 +51,18 @@ controller = https://stage.build2.org/?build-task wait = 1 # Seconds. controller = --fake-request ../task --dump-result +# Note that we also need to make sure that the installed package libraries are +# properly imported when configuring and running tests, and that the installed +# executables are runnable. +# +config = "bpkg.create:config.install.root=\"'$~/install'\" \ +bpkg.configure.fetch:--fetch-timeout=60 \ +bpkg.global.configure.build:--fetch-timeout=60 \ +bpkg.create:config.bin.rpath=\"'$~/install/lib'\" \ +config.cc.coptions=-Wall \ +b.test-installed.configure:\"config.cc.loptions=-L'$~/install/lib'\" \ +bpkg.test-separate-installed.create:\"config.cc.loptions=-L'$~/install/lib'\"" + pkg = libhello ver = 1.0.0+10 #rep_url = "https://git.build2.org/hello/libhello.git#1.0" @@ -63,7 +75,23 @@ rfp = yes #package_config = 'package-config: +bbot.install.ldconfig:' #package_config = 'package-config: -bpkg.install:' +#\ +package_config = "package-config: +\\ ++bpkg.bindist.archive:--archive-build-meta= +bpkg.bindist.archive:config.install.relocatable=true + +bbot.sys-install.tar.extract:--directory=$~ +bbot.sys-install.tar.extract:--strip-components=1 +b.test-installed.configure:config.cc.loptions='-L$~/usr/local/lib' +bpkg.test-separate-installed.create:config.cc.loptions='-L$~/usr/local/lib' + +bpkg.create:config.bin.rpath=[null] +\\" +config = "$config bpkg.create:config.install.root=\"'$~/usr/local'\"" ++export LD_LIBRARY_PATH="$~/usr/local/lib:$getenv('LD_LIBRARY_PATH')" +#\ #\ package_config = 'package-config: \ @@ -71,9 +99,6 @@ package_config = 'package-config: bpkg.create:config.bin.rpath=[null] \' #\ - -#+bpkg.bindist.archive:--archive-lang=cc=gcc11 - #\ package_config = 'package-config:\ bpkg.configure.fetch:--fetch-timeout=120 -bpkg.install: @@ -141,6 +166,17 @@ host = 'host: true' #package_config = 'package-config: config.libbuild2-kconfig.develop=true' #package_config = 'package-config: -bpkg.install:' #\ +package_config = "package-config: +\\ ++bpkg.bindist.archive:--archive-build-meta= +bbot.sys-install.tar.extract:--directory=$~ +bbot.sys-install.tar.extract:--strip-components=1 +bpkg.create:config.bin.rpath=[null] +\\" +config = "$config bpkg.create:config.install.root=\"'$~/usr/local'\"" ++export LD_LIBRARY_PATH="$~/usr/local/lib:$getenv('LD_LIBRARY_PATH')" +#\ +#\ package_config = 'package-config: \ +bpkg.bindist.fedora: @@ -197,7 +233,17 @@ tests="tests: * cli-tests == $ver examples: * cli-examples == $ver" host='host: true' #\ -#package_config = 'package-config: -bpkg.install:' +#\ +package_config = "package-config: +\\ ++bpkg.bindist.archive:--archive-build-meta= +bbot.sys-install.tar.extract:--directory=$~ +bbot.sys-install.tar.extract:--strip-components=1 +bpkg.create:config.bin.rpath=[null] +\\" +config = "$config bpkg.create:config.install.root=\"'$~/usr/local'\"" ++export LD_LIBRARY_PATH="$~/usr/local/lib:$getenv('LD_LIBRARY_PATH')" +#\ #\ package_config = 'package-config: \ @@ -206,6 +252,7 @@ bpkg.create:config.bin.rpath=[null] \' #\ #package_config = 'package-config: ?libcutl +{ config.libcutl.develop=true }' +#package_config = 'package-config: -bpkg.install:' #\ pkg = libxsd @@ -232,6 +279,18 @@ examples: * xsd-examples == $ver" host='host: true' #\ #\ +package_config = "package-config: +\\ +?sys:libxerces-c --sys-install --sys-yes ++bpkg.bindist.archive:--archive-build-meta= +bbot.sys-install.tar.extract:--directory=$~ +bbot.sys-install.tar.extract:--strip-components=1 +bpkg.create:config.bin.rpath=[null] +\\" +config = "$config bpkg.create:config.install.root=\"'$~/usr/local'\"" ++export LD_LIBRARY_PATH="$~/usr/local/lib:$getenv('LD_LIBRARY_PATH')" +#\ +#\ package_config = 'package-config: \ ?sys:libxerces-c --sys-install --sys-yes @@ -299,18 +358,6 @@ rep_type = git rfp = yes #\ -# Note that we also need to make sure that the installed package libraries are -# properly imported when configuring and running tests, and that the installed -# executables are runnable. -# -config = "bpkg.create:config.install.root=\"'$~/install'\" \ -bpkg.configure.fetch:--fetch-timeout=60 \ -bpkg.global.configure.build:--fetch-timeout=60 \ -bpkg.create:config.bin.rpath=\"'$~/install/lib'\" \ -config.cc.coptions=-Wall \ -b.test-installed.configure:\"config.cc.loptions=-L'$~/install/lib'\" \ -bpkg.test-separate-installed.create:\"config.cc.loptions=-L'$~/install/lib'\"" - #interactive="interactive: b.test-installed.configure" #interactive="interactive: warning" @@ -379,5 +426,6 @@ a = $0 &?dist/*** &?redist/*** &?bindist/*** \ &?dist-install/*** &?redist-install/*** \ &?dist-installed/*** &?redist-installed/*** \ + &?../usr/*** \ &task.manifest <| 2>| } |