From 3608c3eb029daf888000350872d81128c2f296ff Mon Sep 17 00:00:00 2001 From: rowanG077 Date: Mon, 6 Feb 2023 16:08:35 +0100 Subject: common: Implement Werror flag --- common/kernel/command.cc | 5 +++++ common/kernel/log.cc | 32 +++++++++++++++++++++++--------- common/kernel/log.h | 1 + 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/common/kernel/command.cc b/common/kernel/command.cc index 842d8a71..2fb4ee53 100644 --- a/common/kernel/command.cc +++ b/common/kernel/command.cc @@ -105,6 +105,10 @@ bool CommandHandler::executeBeforeContext() log_streams.push_back(std::make_pair(&std::cerr, LogLevel::LOG_MSG)); } + if (vm.count("Werror")) { + log_warn_as_error = true; + } + if (vm.count("log")) { std::string logfilename = vm["log"].as(); logfile.open(logfilename); @@ -121,6 +125,7 @@ po::options_description CommandHandler::getGeneralOptions() general.add_options()("help,h", "show help"); general.add_options()("verbose,v", "verbose output"); general.add_options()("quiet,q", "quiet mode, only errors and warnings displayed"); + general.add_options()("Werror", "Turn warnings into errors"); general.add_options()("log,l", po::value(), "log file, all log messages are written to this file regardless of -q"); general.add_options()("debug", "debug output"); diff --git a/common/kernel/log.cc b/common/kernel/log.cc index 8b1ad43b..a0bdd64e 100644 --- a/common/kernel/log.cc +++ b/common/kernel/log.cc @@ -41,6 +41,7 @@ void (*log_error_atexit)() = NULL; dict message_count_by_level; static int log_newline_count = 0; bool had_nonfatal_error = false; +bool log_warn_as_error = false; std::string stringf(const char *fmt, ...) { @@ -128,6 +129,22 @@ void logv_prefixed(const char *prefix, const char *format, va_list ap, LogLevel log_flush(); } +void logv_nonfatal_error(const char *format, va_list ap) +{ + logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR_MSG); + had_nonfatal_error = true; +} + +void logv_error(const char *format, va_list ap) +{ + logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR_MSG); + + if (log_error_atexit) + log_error_atexit(); + + throw log_execution_error_exception(); +} + void log_always(const char *format, ...) { va_list ap; @@ -156,7 +173,10 @@ void log_warning(const char *format, ...) { va_list ap; va_start(ap, format); - logv_prefixed("Warning: ", format, ap, LogLevel::WARNING_MSG); + if (log_warn_as_error) + logv_nonfatal_error(format, ap); + else + logv_prefixed("Warning: ", format, ap, LogLevel::WARNING_MSG); va_end(ap); } @@ -164,12 +184,7 @@ void log_error(const char *format, ...) { va_list ap; va_start(ap, format); - logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR_MSG); - - if (log_error_atexit) - log_error_atexit(); - - throw log_execution_error_exception(); + logv_error(format, ap); } void log_break() @@ -184,9 +199,8 @@ void log_nonfatal_error(const char *format, ...) { va_list ap; va_start(ap, format); - logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR_MSG); + logv_nonfatal_error(format, ap); va_end(ap); - had_nonfatal_error = true; } void log_flush() diff --git a/common/kernel/log.h b/common/kernel/log.h index 0ac4edf5..cba539f4 100644 --- a/common/kernel/log.h +++ b/common/kernel/log.h @@ -63,6 +63,7 @@ extern log_write_type log_write_function; extern std::string log_last_error; extern void (*log_error_atexit)(); extern bool had_nonfatal_error; +extern bool log_warn_as_error; extern dict message_count_by_level; std::string stringf(const char *fmt, ...); -- cgit v1.2.3