Refactor the -W options parser to be generic.

Refactor the -Wdev and -Wno-dev options parser to use a generic -W
parser that follows the GCC pattern, excluding support for
-Werror=TYPE and -Wno-error=TYPE formats for now.
This commit is contained in:
Michael Scott 2015-11-29 12:39:03 +00:00 committed by Brad King
parent 246b0bfbfd
commit 07388f83b6
7 changed files with 101 additions and 36 deletions

View File

@ -127,8 +127,6 @@ cmake::cmake()
this->WarnUnused = false; this->WarnUnused = false;
this->WarnUnusedCli = true; this->WarnUnusedCli = true;
this->CheckSystemVars = false; this->CheckSystemVars = false;
this->SuppressDevWarnings = false;
this->DoSuppressDevWarnings = false;
this->DebugOutput = false; this->DebugOutput = false;
this->DebugTryCompile = false; this->DebugTryCompile = false;
this->ClearBuildSystem = false; this->ClearBuildSystem = false;
@ -274,15 +272,51 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
return false; return false;
} }
} }
else if(arg.find("-Wno-dev",0) == 0) else if(cmHasLiteralPrefix(arg, "-W"))
{ {
this->SuppressDevWarnings = true; std::string entry = arg.substr(2);
this->DoSuppressDevWarnings = true; if (entry.empty())
} {
else if(arg.find("-Wdev",0) == 0) ++i;
{ if (i < args.size())
this->SuppressDevWarnings = false; {
this->DoSuppressDevWarnings = true; entry = args[i];
}
else
{
cmSystemTools::Error("-W must be followed with [no-]<name>.");
return false;
}
}
std::string name;
bool foundNo = false;
unsigned int nameStartPosition = 0;
if (entry.find("no-", nameStartPosition) == 0)
{
foundNo = true;
nameStartPosition += 3;
}
name = entry.substr(nameStartPosition);
if (name.empty())
{
cmSystemTools::Error("No warning name provided.");
return false;
}
if (!foundNo)
{
// -W<name>
this->DiagLevels[name] = std::max(this->DiagLevels[name],
DIAG_WARN);
}
else
{
// -Wno<name>
this->DiagLevels[name] = DIAG_IGNORE;
}
} }
else if(arg.find("-U",0) == 0) else if(arg.find("-U",0) == 0)
{ {
@ -618,11 +652,7 @@ void cmake::SetArgs(const std::vector<std::string>& args,
// skip for now // skip for now
i++; i++;
} }
else if(arg.find("-Wno-dev",0) == 0) else if(arg.find("-W",0) == 0)
{
// skip for now
}
else if(arg.find("-Wdev",0) == 0)
{ {
// skip for now // skip for now
} }
@ -1231,25 +1261,28 @@ int cmake::HandleDeleteCacheVariables(const std::string& var)
int cmake::Configure() int cmake::Configure()
{ {
if(this->DoSuppressDevWarnings) DiagLevel diagLevel;
if (this->DiagLevels.count("dev") == 1)
{ {
if(this->SuppressDevWarnings)
diagLevel = this->DiagLevels["dev"];
if (diagLevel == DIAG_IGNORE)
{ {
this-> this->AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "TRUE",
AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "TRUE", "Suppress Warnings that are meant for"
"Suppress Warnings that are meant for" " the author of the CMakeLists.txt files.",
" the author of the CMakeLists.txt files.", cmState::INTERNAL);
cmState::INTERNAL);
} }
else else if (diagLevel == DIAG_WARN)
{ {
this-> this->AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "FALSE",
AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "FALSE", "Suppress Warnings that are meant for"
"Suppress Warnings that are meant for" " the author of the CMakeLists.txt files.",
" the author of the CMakeLists.txt files.", cmState::INTERNAL);
cmState::INTERNAL);
} }
} }
int ret = this->ActualConfigure(); int ret = this->ActualConfigure();
const char* delCacheVars = this->State const char* delCacheVars = this->State
->GetGlobalProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_"); ->GetGlobalProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_");
@ -2805,6 +2838,21 @@ void cmake::RunCheckForUnusedVariables()
#endif #endif
} }
void cmake::SetSuppressDevWarnings(bool b)
{
// equivalent to -Wno-dev
if (b)
{
this->DiagLevels["dev"] = DIAG_IGNORE;
}
// equivalent to -Wdev
else
{
this->DiagLevels["dev"] = std::max(this->DiagLevels["dev"],
DIAG_WARN);
}
}
bool cmake::GetSuppressDevWarnings(cmMakefile const* mf) bool cmake::GetSuppressDevWarnings(cmMakefile const* mf)
{ {
/* /*

View File

@ -68,6 +68,11 @@ class cmake
DEPRECATION_WARNING DEPRECATION_WARNING
}; };
enum DiagLevel
{
DIAG_IGNORE,
DIAG_WARN
};
/** \brief Describes the working modes of cmake */ /** \brief Describes the working modes of cmake */
enum WorkingMode enum WorkingMode
@ -303,11 +308,7 @@ class cmake
std::string const& GetCMakeEditCommand() const std::string const& GetCMakeEditCommand() const
{ return this->CMakeEditCommand; } { return this->CMakeEditCommand; }
void SetSuppressDevWarnings(bool v) void SetSuppressDevWarnings(bool v);
{
this->SuppressDevWarnings = v;
this->DoSuppressDevWarnings = true;
}
/* /*
* Get the state of the suppression of developer (author) warnings. * Get the state of the suppression of developer (author) warnings.
* Returns false, by default, if developer warnings should be shown, true * Returns false, by default, if developer warnings should be shown, true
@ -359,8 +360,7 @@ protected:
cmGlobalGenerator *GlobalGenerator; cmGlobalGenerator *GlobalGenerator;
cmCacheManager *CacheManager; cmCacheManager *CacheManager;
bool SuppressDevWarnings; std::map<std::string, DiagLevel> DiagLevels;
bool DoSuppressDevWarnings;
std::string GeneratorPlatform; std::string GeneratorPlatform;
std::string GeneratorToolset; std::string GeneratorToolset;

View File

@ -129,13 +129,24 @@ set(RunCMake_TEST_OPTIONS -Wno-dev)
run_cmake(Wno-dev) run_cmake(Wno-dev)
unset(RunCMake_TEST_OPTIONS) unset(RunCMake_TEST_OPTIONS)
set(RunCMake_TEST_OPTIONS -Wno-dev -Wdev) set(RunCMake_TEST_OPTIONS -Wdev)
run_cmake(Wdev) run_cmake(Wdev)
unset(RunCMake_TEST_OPTIONS) unset(RunCMake_TEST_OPTIONS)
# Dev warnings should be on by default # Dev warnings should be on by default
run_cmake(Wdev) run_cmake(Wdev)
# Conflicting -W options should honor the last value
set(RunCMake_TEST_OPTIONS -Wno-dev -Wdev)
run_cmake(Wdev)
unset(RunCMake_TEST_OPTIONS)
set(RunCMake_TEST_OPTIONS -Wdev -Wno-dev)
run_cmake(Wno-dev)
unset(RunCMake_TEST_OPTIONS)
run_cmake_command(W_bad-arg1 ${CMAKE_COMMAND} -W)
run_cmake_command(W_bad-arg2 ${CMAKE_COMMAND} -Wno-)
set(RunCMake_TEST_OPTIONS --debug-output) set(RunCMake_TEST_OPTIONS --debug-output)
run_cmake(debug-output) run_cmake(debug-output)
unset(RunCMake_TEST_OPTIONS) unset(RunCMake_TEST_OPTIONS)

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,2 @@
CMake Error: -W must be followed with \[no-\]<name>.
CMake Error: Problem processing arguments. Aborting.

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,2 @@
CMake Error: No warning name provided.
CMake Error: Problem processing arguments. Aborting.