From 023f1a286b7dfe80eb80a9e6924e492cf6f3f80a Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 10 May 2018 10:34:31 +0200 Subject: Implement test, update, and clean commands --- bdep/build.txx | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 bdep/build.txx (limited to 'bdep/build.txx') diff --git a/bdep/build.txx b/bdep/build.txx new file mode 100644 index 0000000..3aaed2b --- /dev/null +++ b/bdep/build.txx @@ -0,0 +1,115 @@ +// file : bdep/build.txx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include // strchr() + +#include +#include +#include + +#include + +namespace bdep +{ + template + int + cmd_build (const O& o, + void (*build) (const O&, + const shared_ptr&, + const cstrings&, + const strings&), + cli::scanner& args) + { + tracer trace ("build"); + + // Save cfg-vars with some sanity checking. + // + strings cfg_vars; + while (args.more ()) + { + const char* a (args.next ()); + + if (strchr (a , '=') == nullptr) + fail << "'" << a << "' does not look like a variable assignment"; + + cfg_vars.push_back (a); + } + + // The same ignore/load story as in sync. + // + project_packages pp ( + find_project_packages (o, + false /* ignore_packages */, + false /* load_packages */)); + + const dir_path& prj (pp.project); + + database db (open (prj, trace)); + + transaction t (db.begin ()); + configurations cfgs (find_configurations (prj, t, o)); + t.commit (); + + // If specified, verify packages are present in each configuration. + // + if (!pp.packages.empty ()) + verify_project_packages (pp, cfgs); + + // If no packages were explicitly specified, then we build all that have + // been initialized in each configuration. + // + cstrings pkgs; + + bool all (pp.packages.empty ()); + if (!all) + { + for (const package_location& p: pp.packages) + pkgs.push_back (p.name.c_str ()); + } + + // Build in each configuration skipping empty ones. + // + bool first (true); + for (const shared_ptr& c: cfgs) + { + if (c->packages.empty ()) + { + if (verb) + info << "skipping empty configuration " << *c; + + continue; + } + + // Collect packages. + // + if (all) + { + pkgs.clear (); + + for (const package_state& p: c->packages) + pkgs.push_back (p.name.c_str ()); + } + + // If we are printing multiple configurations, separate them with a + // blank line and print the configuration name/directory. + // + if (verb && cfgs.size () > 1) + { + text << (first ? "" : "\n") + << "in configuration " << *c << ':'; + + first = false; + } + + // Pre-sync the configuration to avoid triggering the build system + // hook (see sync for details). + // + cmd_sync (o, prj, c, strings () /* pkg_args */, true /* implicit */); + + build (o, c, pkgs, cfg_vars); + } + + return 0; + } +} -- cgit v1.1