aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormyrtle <gatecat@ds0.me>2023-02-14 15:03:57 +0100
committerGitHub <noreply@github.com>2023-02-14 15:03:57 +0100
commit78dabb7b8f2279090b61447d1ebd04385061fc61 (patch)
tree2312aa9c34abfd1440cbd03fac2c84d64998731d
parent57693bcb7f9140fc8587295e6af76be9b43b073c (diff)
parent3608c3eb029daf888000350872d81128c2f296ff (diff)
downloadnextpnr-78dabb7b8f2279090b61447d1ebd04385061fc61.tar.gz
nextpnr-78dabb7b8f2279090b61447d1ebd04385061fc61.tar.bz2
nextpnr-78dabb7b8f2279090b61447d1ebd04385061fc61.zip
Merge pull request #1092 from rowanG077/werror
common: Implement Werror flag
-rw-r--r--common/kernel/command.cc5
-rw-r--r--common/kernel/log.cc32
-rw-r--r--common/kernel/log.h1
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<std::string>();
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<std::string>(),
"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<LogLevel, int, loglevel_hash_ops> 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<LogLevel, int, loglevel_hash_ops> message_count_by_level;
std::string stringf(const char *fmt, ...);