diff options
-rw-r--r-- | build2/b-options.cxx | 12 | ||||
-rw-r--r-- | build2/b-options.hxx | 4 | ||||
-rw-r--r-- | build2/b-options.ixx | 6 | ||||
-rw-r--r-- | build2/b.cli | 10 | ||||
-rw-r--r-- | build2/b.cxx | 7 | ||||
-rw-r--r-- | build2/operation.cxx | 5 | ||||
-rw-r--r-- | build2/utility.cxx | 1 | ||||
-rw-r--r-- | build2/utility.hxx | 2 |
8 files changed, 40 insertions, 7 deletions
diff --git a/build2/b-options.cxx b/build2/b-options.cxx index a2fa26a..5041cf3 100644 --- a/build2/b-options.cxx +++ b/build2/b-options.cxx @@ -572,6 +572,7 @@ namespace build2 : v_ (), V_ (), progress_ (), + no_progress_ (), quiet_ (), verbose_ (1), verbose_specified_ (false), @@ -677,9 +678,12 @@ namespace build2 << " equivalent to \033[1m--verbose 3\033[0m." << ::std::endl; os << std::endl - << "\033[1m--progress\033[0m|\033[1m-p\033[0m Display build progress. Only usable when printing to a" << ::std::endl - << " terminal but can be combined with various verbosity" << ::std::endl - << " levels." << ::std::endl; + << "\033[1m--progress\033[0m|\033[1m-p\033[0m Display build progress. If printing to a terminal the" << ::std::endl + << " progress is displayed by default for low verbosity levels." << ::std::endl + << " Use \033[1m--no-progress\033[0m to suppress." << ::std::endl; + + os << std::endl + << "\033[1m--no-progress\033[0m Don't display build progress." << ::std::endl; os << std::endl << "\033[1m--quiet\033[0m|\033[1m-q\033[0m Run quietly, only printing error messages. This is" << ::std::endl @@ -806,6 +810,8 @@ namespace build2 &::build2::cl::thunk< options, bool, &options::progress_ >; _cli_options_map_["-p"] = &::build2::cl::thunk< options, bool, &options::progress_ >; + _cli_options_map_["--no-progress"] = + &::build2::cl::thunk< options, bool, &options::no_progress_ >; _cli_options_map_["--quiet"] = &::build2::cl::thunk< options, bool, &options::quiet_ >; _cli_options_map_["-q"] = diff --git a/build2/b-options.hxx b/build2/b-options.hxx index 6ae3cd9..535e70c 100644 --- a/build2/b-options.hxx +++ b/build2/b-options.hxx @@ -405,6 +405,9 @@ namespace build2 progress () const; const bool& + no_progress () const; + + const bool& quiet () const; const uint16_t& @@ -501,6 +504,7 @@ namespace build2 bool v_; bool V_; bool progress_; + bool no_progress_; bool quiet_; uint16_t verbose_; bool verbose_specified_; diff --git a/build2/b-options.ixx b/build2/b-options.ixx index af32a3d..1c99dc3 100644 --- a/build2/b-options.ixx +++ b/build2/b-options.ixx @@ -235,6 +235,12 @@ namespace build2 } inline const bool& options:: + no_progress () const + { + return this->no_progress_; + } + + inline const bool& options:: quiet () const { return this->quiet_; diff --git a/build2/b.cli b/build2/b.cli index 0426844..46cf80a 100644 --- a/build2/b.cli +++ b/build2/b.cli @@ -335,8 +335,14 @@ namespace build2 bool --progress|-p { - "Display build progress. Only usable when printing to a terminal but - can be combined with various verbosity levels." + "Display build progress. If printing to a terminal the progress is + displayed by default for low verbosity levels. Use \cb{--no-progress} + to suppress." + } + + bool --no-progress + { + "Don't display build progress." } bool --quiet|-q diff --git a/build2/b.cxx b/build2/b.cxx index 1098da9..ef8b97b 100644 --- a/build2/b.cxx +++ b/build2/b.cxx @@ -14,6 +14,7 @@ #include <iostream> // cout #include <libbutl/pager.hxx> +#include <libbutl/fdstream.hxx> // stderr_fd(), fdterm() #include <build2/types.hxx> #include <build2/utility.hxx> @@ -238,8 +239,14 @@ main (int argc, char* argv[]) fail << e; } + // Validate options. + // + if (ops.progress () && ops.no_progress ()) + fail << "inconsistent progress display options"; + // Global initializations. // + stderr_term = fdterm (stderr_fd ()); init (argv[0], ops.verbose_specified () ? ops.verbose () diff --git a/build2/operation.cxx b/build2/operation.cxx index 60555b1..ca8382c 100644 --- a/build2/operation.cxx +++ b/build2/operation.cxx @@ -105,7 +105,8 @@ namespace build2 // scheduler::monitor_guard mg; string what; - if (ops.progress ()) + if (ops.progress () || + (stderr_term && verb >= 1 && verb <= 2 && !ops.no_progress ())) { size_t init (target_count.load (memory_order_relaxed)); size_t incr (init > 100 ? 10 : 1); @@ -251,7 +252,7 @@ namespace build2 // scheduler::monitor_guard mg; string what; - if (ops.progress ()) + if (ops.progress () || (stderr_term && verb == 1 && !ops.no_progress ())) { size_t init (target_count.load (memory_order_relaxed)); size_t incr (init / 100); // 1%. diff --git a/build2/utility.cxx b/build2/utility.cxx index f2d9155..b0325fb 100644 --- a/build2/utility.cxx +++ b/build2/utility.cxx @@ -110,6 +110,7 @@ namespace build2 options ops; process_path argv0; + bool stderr_term; const standard_version build_version (BUILD2_VERSION_STR); diff --git a/build2/utility.hxx b/build2/utility.hxx index bb0eb8e..f6f9fe9 100644 --- a/build2/utility.hxx +++ b/build2/utility.hxx @@ -96,6 +96,8 @@ namespace build2 next_word (const string&, size_t n, size_t& b, size_t& e, char d1 = ' ', char d2 = '\0'); + extern bool stderr_term; // True if stderr is a terminal. + // Command line options. // extern options ops; |