summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorMichael Scott <michael.scott250@gmail.com>2015-07-27 23:07:03 (GMT)
committerBrad King <brad.king@kitware.com>2015-07-29 13:20:10 (GMT)
commitc96fe0b40d562b65831376f927b6fd96cf999a52 (patch)
tree7a72ca8450ded588ff6a0c7247de2366d178bfe5 /Source
parent98d6e9ec2dd0a935b1ebfed50b6e9ecab719557d (diff)
downloadCMake-c96fe0b40d562b65831376f927b6fd96cf999a52.zip
CMake-c96fe0b40d562b65831376f927b6fd96cf999a52.tar.gz
CMake-c96fe0b40d562b65831376f927b6fd96cf999a52.tar.bz2
cmake: Add -W options to control deprecation warnings and errors
Refactor the -Wdev and -Wno-dev to use a generic -W parser that follows the GCC pattern. Include support for setting CMAKE_ERROR_DEPRECATED and CMAKE_WARN_DEPRECATED via the deprecated warning. Add -Werror=dev and -Wno-error=dev options so that dev warning options are in line with deprecated warning options. Use a new CMAKE_SUPPRESS_DEVELOPER_ERRORS internal cache entry to store the above new dev options persistently. Add tests for new options and updated cmake documentation and release notes to list new options.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmMessageCommand.cxx14
-rw-r--r--Source/cmake.cxx234
-rw-r--r--Source/cmake.h27
3 files changed, 236 insertions, 39 deletions
diff --git a/Source/cmMessageCommand.cxx b/Source/cmMessageCommand.cxx
index 2854a82..e09ba75 100644
--- a/Source/cmMessageCommand.cxx
+++ b/Source/cmMessageCommand.cxx
@@ -43,7 +43,19 @@ bool cmMessageCommand
}
else if (*i == "AUTHOR_WARNING")
{
- type = cmake::AUTHOR_WARNING;
+ if (!this->Makefile->IsOn("CMAKE_SUPPRESS_DEVELOPER_ERRORS"))
+ {
+ fatal = true;
+ type = cmake::AUTHOR_ERROR;
+ }
+ else if (!this->Makefile->IsOn("CMAKE_SUPPRESS_DEVELOPER_WARNINGS"))
+ {
+ type = cmake::AUTHOR_WARNING;
+ }
+ else
+ {
+ return true;
+ }
++i;
}
else if (*i == "STATUS")
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 9d2c19e..6832141 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -126,8 +126,6 @@ cmake::cmake()
this->WarnUnused = false;
this->WarnUnusedCli = true;
this->CheckSystemVars = false;
- this->SuppressDevWarnings = false;
- this->DoSuppressDevWarnings = false;
this->DebugOutput = false;
this->DebugTryCompile = false;
this->ClearBuildSystem = false;
@@ -252,15 +250,70 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
return false;
}
}
- else if(arg.find("-Wno-dev",0) == 0)
+ else if(cmHasLiteralPrefix(arg, "-W"))
{
- this->SuppressDevWarnings = true;
- this->DoSuppressDevWarnings = true;
+ std::string entry = arg.substr(2);
+ if (entry.empty())
+ {
+ ++i;
+ if (i < args.size())
+ {
+ entry = args[i];
+ }
+ else
+ {
+ cmSystemTools::Error(
+ "-W must be followed with [no-][error=]<name>.");
+ return false;
+ }
}
- else if(arg.find("-Wdev",0) == 0)
- {
- this->SuppressDevWarnings = false;
- this->DoSuppressDevWarnings = true;
+
+ std::string name;
+ bool foundNo = false;
+ bool foundError = false;
+ unsigned int nameStartPosition = 0;
+
+ if (entry.find("no-", nameStartPosition) == 0)
+ {
+ foundNo = true;
+ nameStartPosition += 3;
+ }
+
+ if (entry.find("error=", nameStartPosition) == 0)
+ {
+ foundError = true;
+ nameStartPosition += 6;
+ }
+
+ name = entry.substr(nameStartPosition);
+ if (name.empty())
+ {
+ cmSystemTools::Error("No warning name provided.");
+ return false;
+ }
+
+ if (!foundNo && !foundError)
+ {
+ // -W<name>
+ this->WarningLevels[name] = std::max(this->WarningLevels[name],
+ WARNING_LEVEL);
+ }
+ else if (foundNo && !foundError)
+ {
+ // -Wno<name>
+ this->WarningLevels[name] = IGNORE_LEVEL;
+ }
+ else if (!foundNo && foundError)
+ {
+ // -Werror=<name>
+ this->WarningLevels[name] = ERROR_LEVEL;
+ }
+ else
+ {
+ // -Wno-error=<name>
+ this->WarningLevels[name] = std::min(this->WarningLevels[name],
+ WARNING_LEVEL);
+ }
}
else if(arg.find("-U",0) == 0)
{
@@ -589,11 +642,7 @@ void cmake::SetArgs(const std::vector<std::string>& args,
// skip for now
i++;
}
- else if(arg.find("-Wno-dev",0) == 0)
- {
- // skip for now
- }
- else if(arg.find("-Wdev",0) == 0)
+ else if(arg.find("-W",0) == 0)
{
// skip for now
}
@@ -1180,25 +1229,121 @@ int cmake::HandleDeleteCacheVariables(const std::string& var)
int cmake::Configure()
{
- if(this->DoSuppressDevWarnings)
+ WarningLevel warningLevel;
+
+ if (this->WarningLevels.count("deprecated") == 1)
{
- if(this->SuppressDevWarnings)
+ warningLevel = this->WarningLevels["deprecated"];
+ if (warningLevel == IGNORE_LEVEL)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_WARN_DEPRECATED", "FALSE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ this->CacheManager->
+ AddCacheEntry("CMAKE_ERROR_DEPRECATED", "FALSE",
+ "Whether to issue deprecation errors for macros"
+ " and functions.",
+ cmState::BOOL);
+ }
+ if (warningLevel == WARNING_LEVEL)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_WARN_DEPRECATED", "TRUE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ }
+ else if (warningLevel == ERROR_LEVEL)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_ERROR_DEPRECATED", "TRUE",
+ "Whether to issue deprecation errors for macros"
+ " and functions.",
+ cmState::BOOL);
+ }
+ }
+
+ if (this->WarningLevels.count("dev") == 1)
+ {
+ bool setDeprecatedVariables = false;
+
+ 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 && !cachedErrorDeprecated)
+ {
+ setDeprecatedVariables = true;
+ }
+
+ warningLevel = this->WarningLevels["dev"];
+ if (warningLevel == IGNORE_LEVEL)
{
this->CacheManager->
AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "TRUE",
"Suppress Warnings that are meant for"
" the author of the CMakeLists.txt files.",
cmState::INTERNAL);
+ this->CacheManager->
+ AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_ERRORS", "TRUE",
+ "Suppress errors that are meant for"
+ " the author of the CMakeLists.txt files.",
+ cmState::INTERNAL);
+
+ if (setDeprecatedVariables)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_WARN_DEPRECATED", "FALSE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ this->CacheManager->
+ AddCacheEntry("CMAKE_ERROR_DEPRECATED", "FALSE",
+ "Whether to issue deprecation errors for macros"
+ " and functions.",
+ cmState::BOOL);
+ }
}
- else
+ else if (warningLevel == WARNING_LEVEL)
{
this->CacheManager->
AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "FALSE",
"Suppress Warnings that are meant for"
" the author of the CMakeLists.txt files.",
cmState::INTERNAL);
+
+ if (setDeprecatedVariables)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_WARN_DEPRECATED", "TRUE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ }
+ }
+ else if (warningLevel == ERROR_LEVEL)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_ERRORS", "FALSE",
+ "Suppress errors that are meant for"
+ " the author of the CMakeLists.txt files.",
+ cmState::INTERNAL);
+
+ if (setDeprecatedVariables)
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_ERROR_DEPRECATED", "TRUE",
+ "Whether to issue deprecation errors for macros"
+ " and functions.",
+ cmState::BOOL);
+ }
}
}
+
int ret = this->ActualConfigure();
const char* delCacheVars = this->State
->GetGlobalProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_");
@@ -1529,6 +1674,18 @@ int cmake::Run(const std::vector<std::string>& args, bool noconfigure)
{
this->AddCMakePaths();
}
+
+ // don't turn dev warnings into errors by default, if no value has been
+ // specified for the flag, enable it
+ if (!this->State->GetCacheEntryValue("CMAKE_SUPPRESS_DEVELOPER_ERRORS"))
+ {
+ this->CacheManager->
+ AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_ERRORS", "TRUE",
+ "Suppress errors that are meant for"
+ " the author of the CMakeLists.txt files.",
+ cmState::INTERNAL);
+ }
+
// Add any cache args
if ( !this->SetCacheArgs(args) )
{
@@ -2427,20 +2584,17 @@ bool cmake::PrintMessagePreamble(cmake::MessageType t, std::ostream& msg)
{
msg << "CMake Deprecation Warning";
}
+ else if (t == cmake::AUTHOR_WARNING)
+ {
+ msg << "CMake Warning (dev)";
+ }
+ else if (t == cmake::AUTHOR_ERROR)
+ {
+ msg << "CMake Error (dev)";
+ }
else
{
msg << "CMake Warning";
- if(t == cmake::AUTHOR_WARNING)
- {
- // Allow suppression of these warnings.
- const char* suppress = this->State->GetCacheEntryValue(
- "CMAKE_SUPPRESS_DEVELOPER_WARNINGS");
- if(suppress && cmSystemTools::IsOn(suppress))
- {
- return false;
- }
- msg << " (dev)";
- }
}
return true;
}
@@ -2462,6 +2616,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";
@@ -2485,7 +2645,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");
@@ -2663,3 +2824,18 @@ void cmake::RunCheckForUnusedVariables()
}
#endif
}
+
+void cmake::SetSuppressDevWarnings(bool b)
+{
+ // equivalent to -Wno-dev
+ if (b)
+ {
+ this->WarningLevels["dev"] = IGNORE_LEVEL;
+ }
+ // equivalent to -Wdev
+ else
+ {
+ this->WarningLevels["dev"] = std::max(this->WarningLevels["dev"],
+ WARNING_LEVEL);
+ }
+}
diff --git a/Source/cmake.h b/Source/cmake.h
index 20e49e3..31f55ac 100644
--- a/Source/cmake.h
+++ b/Source/cmake.h
@@ -60,6 +60,7 @@ class cmake
public:
enum MessageType
{ AUTHOR_WARNING,
+ AUTHOR_ERROR,
FATAL_ERROR,
INTERNAL_ERROR,
MESSAGE,
@@ -69,6 +70,12 @@ class cmake
DEPRECATION_WARNING
};
+ enum WarningLevel
+ {
+ IGNORE_LEVEL,
+ WARNING_LEVEL,
+ ERROR_LEVEL
+ };
/** \brief Describes the working modes of cmake */
enum WorkingMode
@@ -272,6 +279,7 @@ class cmake
void SetTrace(bool b) { this->Trace = b;}
bool GetTraceExpand() { return this->TraceExpand;}
void SetTraceExpand(bool b) { this->TraceExpand = b;}
+ void SetSuppressDevWarnings(bool b);
bool GetWarnUninitialized() { return this->WarnUninitialized;}
void SetWarnUninitialized(bool b) { this->WarnUninitialized = b;}
bool GetWarnUnused() { return this->WarnUnused;}
@@ -292,12 +300,6 @@ class cmake
std::string const& GetCMakeEditCommand() const
{ return this->CMakeEditCommand; }
- void SetSuppressDevWarnings(bool v)
- {
- this->SuppressDevWarnings = v;
- this->DoSuppressDevWarnings = true;
- }
-
/** Display a message to the user. */
void IssueMessage(cmake::MessageType t, std::string const& text,
cmListFileBacktrace const& backtrace = cmListFileBacktrace());
@@ -341,8 +343,7 @@ protected:
cmPolicies *Policies;
cmGlobalGenerator *GlobalGenerator;
cmCacheManager *CacheManager;
- bool SuppressDevWarnings;
- bool DoSuppressDevWarnings;
+ std::map<std::string, WarningLevel> WarningLevels;
std::string GeneratorPlatform;
std::string GeneratorToolset;
@@ -418,7 +419,15 @@ private:
{"-T <toolset-name>", "Specify toolset name if supported by generator."}, \
{"-A <platform-name>", "Specify platform name if supported by generator."}, \
{"-Wno-dev", "Suppress developer warnings."},\
- {"-Wdev", "Enable developer warnings."}
+ {"-Wdev", "Enable developer warnings."},\
+ {"-Werror=dev", "Make developer warnings errors."},\
+ {"-Wno-error=dev", "Make developer warnings not errors."},\
+ {"-Wdeprecated", "Enable deprecated macro and function warnings."},\
+ {"-Wno-deprecated", "Suppress deprecated macro and function warnings."},\
+ {"-Werror=deprecated", "Make deprecated macro and function warnings " \
+ "errors."},\
+ {"-Wno-error=deprecated", "Make deprecated macro and function warnings " \
+ "not errors."}
#define FOR_EACH_C_FEATURE(F) \
F(c_function_prototypes) \