From 46a95c974de475070d0eedb07212e5c5282b66bd Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 5 Apr 2016 07:26:09 +0200 Subject: Implement --buildfile option, overrides default buildfile, supports '-' --- build2/b-options | 8 ++++++++ build2/b-options.cxx | 15 +++++++++++++++ build2/b-options.ixx | 12 ++++++++++++ build2/b.cli | 11 +++++++++++ build2/b.cxx | 5 +++-- build2/context.cxx | 3 +++ build2/file | 6 ++++-- build2/file.cxx | 19 ++++++++++++++----- 8 files changed, 70 insertions(+), 9 deletions(-) diff --git a/build2/b-options b/build2/b-options index 602ea64..b592ece 100644 --- a/build2/b-options +++ b/build2/b-options @@ -408,6 +408,12 @@ namespace build2 verbose_specified () const; const path& + buildfile () const; + + bool + buildfile_specified () const; + + const path& config_guess () const; bool @@ -460,6 +466,8 @@ namespace build2 bool q_; uint16_t verbose_; bool verbose_specified_; + path buildfile_; + bool buildfile_specified_; path config_guess_; bool config_guess_specified_; path config_sub_; diff --git a/build2/b-options.cxx b/build2/b-options.cxx index bbdbde9..cf15200 100644 --- a/build2/b-options.cxx +++ b/build2/b-options.cxx @@ -573,6 +573,8 @@ namespace build2 q_ (), verbose_ (1), verbose_specified_ (false), + buildfile_ ("buildfile"), + buildfile_specified_ (false), config_guess_ (), config_guess_specified_ (false), config_sub_ (), @@ -677,6 +679,16 @@ namespace build2 << " 6. Even more detailed information, including state dumps." << ::std::endl; os << std::endl + << "\033[1m--buildfile\033[0m \033[4mpath\033[0m The alternative file to read build information from. The" << ::std::endl + << " default is \033[1mbuildfile\033[0m. If \033[4mpath\033[0m is '\033[1m-\033[0m', then read from" << ::std::endl + << " \033[1mSTDIN\033[0m. Note that this option only affects the files read" << ::std::endl + << " as part of the buildspec processing. Specifically, it has" << ::std::endl + << " no effect on the \033[1msource\033[0m and \033[1minclude\033[0m directives. As a" << ::std::endl + << " result, this option is primarily intended for testing" << ::std::endl + << " rather than changing the build file names in real" << ::std::endl + << " projects." << ::std::endl; + + os << std::endl << "\033[1m--config-guess\033[0m \033[4mpath\033[0m The path to the \033[1mconfig.guess(1)\033[0m script that should be used" << ::std::endl << " to guess the host machine triplet. If this option is not" << ::std::endl << " specified, then \033[1mb\033[0m will fall back on to using the target it" << ::std::endl @@ -732,6 +744,9 @@ namespace build2 _cli_options_map_["--verbose"] = &::build2::cl::thunk< options, uint16_t, &options::verbose_, &options::verbose_specified_ >; + _cli_options_map_["--buildfile"] = + &::build2::cl::thunk< options, path, &options::buildfile_, + &options::buildfile_specified_ >; _cli_options_map_["--config-guess"] = &::build2::cl::thunk< options, path, &options::config_guess_, &options::config_guess_specified_ >; diff --git a/build2/b-options.ixx b/build2/b-options.ixx index ed538c9..15329dc 100644 --- a/build2/b-options.ixx +++ b/build2/b-options.ixx @@ -241,6 +241,18 @@ namespace build2 } inline const path& options:: + buildfile () const + { + return this->buildfile_; + } + + inline bool options:: + buildfile_specified () const + { + return this->buildfile_specified_; + } + + inline const path& options:: config_guess () const { return this->config_guess_; diff --git a/build2/b.cli b/build2/b.cli index 9144acf..013a756 100644 --- a/build2/b.cli +++ b/build2/b.cli @@ -220,6 +220,17 @@ namespace build2 \li|Even more detailed information, including state dumps.||" } + path --buildfile = "buildfile" + { + "", + "The alternative file to read build information from. The default is + \cb{buildfile}. If is '\cb{-}', then read from \cb{STDIN}. Note + that this option only affects the files read as part of the buildspec + processing. Specifically, it has no effect on the \cb{source} and + \cb{include} directives. As a result, this option is primarily intended + for testing rather than changing the build file names in real projects." + } + path --config-guess { "", diff --git a/build2/b.cxx b/build2/b.cxx index f9c3683..313fe95 100644 --- a/build2/b.cxx +++ b/build2/b.cxx @@ -786,12 +786,13 @@ main (int argc, char* argv[]) trace << " src_root: " << src_root; } - path bf (src_base / path ("buildfile")); + const path& bfn (ops.buildfile ()); + path bf (bfn.string () != "-" ? src_base / bfn : bfn); // If we were guessing src_base, check that the buildfile // exists and if not, issue more detailed diagnostics. // - if (guessing && !file_exists (bf)) + if (guessing && bf.string () != "-" && !file_exists (bf)) fail << bf << " does not exist" << info << "consider explicitly specifying src_base " << "for " << tn; diff --git a/build2/context.cxx b/build2/context.cxx index 941f98a..6317476 100644 --- a/build2/context.cxx +++ b/build2/context.cxx @@ -406,6 +406,9 @@ namespace build2 string diag_relative (const path& p) { + if (p.string () == "-") + return ""; + const path& b (*relative_base); if (p.absolute ()) diff --git a/build2/file b/build2/file index b198557..00ece85 100644 --- a/build2/file +++ b/build2/file @@ -49,11 +49,13 @@ namespace build2 dir_path find_out_root (const dir_path&, bool* src = nullptr); + // If buildfile is '-', then read from STDIN. + // void source (const path& buildfile, scope& root, scope& base); - // As above but first check if this buildfile has already been - // sourced for the base scope. + // As above but first check if this buildfile has already been sourced for + // the base scope. // void source_once (const path& buildfile, scope& root, scope& base); diff --git a/build2/file.cxx b/build2/file.cxx index 10461c4..b735cab 100644 --- a/build2/file.cxx +++ b/build2/file.cxx @@ -5,6 +5,7 @@ #include #include +#include // cin #include @@ -80,16 +81,24 @@ namespace build2 try { - ifstream ifs (bf.string ()); - if (!ifs.is_open ()) - fail << "unable to open " << bf; + bool sin (bf.string () == "-"); - ifs.exceptions (ifstream::failbit | ifstream::badbit); + ifstream ifs; + if (!sin) + { + ifs.open (bf.string ()); + + if (!ifs.is_open ()) + fail << "unable to open " << bf; + } + + istream& is (sin ? std::cin : ifs); + is.exceptions (ifstream::failbit | ifstream::badbit); l5 ([&]{trace << "sourcing " << bf;}); parser p (boot); - p.parse_buildfile (ifs, bf, root, base); + p.parse_buildfile (is, bf, root, base); } catch (const ifstream::failure&) { -- cgit v1.1