|
@@ -291,6 +291,7 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
|
|
|
|
|
|
std::string name;
|
|
|
bool foundNo = false;
|
|
|
+ bool foundError = false;
|
|
|
unsigned int nameStartPosition = 0;
|
|
|
|
|
|
if (entry.find("no-", nameStartPosition) == 0)
|
|
@@ -299,6 +300,12 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
|
|
|
nameStartPosition += 3;
|
|
|
}
|
|
|
|
|
|
+ if (entry.find("error=", nameStartPosition) == 0)
|
|
|
+ {
|
|
|
+ foundError = true;
|
|
|
+ nameStartPosition += 6;
|
|
|
+ }
|
|
|
+
|
|
|
name = entry.substr(nameStartPosition);
|
|
|
if (name.empty())
|
|
|
{
|
|
@@ -306,16 +313,27 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (!foundNo)
|
|
|
+ if (!foundNo && !foundError)
|
|
|
{
|
|
|
// -W<name>
|
|
|
this->DiagLevels[name] = std::max(this->DiagLevels[name],
|
|
|
DIAG_WARN);
|
|
|
}
|
|
|
+ else if (foundNo && !foundError)
|
|
|
+ {
|
|
|
+ // -Wno<name>
|
|
|
+ this->DiagLevels[name] = DIAG_IGNORE;
|
|
|
+ }
|
|
|
+ else if (!foundNo && foundError)
|
|
|
+ {
|
|
|
+ // -Werror=<name>
|
|
|
+ this->DiagLevels[name] = DIAG_ERROR;
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
- // -Wno<name>
|
|
|
- this->DiagLevels[name] = DIAG_IGNORE;
|
|
|
+ // -Wno-error=<name>
|
|
|
+ this->DiagLevels[name] = std::min(this->DiagLevels[name],
|
|
|
+ DIAG_WARN);
|
|
|
}
|
|
|
}
|
|
|
else if(arg.find("-U",0) == 0)
|
|
@@ -1270,10 +1288,17 @@ int cmake::Configure()
|
|
|
if (diagLevel == DIAG_IGNORE)
|
|
|
{
|
|
|
this->SetSuppressDeprecatedWarnings(true);
|
|
|
+ this->SetDeprecatedWarningsAsErrors(false);
|
|
|
}
|
|
|
else if (diagLevel == DIAG_WARN)
|
|
|
{
|
|
|
this->SetSuppressDeprecatedWarnings(false);
|
|
|
+ this->SetDeprecatedWarningsAsErrors(false);
|
|
|
+ }
|
|
|
+ else if (diagLevel == DIAG_ERROR)
|
|
|
+ {
|
|
|
+ this->SetSuppressDeprecatedWarnings(false);
|
|
|
+ this->SetDeprecatedWarningsAsErrors(true);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1283,9 +1308,11 @@ int cmake::Configure()
|
|
|
|
|
|
const char* cachedWarnDeprecated =
|
|
|
this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED");
|
|
|
+ const char* cachedErrorDeprecated =
|
|
|
+ this->State->GetCacheEntryValue("CMAKE_ERROR_DEPRECATED");
|
|
|
|
|
|
// don't overwrite deprecated warning setting from a previous invocation
|
|
|
- if (!cachedWarnDeprecated)
|
|
|
+ if (!cachedWarnDeprecated && !cachedErrorDeprecated)
|
|
|
{
|
|
|
setDeprecatedVariables = true;
|
|
|
}
|
|
@@ -1294,19 +1321,34 @@ int cmake::Configure()
|
|
|
if (diagLevel == DIAG_IGNORE)
|
|
|
{
|
|
|
this->SetSuppressDevWarnings(true);
|
|
|
+ this->SetDevWarningsAsErrors(false);
|
|
|
|
|
|
if (setDeprecatedVariables)
|
|
|
{
|
|
|
this->SetSuppressDeprecatedWarnings(true);
|
|
|
+ this->SetDeprecatedWarningsAsErrors(false);
|
|
|
}
|
|
|
}
|
|
|
else if (diagLevel == DIAG_WARN)
|
|
|
{
|
|
|
this->SetSuppressDevWarnings(false);
|
|
|
+ this->SetDevWarningsAsErrors(false);
|
|
|
+
|
|
|
+ if (setDeprecatedVariables)
|
|
|
+ {
|
|
|
+ this->SetSuppressDeprecatedWarnings(false);
|
|
|
+ this->SetDeprecatedWarningsAsErrors(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (diagLevel == DIAG_ERROR)
|
|
|
+ {
|
|
|
+ this->SetSuppressDevWarnings(false);
|
|
|
+ this->SetDevWarningsAsErrors(true);
|
|
|
|
|
|
if (setDeprecatedVariables)
|
|
|
{
|
|
|
this->SetSuppressDeprecatedWarnings(false);
|
|
|
+ this->SetDeprecatedWarningsAsErrors(true);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2547,16 +2589,45 @@ static bool cmakeCheckStampList(const char* stampList)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+cmake::MessageType cmake::ConvertMessageType(cmake::MessageType t)
|
|
|
+{
|
|
|
+ bool warningsAsErrors;
|
|
|
+
|
|
|
+ if (t == cmake::AUTHOR_WARNING || t == cmake::AUTHOR_ERROR)
|
|
|
+ {
|
|
|
+ warningsAsErrors = this->GetDevWarningsAsErrors();
|
|
|
+ if (warningsAsErrors && t == cmake::AUTHOR_WARNING)
|
|
|
+ {
|
|
|
+ t = cmake::AUTHOR_ERROR;
|
|
|
+ }
|
|
|
+ else if (!warningsAsErrors && t == cmake::AUTHOR_ERROR)
|
|
|
+ {
|
|
|
+ t = cmake::AUTHOR_WARNING;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (t == cmake::DEPRECATION_WARNING || t == cmake::DEPRECATION_ERROR)
|
|
|
+ {
|
|
|
+ warningsAsErrors = this->GetDeprecatedWarningsAsErrors();
|
|
|
+ if (warningsAsErrors && t == cmake::DEPRECATION_WARNING)
|
|
|
+ {
|
|
|
+ t = cmake::DEPRECATION_ERROR;
|
|
|
+ }
|
|
|
+ else if (!warningsAsErrors && t == cmake::DEPRECATION_ERROR)
|
|
|
+ {
|
|
|
+ t = cmake::DEPRECATION_WARNING;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return t;
|
|
|
+}
|
|
|
+
|
|
|
bool cmake::IsMessageTypeVisible(cmake::MessageType t)
|
|
|
{
|
|
|
bool isVisible = true;
|
|
|
|
|
|
if(t == cmake::DEPRECATION_ERROR)
|
|
|
{
|
|
|
- // if CMAKE_ERROR_DEPRECATED is on, show the message, otherwise suppress it
|
|
|
- const char* errorDeprecated = this->State->GetCacheEntryValue(
|
|
|
- "CMAKE_ERROR_DEPRECATED");
|
|
|
- if(cmSystemTools::IsOff(errorDeprecated))
|
|
|
+ if(!this->GetDeprecatedWarningsAsErrors())
|
|
|
{
|
|
|
isVisible = false;
|
|
|
}
|
|
@@ -2568,6 +2639,13 @@ bool cmake::IsMessageTypeVisible(cmake::MessageType t)
|
|
|
isVisible = false;
|
|
|
}
|
|
|
}
|
|
|
+ else if (t == cmake::AUTHOR_ERROR)
|
|
|
+ {
|
|
|
+ if (!this->GetDevWarningsAsErrors())
|
|
|
+ {
|
|
|
+ isVisible = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
else if (t == cmake::AUTHOR_WARNING)
|
|
|
{
|
|
|
if (this->GetSuppressDevWarnings())
|
|
@@ -2606,6 +2684,10 @@ bool cmake::PrintMessagePreamble(cmake::MessageType t, std::ostream& msg)
|
|
|
{
|
|
|
msg << "CMake Warning (dev)";
|
|
|
}
|
|
|
+ else if (t == cmake::AUTHOR_ERROR)
|
|
|
+ {
|
|
|
+ msg << "CMake Error (dev)";
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
msg << "CMake Warning";
|
|
@@ -2630,6 +2712,12 @@ void displayMessage(cmake::MessageType t, std::ostringstream& msg)
|
|
|
msg <<
|
|
|
"This warning is for project developers. Use -Wno-dev to suppress it.";
|
|
|
}
|
|
|
+ else if (t == cmake::AUTHOR_ERROR)
|
|
|
+ {
|
|
|
+ msg <<
|
|
|
+ "This error is for project developers. Use -Wno-error=dev to suppress "
|
|
|
+ "it.";
|
|
|
+ }
|
|
|
|
|
|
// Add a terminating blank line.
|
|
|
msg << "\n";
|
|
@@ -2653,7 +2741,8 @@ void displayMessage(cmake::MessageType t, std::ostringstream& msg)
|
|
|
// Output the message.
|
|
|
if(t == cmake::FATAL_ERROR
|
|
|
|| t == cmake::INTERNAL_ERROR
|
|
|
- || t == cmake::DEPRECATION_ERROR)
|
|
|
+ || t == cmake::DEPRECATION_ERROR
|
|
|
+ || t == cmake::AUTHOR_ERROR)
|
|
|
{
|
|
|
cmSystemTools::SetErrorOccured();
|
|
|
cmSystemTools::Message(msg.str().c_str(), "Error");
|
|
@@ -2671,6 +2760,17 @@ void cmake::IssueMessage(cmake::MessageType t, std::string const& text,
|
|
|
{
|
|
|
cmListFileBacktrace backtrace = bt;
|
|
|
|
|
|
+ if (!force)
|
|
|
+ {
|
|
|
+ // override the message type, if needed, for warnings and errors
|
|
|
+ cmake::MessageType override = this->ConvertMessageType(t);
|
|
|
+ if (override != t)
|
|
|
+ {
|
|
|
+ t = override;
|
|
|
+ force = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (!force && !this->IsMessageTypeVisible(t))
|
|
|
{
|
|
|
return;
|
|
@@ -2698,6 +2798,17 @@ void cmake::IssueMessage(cmake::MessageType t, std::string const& text,
|
|
|
cmListFileContext const& lfc,
|
|
|
bool force)
|
|
|
{
|
|
|
+ if (!force)
|
|
|
+ {
|
|
|
+ // override the message type, if needed, for warnings and errors
|
|
|
+ cmake::MessageType override = this->ConvertMessageType(t);
|
|
|
+ if (override != t)
|
|
|
+ {
|
|
|
+ t = override;
|
|
|
+ force = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (!force && !this->IsMessageTypeVisible(t))
|
|
|
{
|
|
|
return;
|
|
@@ -2941,3 +3052,74 @@ void cmake::SetSuppressDeprecatedWarnings(bool b)
|
|
|
"functionality.",
|
|
|
cmState::INTERNAL);
|
|
|
}
|
|
|
+
|
|
|
+bool cmake::GetDevWarningsAsErrors(cmMakefile const* mf)
|
|
|
+{
|
|
|
+ if (mf)
|
|
|
+ {
|
|
|
+ return (mf->IsSet("CMAKE_SUPPRESS_DEVELOPER_ERRORS") &&
|
|
|
+ !mf->IsOn("CMAKE_SUPPRESS_DEVELOPER_ERRORS"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ const char* cacheEntryValue = this->State->GetCacheEntryValue(
|
|
|
+ "CMAKE_SUPPRESS_DEVELOPER_ERRORS");
|
|
|
+ return cacheEntryValue && cmSystemTools::IsOff(cacheEntryValue);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void cmake::SetDevWarningsAsErrors(bool b)
|
|
|
+{
|
|
|
+ std::string value;
|
|
|
+
|
|
|
+ // equivalent to -Werror=dev
|
|
|
+ if (b)
|
|
|
+ {
|
|
|
+ value = "FALSE";
|
|
|
+ }
|
|
|
+ // equivalent to -Wno-error=dev
|
|
|
+ else
|
|
|
+ {
|
|
|
+ value = "TRUE";
|
|
|
+ }
|
|
|
+
|
|
|
+ this->AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_ERRORS", value.c_str(),
|
|
|
+ "Suppress errors that are meant for"
|
|
|
+ " the author of the CMakeLists.txt files.",
|
|
|
+ cmState::INTERNAL);
|
|
|
+}
|
|
|
+
|
|
|
+bool cmake::GetDeprecatedWarningsAsErrors(cmMakefile const* mf)
|
|
|
+{
|
|
|
+ if (mf)
|
|
|
+ {
|
|
|
+ return mf->IsOn("CMAKE_ERROR_DEPRECATED");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ const char* cacheEntryValue = this->State->GetCacheEntryValue(
|
|
|
+ "CMAKE_ERROR_DEPRECATED");
|
|
|
+ return cmSystemTools::IsOn(cacheEntryValue);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void cmake::SetDeprecatedWarningsAsErrors(bool b)
|
|
|
+{
|
|
|
+ std::string value;
|
|
|
+
|
|
|
+ // equivalent to -Werror=deprecated
|
|
|
+ if (b)
|
|
|
+ {
|
|
|
+ value = "TRUE";
|
|
|
+ }
|
|
|
+ // equivalent to -Wno-error=deprecated
|
|
|
+ else
|
|
|
+ {
|
|
|
+ value = "FALSE";
|
|
|
+ }
|
|
|
+
|
|
|
+ this->AddCacheEntry("CMAKE_ERROR_DEPRECATED", value.c_str(),
|
|
|
+ "Whether to issue deprecation errors for macros"
|
|
|
+ " and functions.",
|
|
|
+ cmState::INTERNAL);
|
|
|
+}
|