[cmake-developers] Add command line options for deprecation message control
Michael Scott
michael.scott250 at gmail.com
Fri Nov 13 16:51:28 EST 2015
Hi Brad,
Here's the original patch split up into smaller more specific patches.
Let me know if there's any issues or if everything's okay, so I can
continue with the rest of the intended changes.
Cheers,
Michael
-------------- next part --------------
From 48d8c38c7b5724e4b6b53fa8647046c96cec603b Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 1 Nov 2015 16:05:15 +0000
Subject: [PATCH 1/7] Tests: Revise message in RunCMake.CommandLine -Wdev case
Use more prose-like capitalization.
---
Tests/RunCMake/CommandLine/Wdev-stderr.txt | 2 +-
Tests/RunCMake/CommandLine/Wdev.cmake | 2 +-
Tests/RunCMake/CommandLine/Wno-dev.cmake | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Tests/RunCMake/CommandLine/Wdev-stderr.txt b/Tests/RunCMake/CommandLine/Wdev-stderr.txt
index 92c1d23..88cfb3a 100644
--- a/Tests/RunCMake/CommandLine/Wdev-stderr.txt
+++ b/Tests/RunCMake/CommandLine/Wdev-stderr.txt
@@ -1,5 +1,5 @@
^CMake Warning \(dev\) at Wdev.cmake:1 \(message\):
- Some Author Warning
+ Some author warning
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/CommandLine/Wdev.cmake b/Tests/RunCMake/CommandLine/Wdev.cmake
index e5026ef..756f31e 100644
--- a/Tests/RunCMake/CommandLine/Wdev.cmake
+++ b/Tests/RunCMake/CommandLine/Wdev.cmake
@@ -1,4 +1,4 @@
-message(AUTHOR_WARNING "Some Author Warning")
+message(AUTHOR_WARNING "Some author warning")
# with -Wdev this will also cause an AUTHOR_WARNING message, checks that
# messages issued outside of the message command, by other CMake commands, also
diff --git a/Tests/RunCMake/CommandLine/Wno-dev.cmake b/Tests/RunCMake/CommandLine/Wno-dev.cmake
index d81b858..802b435 100644
--- a/Tests/RunCMake/CommandLine/Wno-dev.cmake
+++ b/Tests/RunCMake/CommandLine/Wno-dev.cmake
@@ -1,4 +1,4 @@
-message(AUTHOR_WARNING "Some Author Warning")
+message(AUTHOR_WARNING "Some author warning")
# without -Wno-dev this will also cause an AUTHOR_WARNING message, checks that
# messages issued outside of the message command, by other CMake commands, also
--
2.1.4
-------------- next part --------------
From e60002e10f2ea10cadac74bd8c3a2d23cb35be4a Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 8 Nov 2015 12:20:47 +0000
Subject: [PATCH 2/7] Make message suppression more consistent.
Make the message suppression more consistent, by adding a check
for the message related CMake variables in cmake::IssueMessage,
which allows callers of IssueMessage other than the message
command to behave as expected. Also added a check for
CMAKE_SUPPRESS_DEVELOPER_WARNINGS in the message command to
mirror the deprecated message type behaviour.
Added a 'force' flag to the cmake::IssueMessage method, to
make the message suppression consistent, when setting the
message related CMake variables directly in a CMake file.
Expand message command tests to cover the AUTHOR_WARNING message
type as well.
---
Source/cmMakefile.cxx | 8 +--
Source/cmMakefile.h | 3 +-
Source/cmMessageCommand.cxx | 12 ++++-
Source/cmake.cxx | 70 ++++++++++++++++++++++-----
Source/cmake.h | 12 ++++-
Tests/RunCMake/message/nomessage.cmake | 5 ++
Tests/RunCMake/message/warnmessage-stderr.txt | 11 ++++-
Tests/RunCMake/message/warnmessage.cmake | 6 ++-
8 files changed, 103 insertions(+), 24 deletions(-)
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index a1f143a..fd93a41 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -130,7 +130,8 @@ cmMakefile::~cmMakefile()
//----------------------------------------------------------------------------
void cmMakefile::IssueMessage(cmake::MessageType t,
- std::string const& text) const
+ std::string const& text,
+ bool force) const
{
// Collect context information.
if(!this->ExecutionStatusStack.empty())
@@ -139,7 +140,8 @@ void cmMakefile::IssueMessage(cmake::MessageType t,
{
this->ExecutionStatusStack.back()->SetNestedError(true);
}
- this->GetCMakeInstance()->IssueMessage(t, text, this->GetBacktrace());
+ this->GetCMakeInstance()->IssueMessage(t, text, this->GetBacktrace(),
+ force);
}
else
{
@@ -154,7 +156,7 @@ void cmMakefile::IssueMessage(cmake::MessageType t,
lfc.FilePath = converter.Convert(lfc.FilePath, cmOutputConverter::HOME);
}
lfc.Line = 0;
- this->GetCMakeInstance()->IssueMessage(t, text, lfc);
+ this->GetCMakeInstance()->IssueMessage(t, text, lfc, force);
}
}
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 4215b72..e89f772 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -719,7 +719,8 @@ public:
};
void IssueMessage(cmake::MessageType t,
- std::string const& text) const;
+ std::string const& text,
+ bool force = false) const;
/** Set whether or not to report a CMP0000 violation. */
void SetCheckCMP0000(bool b) { this->CheckCMP0000 = b; }
diff --git a/Source/cmMessageCommand.cxx b/Source/cmMessageCommand.cxx
index 2854a82..1c65ef7 100644
--- a/Source/cmMessageCommand.cxx
+++ b/Source/cmMessageCommand.cxx
@@ -43,7 +43,14 @@ bool cmMessageCommand
}
else if (*i == "AUTHOR_WARNING")
{
- type = cmake::AUTHOR_WARNING;
+ if (this->Makefile->IsOn("CMAKE_SUPPRESS_DEVELOPER_WARNINGS"))
+ {
+ return true;
+ }
+ else
+ {
+ type = cmake::AUTHOR_WARNING;
+ }
++i;
}
else if (*i == "STATUS")
@@ -73,7 +80,8 @@ bool cmMessageCommand
if (type != cmake::MESSAGE)
{
- this->Makefile->IssueMessage(type, message);
+ // we've overriden the message type, above, so force IssueMessage to use it
+ this->Makefile->IssueMessage(type, message, true);
}
else
{
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 7268241..532c250 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -2444,6 +2444,45 @@ static bool cmakeCheckStampList(const char* stampList)
return true;
}
+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))
+ {
+ isVisible = false;
+ }
+ }
+ else if (t == cmake::DEPRECATION_WARNING)
+ {
+ // if CMAKE_WARN_DEPRECATED is on, show the message, otherwise suppress it
+ const char* warnDeprecated = this->State->GetInitializedCacheValue(
+ "CMAKE_WARN_DEPRECATED");
+ if(cmSystemTools::IsOff(warnDeprecated))
+ {
+ isVisible = false;
+ }
+ }
+ else if (t == cmake::AUTHOR_WARNING)
+ {
+ // if CMAKE_SUPPRESS_DEVELOPER_WARNINGS is on, suppress the message,
+ // otherwise show it
+ const char* suppressDevWarnings = this->State->GetCacheEntryValue(
+ "CMAKE_SUPPRESS_DEVELOPER_WARNINGS");
+ if(cmSystemTools::IsOn(suppressDevWarnings))
+ {
+ isVisible = false;
+ }
+ }
+
+ return isVisible;
+}
+
bool cmake::PrintMessagePreamble(cmake::MessageType t, std::ostream& msg)
{
// Construct the message header.
@@ -2467,20 +2506,13 @@ bool cmake::PrintMessagePreamble(cmake::MessageType t, std::ostream& msg)
{
msg << "CMake Deprecation Warning";
}
+ else if (t == cmake::AUTHOR_WARNING)
+ {
+ msg << "CMake Warning (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;
}
@@ -2538,10 +2570,16 @@ void displayMessage(cmake::MessageType t, std::ostringstream& msg)
//----------------------------------------------------------------------------
void cmake::IssueMessage(cmake::MessageType t, std::string const& text,
- cmListFileBacktrace const& bt)
+ cmListFileBacktrace const& bt,
+ bool force)
{
cmListFileBacktrace backtrace = bt;
+ if (!force && !this->IsMessageTypeVisible(t))
+ {
+ return;
+ }
+
std::ostringstream msg;
if (!this->PrintMessagePreamble(t, msg))
{
@@ -2561,8 +2599,14 @@ void cmake::IssueMessage(cmake::MessageType t, std::string const& text,
//----------------------------------------------------------------------------
void cmake::IssueMessage(cmake::MessageType t, std::string const& text,
- cmListFileContext const& lfc)
+ cmListFileContext const& lfc,
+ bool force)
{
+ if (!force && !this->IsMessageTypeVisible(t))
+ {
+ return;
+ }
+
std::ostringstream msg;
if (!this->PrintMessagePreamble(t, msg))
{
diff --git a/Source/cmake.h b/Source/cmake.h
index 9d28cba..1cfba48 100644
--- a/Source/cmake.h
+++ b/Source/cmake.h
@@ -299,9 +299,11 @@ class cmake
/** Display a message to the user. */
void IssueMessage(cmake::MessageType t, std::string const& text,
- cmListFileBacktrace const& backtrace = cmListFileBacktrace());
+ cmListFileBacktrace const& backtrace = cmListFileBacktrace(),
+ bool force = false);
void IssueMessage(cmake::MessageType t, std::string const& text,
- cmListFileContext const& lfc);
+ cmListFileContext const& lfc,
+ bool force = false);
///! run the --build option
int Build(const std::string& dir,
@@ -405,6 +407,12 @@ private:
// Print a list of valid generators to stderr.
void PrintGeneratorList();
+ /*
+ * Check if messages of this type should be output, based on the state of the
+ * warning and error output CMake variables, in the cache.
+ */
+ bool IsMessageTypeVisible(cmake::MessageType t);
+
bool PrintMessagePreamble(cmake::MessageType t, std::ostream& msg);
};
diff --git a/Tests/RunCMake/message/nomessage.cmake b/Tests/RunCMake/message/nomessage.cmake
index bcc97be..0ff951a 100644
--- a/Tests/RunCMake/message/nomessage.cmake
+++ b/Tests/RunCMake/message/nomessage.cmake
@@ -1,2 +1,7 @@
+set(CMAKE_WARN_DEPRECATED OFF)
message(DEPRECATION "This is not issued")
+
+set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ON)
+
+message(AUTHOR_WARNING "This is not issued")
diff --git a/Tests/RunCMake/message/warnmessage-stderr.txt b/Tests/RunCMake/message/warnmessage-stderr.txt
index 5c44566..e60af6e 100644
--- a/Tests/RunCMake/message/warnmessage-stderr.txt
+++ b/Tests/RunCMake/message/warnmessage-stderr.txt
@@ -1,4 +1,11 @@
-CMake Deprecation Warning at warnmessage.cmake:4 \(message\):
- This is a warning
+^CMake Deprecation Warning at warnmessage.cmake:4 \(message\):
+ This is a deprecation warning
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
+
+
+CMake Warning \(dev\) at warnmessage.cmake:8 \(message\):
+ This is a author warning
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.$
diff --git a/Tests/RunCMake/message/warnmessage.cmake b/Tests/RunCMake/message/warnmessage.cmake
index 4c421a1..53f2a43 100644
--- a/Tests/RunCMake/message/warnmessage.cmake
+++ b/Tests/RunCMake/message/warnmessage.cmake
@@ -1,4 +1,8 @@
set(CMAKE_WARN_DEPRECATED ON)
-message(DEPRECATION "This is a warning")
+message(DEPRECATION "This is a deprecation warning")
+
+set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS OFF)
+
+message(AUTHOR_WARNING "This is a author warning")
--
2.1.4
-------------- next part --------------
From 102d07fa6b0f0232259db71438f9a4bd1c89fa45 Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 8 Nov 2015 12:59:27 +0000
Subject: [PATCH 3/7] Explicitly enable author warnings by default.
Explicitly enable author warnings by default, in
cmake::IsssueMessage. Add test cases for author and deprecated
messages displayed by default.
---
Source/cmake.cxx | 8 ++++++++
Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 3 +++
Tests/RunCMake/message/RunCMakeTest.cmake | 1 +
Tests/RunCMake/message/defaultmessage-result.txt | 1 +
Tests/RunCMake/message/defaultmessage-stderr.txt | 5 +++++
Tests/RunCMake/message/defaultmessage.cmake | 4 ++++
6 files changed, 22 insertions(+)
create mode 100644 Tests/RunCMake/message/defaultmessage-result.txt
create mode 100644 Tests/RunCMake/message/defaultmessage-stderr.txt
create mode 100644 Tests/RunCMake/message/defaultmessage.cmake
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 532c250..c52c782 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -1539,6 +1539,7 @@ int cmake::Run(const std::vector<std::string>& args, bool noconfigure)
{
this->AddCMakePaths();
}
+
// Add any cache args
if ( !this->SetCacheArgs(args) )
{
@@ -1546,6 +1547,13 @@ int cmake::Run(const std::vector<std::string>& args, bool noconfigure)
return -1;
}
+ // turn on author warnings by default
+ if (!this->DoSuppressDevWarnings)
+ {
+ this->SuppressDevWarnings = false;
+ this->DoSuppressDevWarnings = true;
+ }
+
// In script mode we terminate after running the script.
if(this->GetWorkingMode() != NORMAL_MODE)
{
diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
index 2d94e29..8eaaa08 100644
--- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
@@ -133,6 +133,9 @@ set(RunCMake_TEST_OPTIONS -Wno-dev -Wdev)
run_cmake(Wdev)
unset(RunCMake_TEST_OPTIONS)
+# Dev warnings should be on by default
+run_cmake(Wdev)
+
set(RunCMake_TEST_OPTIONS --debug-output)
run_cmake(debug-output)
unset(RunCMake_TEST_OPTIONS)
diff --git a/Tests/RunCMake/message/RunCMakeTest.cmake b/Tests/RunCMake/message/RunCMakeTest.cmake
index d2bc0c3..294dfbb 100644
--- a/Tests/RunCMake/message/RunCMakeTest.cmake
+++ b/Tests/RunCMake/message/RunCMakeTest.cmake
@@ -1,5 +1,6 @@
include(RunCMake)
+run_cmake(defaultmessage)
run_cmake(nomessage)
run_cmake(warnmessage)
run_cmake(errormessage)
diff --git a/Tests/RunCMake/message/defaultmessage-result.txt b/Tests/RunCMake/message/defaultmessage-result.txt
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/Tests/RunCMake/message/defaultmessage-result.txt
@@ -0,0 +1 @@
+0
diff --git a/Tests/RunCMake/message/defaultmessage-stderr.txt b/Tests/RunCMake/message/defaultmessage-stderr.txt
new file mode 100644
index 0000000..95656ec
--- /dev/null
+++ b/Tests/RunCMake/message/defaultmessage-stderr.txt
@@ -0,0 +1,5 @@
+^CMake Warning \(dev\) at defaultmessage.cmake:4 \(message\):
+ This is a author warning
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
+This warning is for project developers. Use -Wno-dev to suppress it.$
diff --git a/Tests/RunCMake/message/defaultmessage.cmake b/Tests/RunCMake/message/defaultmessage.cmake
new file mode 100644
index 0000000..427014d
--- /dev/null
+++ b/Tests/RunCMake/message/defaultmessage.cmake
@@ -0,0 +1,4 @@
+
+message(DEPRECATION "This is a deprecation warning")
+
+message(AUTHOR_WARNING "This is a author warning")
--
2.1.4
-------------- next part --------------
From 90dfc3fba3066394809615f85166760ab6ed8179 Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 8 Nov 2015 20:21:38 +0000
Subject: [PATCH 4/7] 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.
---
Source/cmake.cxx | 110 ++++++++++++++++-------
Source/cmake.h | 14 +--
Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 13 ++-
Tests/RunCMake/CommandLine/W_bad-arg1-result.txt | 1 +
Tests/RunCMake/CommandLine/W_bad-arg1-stderr.txt | 2 +
Tests/RunCMake/CommandLine/W_bad-arg2-result.txt | 1 +
Tests/RunCMake/CommandLine/W_bad-arg2-stderr.txt | 2 +
7 files changed, 104 insertions(+), 39 deletions(-)
create mode 100644 Tests/RunCMake/CommandLine/W_bad-arg1-result.txt
create mode 100644 Tests/RunCMake/CommandLine/W_bad-arg1-stderr.txt
create mode 100644 Tests/RunCMake/CommandLine/W_bad-arg2-result.txt
create mode 100644 Tests/RunCMake/CommandLine/W_bad-arg2-stderr.txt
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index c52c782..f3c36bd 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -127,8 +127,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;
@@ -250,15 +248,52 @@ 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;
- }
- else if(arg.find("-Wdev",0) == 0)
- {
- this->SuppressDevWarnings = false;
- 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-]<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)
{
@@ -591,11 +626,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
}
@@ -1190,25 +1221,28 @@ int cmake::HandleDeleteCacheVariables(const std::string& var)
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->
- AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "TRUE",
- "Suppress Warnings that are meant for"
- " the author of the CMakeLists.txt files.",
- cmState::INTERNAL);
+ this->AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "TRUE",
+ "Suppress Warnings that are meant for"
+ " the author of the CMakeLists.txt files.",
+ cmState::INTERNAL);
}
- else
+ else if (diagLevel == DIAG_WARN)
{
- this->
- AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "FALSE",
- "Suppress Warnings that are meant for"
- " the author of the CMakeLists.txt files.",
- cmState::INTERNAL);
+ this->AddCacheEntry("CMAKE_SUPPRESS_DEVELOPER_WARNINGS", "FALSE",
+ "Suppress Warnings that are meant for"
+ " the author of the CMakeLists.txt files.",
+ cmState::INTERNAL);
}
}
+
int ret = this->ActualConfigure();
const char* delCacheVars = this->State
->GetGlobalProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_");
@@ -1548,10 +1582,9 @@ int cmake::Run(const std::vector<std::string>& args, bool noconfigure)
}
// turn on author warnings by default
- if (!this->DoSuppressDevWarnings)
+ if (this->DiagLevels.count("dev") == 0)
{
- this->SuppressDevWarnings = false;
- this->DoSuppressDevWarnings = true;
+ this->DiagLevels["dev"] = DIAG_WARN;
}
// In script mode we terminate after running the script.
@@ -2774,3 +2807,18 @@ void cmake::RunCheckForUnusedVariables()
}
#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);
+ }
+}
diff --git a/Source/cmake.h b/Source/cmake.h
index 1cfba48..5debc5a 100644
--- a/Source/cmake.h
+++ b/Source/cmake.h
@@ -68,6 +68,11 @@ class cmake
DEPRECATION_WARNING
};
+ enum DiagLevel
+ {
+ DIAG_IGNORE,
+ DIAG_WARN
+ };
/** \brief Describes the working modes of cmake */
enum WorkingMode
@@ -291,11 +296,7 @@ class cmake
std::string const& GetCMakeEditCommand() const
{ return this->CMakeEditCommand; }
- void SetSuppressDevWarnings(bool v)
- {
- this->SuppressDevWarnings = v;
- this->DoSuppressDevWarnings = true;
- }
+ void SetSuppressDevWarnings(bool b);
/** Display a message to the user. */
void IssueMessage(cmake::MessageType t, std::string const& text,
@@ -341,8 +342,7 @@ protected:
cmGlobalGenerator *GlobalGenerator;
cmCacheManager *CacheManager;
- bool SuppressDevWarnings;
- bool DoSuppressDevWarnings;
+ std::map<std::string, DiagLevel> DiagLevels;
std::string GeneratorPlatform;
std::string GeneratorToolset;
diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
index 8eaaa08..d4f399c 100644
--- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
@@ -129,13 +129,24 @@ set(RunCMake_TEST_OPTIONS -Wno-dev)
run_cmake(Wno-dev)
unset(RunCMake_TEST_OPTIONS)
-set(RunCMake_TEST_OPTIONS -Wno-dev -Wdev)
+set(RunCMake_TEST_OPTIONS -Wdev)
run_cmake(Wdev)
unset(RunCMake_TEST_OPTIONS)
# Dev warnings should be on by default
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)
run_cmake(debug-output)
unset(RunCMake_TEST_OPTIONS)
diff --git a/Tests/RunCMake/CommandLine/W_bad-arg1-result.txt b/Tests/RunCMake/CommandLine/W_bad-arg1-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/W_bad-arg1-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/W_bad-arg1-stderr.txt b/Tests/RunCMake/CommandLine/W_bad-arg1-stderr.txt
new file mode 100644
index 0000000..0c0f613
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/W_bad-arg1-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error: -W must be followed with \[no-\]<name>.
+CMake Error: Problem processing arguments. Aborting.
diff --git a/Tests/RunCMake/CommandLine/W_bad-arg2-result.txt b/Tests/RunCMake/CommandLine/W_bad-arg2-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/W_bad-arg2-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CommandLine/W_bad-arg2-stderr.txt b/Tests/RunCMake/CommandLine/W_bad-arg2-stderr.txt
new file mode 100644
index 0000000..cc643df
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/W_bad-arg2-stderr.txt
@@ -0,0 +1,2 @@
+CMake Error: No warning name provided.
+CMake Error: Problem processing arguments. Aborting.
--
2.1.4
-------------- next part --------------
From 7f9d5ee97f0952fe5e48ae19815cfd605b07a0da Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 8 Nov 2015 23:06:33 +0000
Subject: [PATCH 5/7] Add -W options to control deprecated warning messages.
Add 'deprecated' warning options type, to allow setting
CMAKE_WARN_DEPRECATED via the -W '-Wdeprecated' and
'-Wno-deprecated' options.
Add tests for new options and updated documentation.
---
Help/manual/OPTIONS_BUILD.txt | 12 ++++++++++++
Help/variable/CMAKE_WARN_DEPRECATED.rst | 9 ++++++---
Source/cmake.cxx | 21 +++++++++++++++++++++
Source/cmake.h | 4 +++-
Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 8 ++++++++
Tests/RunCMake/CommandLine/Wdeprecated-stderr.txt | 4 ++++
Tests/RunCMake/CommandLine/Wdeprecated.cmake | 1 +
Tests/RunCMake/CommandLine/Wno-deprecated.cmake | 1 +
8 files changed, 56 insertions(+), 4 deletions(-)
create mode 100644 Tests/RunCMake/CommandLine/Wdeprecated-stderr.txt
create mode 100644 Tests/RunCMake/CommandLine/Wdeprecated.cmake
create mode 100644 Tests/RunCMake/CommandLine/Wno-deprecated.cmake
diff --git a/Help/manual/OPTIONS_BUILD.txt b/Help/manual/OPTIONS_BUILD.txt
index 4207db4..eec138c 100644
--- a/Help/manual/OPTIONS_BUILD.txt
+++ b/Help/manual/OPTIONS_BUILD.txt
@@ -84,3 +84,15 @@
Enable warnings that are meant for the author of the CMakeLists.txt
files.
+
+``-Wdeprecated``
+ Enable deprecated functionality warnings.
+
+ Enable warnings for usage of deprecated functionality, that are meant
+ for the author of the CMakeLists.txt files.
+
+``-Wno-deprecated``
+ Suppress deprecated functionality warnings.
+
+ Suppress warnings for usage of deprecated functionality, that are meant
+ for the author of the CMakeLists.txt files.
diff --git a/Help/variable/CMAKE_WARN_DEPRECATED.rst b/Help/variable/CMAKE_WARN_DEPRECATED.rst
index 662cbd8..4a224fa 100644
--- a/Help/variable/CMAKE_WARN_DEPRECATED.rst
+++ b/Help/variable/CMAKE_WARN_DEPRECATED.rst
@@ -1,7 +1,10 @@
CMAKE_WARN_DEPRECATED
---------------------
-Whether to issue deprecation warnings for macros and functions.
+Whether to issue warnings for deprecated functionality.
-If ``TRUE``, this can be used by macros and functions to issue deprecation
-warnings. This variable is ``FALSE`` by default.
+If not ``FALSE``, use of deprecated functionality will issue warnings.
+If this variable is not set, CMake behaves as if it were set to ``TRUE``.
+
+When running :manual:`cmake(1)`, this option can be enabled with the
+``-Wdeprecated`` option, or disabled with the ``-Wno-deprecated`` option.
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index f3c36bd..e9de1b4 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -1223,6 +1223,26 @@ int cmake::Configure()
{
DiagLevel diagLevel;
+ if (this->DiagLevels.count("deprecated") == 1)
+ {
+
+ diagLevel = this->DiagLevels["deprecated"];
+ if (diagLevel == DIAG_IGNORE)
+ {
+ this->AddCacheEntry("CMAKE_WARN_DEPRECATED", "FALSE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ }
+ else if (diagLevel == DIAG_WARN)
+ {
+ this->AddCacheEntry("CMAKE_WARN_DEPRECATED", "TRUE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ }
+ }
+
if (this->DiagLevels.count("dev") == 1)
{
@@ -1243,6 +1263,7 @@ int cmake::Configure()
}
}
+
int ret = this->ActualConfigure();
const char* delCacheVars = this->State
->GetGlobalProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_");
diff --git a/Source/cmake.h b/Source/cmake.h
index 5debc5a..bc70033 100644
--- a/Source/cmake.h
+++ b/Source/cmake.h
@@ -424,7 +424,9 @@ 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."},\
+ {"-Wdeprecated", "Enable deprecation warnings."},\
+ {"-Wno-deprecated", "Suppress deprecation warnings."}
#define FOR_EACH_C_FEATURE(F) \
F(c_function_prototypes) \
diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
index d4f399c..f726ae2 100644
--- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
@@ -133,6 +133,14 @@ set(RunCMake_TEST_OPTIONS -Wdev)
run_cmake(Wdev)
unset(RunCMake_TEST_OPTIONS)
+set(RunCMake_TEST_OPTIONS -Wdeprecated)
+run_cmake(Wdeprecated)
+unset(RunCMake_TEST_OPTIONS)
+
+set(RunCMake_TEST_OPTIONS -Wno-deprecated)
+run_cmake(Wno-deprecated)
+unset(RunCMake_TEST_OPTIONS)
+
# Dev warnings should be on by default
run_cmake(Wdev)
diff --git a/Tests/RunCMake/CommandLine/Wdeprecated-stderr.txt b/Tests/RunCMake/CommandLine/Wdeprecated-stderr.txt
new file mode 100644
index 0000000..e9be1dc
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/Wdeprecated-stderr.txt
@@ -0,0 +1,4 @@
+^CMake Deprecation Warning at Wdeprecated.cmake:1 \(message\):
+ Some deprecated warning
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/CommandLine/Wdeprecated.cmake b/Tests/RunCMake/CommandLine/Wdeprecated.cmake
new file mode 100644
index 0000000..3142b42
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/Wdeprecated.cmake
@@ -0,0 +1 @@
+message(DEPRECATION "Some deprecated warning")
diff --git a/Tests/RunCMake/CommandLine/Wno-deprecated.cmake b/Tests/RunCMake/CommandLine/Wno-deprecated.cmake
new file mode 100644
index 0000000..3142b42
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/Wno-deprecated.cmake
@@ -0,0 +1 @@
+message(DEPRECATION "Some deprecated warning")
--
2.1.4
-------------- next part --------------
From 89e754737db64ea3009ef4b651f4f05b048a435f Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 8 Nov 2015 23:16:58 +0000
Subject: [PATCH 6/7] Consistent documentation for deprecation message
variables.
Make the documentation for the 'CMAKE_ERROR_DEPRECATED' CMake
variable consistent with the documentation for the
'CMAKE_WARN_DEPRECATED' CMake variable, in terms of wording.
---
Help/variable/CMAKE_ERROR_DEPRECATED.rst | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/Help/variable/CMAKE_ERROR_DEPRECATED.rst b/Help/variable/CMAKE_ERROR_DEPRECATED.rst
index 277a4cc..f3a6738 100644
--- a/Help/variable/CMAKE_ERROR_DEPRECATED.rst
+++ b/Help/variable/CMAKE_ERROR_DEPRECATED.rst
@@ -1,8 +1,7 @@
CMAKE_ERROR_DEPRECATED
----------------------
-Whether to issue deprecation errors for macros and functions.
+Whether to issue errors for deprecated functionality.
-If ``TRUE``, this can be used by macros and functions to issue fatal
-errors when deprecated macros or functions are used. This variable is
-``FALSE`` by default.
+If ``TRUE``, use of deprecated functionality will issue fatal errors.
+If this variable is not set, CMake behaves as if it were set to ``FALSE``.
--
2.1.4
-------------- next part --------------
From fd3aaf3b0aae12b3751ef526af42ed576192b0b3 Mon Sep 17 00:00:00 2001
From: Michael Scott <michael.scott250 at gmail.com>
Date: Sun, 8 Nov 2015 23:34:59 +0000
Subject: [PATCH 7/7] Modify dev warning options to affect deprecated warnings.
Change the '-Wdev' and '-Wno-dev' options to also enable and
suppress the deprecated warnings output, via the
'CMAKE_WARN_DEPRECATED' CMake variable, by default. This
action does not happen if the user specifies a deprecated
warning message option.
Add tests and update the documentation for the new
functionality.
---
Help/manual/OPTIONS_BUILD.txt | 5 +++--
Source/cmake.cxx | 28 +++++++++++++++++++++++-
Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 16 ++++++++++++++
Tests/RunCMake/message/defaultmessage-stderr.txt | 8 ++++++-
4 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/Help/manual/OPTIONS_BUILD.txt b/Help/manual/OPTIONS_BUILD.txt
index eec138c..977264c 100644
--- a/Help/manual/OPTIONS_BUILD.txt
+++ b/Help/manual/OPTIONS_BUILD.txt
@@ -77,13 +77,14 @@
Suppress developer warnings.
Suppress warnings that are meant for the author of the
- CMakeLists.txt files.
+ CMakeLists.txt files. By default this will also turn off
+ deprecation warnings.
``-Wdev``
Enable developer warnings.
Enable warnings that are meant for the author of the CMakeLists.txt
- files.
+ files. By default this will also turn on deprecation warnings.
``-Wdeprecated``
Enable deprecated functionality warnings.
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index e9de1b4..bf209c8 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -1245,6 +1245,16 @@ int cmake::Configure()
if (this->DiagLevels.count("dev") == 1)
{
+ bool setDeprecatedVariables = false;
+
+ const char* cachedWarnDeprecated =
+ this->State->GetCacheEntryValue("CMAKE_WARN_DEPRECATED");
+
+ // don't overwrite deprecated warning setting from a previous invocation
+ if (!cachedWarnDeprecated)
+ {
+ setDeprecatedVariables = true;
+ }
diagLevel = this->DiagLevels["dev"];
if (diagLevel == DIAG_IGNORE)
@@ -1253,6 +1263,14 @@ int cmake::Configure()
"Suppress Warnings that are meant for"
" the author of the CMakeLists.txt files.",
cmState::INTERNAL);
+
+ if (setDeprecatedVariables)
+ {
+ this->AddCacheEntry("CMAKE_WARN_DEPRECATED", "FALSE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ }
}
else if (diagLevel == DIAG_WARN)
{
@@ -1260,6 +1278,14 @@ int cmake::Configure()
"Suppress Warnings that are meant for"
" the author of the CMakeLists.txt files.",
cmState::INTERNAL);
+
+ if (setDeprecatedVariables)
+ {
+ this->AddCacheEntry("CMAKE_WARN_DEPRECATED", "TRUE",
+ "Whether to issue deprecation warnings for"
+ " macros and functions.",
+ cmState::BOOL);
+ }
}
}
@@ -1602,7 +1628,7 @@ int cmake::Run(const std::vector<std::string>& args, bool noconfigure)
return -1;
}
- // turn on author warnings by default
+ // turn on author, and in turn deprecated, warnings (only) by default
if (this->DiagLevels.count("dev") == 0)
{
this->DiagLevels["dev"] = DIAG_WARN;
diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
index f726ae2..6b4b384 100644
--- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake
@@ -133,6 +133,19 @@ set(RunCMake_TEST_OPTIONS -Wdev)
run_cmake(Wdev)
unset(RunCMake_TEST_OPTIONS)
+# -Wdev should not override deprecated options if specified
+set(RunCMake_TEST_OPTIONS -Wdev -Wno-deprecated)
+run_cmake(Wno-deprecated)
+unset(RunCMake_TEST_OPTIONS)
+set(RunCMake_TEST_OPTIONS -Wno-deprecated -Wdev)
+run_cmake(Wno-deprecated)
+unset(RunCMake_TEST_OPTIONS)
+
+# -Wdev should enable deprecated warnings as well
+set(RunCMake_TEST_OPTIONS -Wdev)
+run_cmake(Wdeprecated)
+unset(RunCMake_TEST_OPTIONS)
+
set(RunCMake_TEST_OPTIONS -Wdeprecated)
run_cmake(Wdeprecated)
unset(RunCMake_TEST_OPTIONS)
@@ -144,6 +157,9 @@ unset(RunCMake_TEST_OPTIONS)
# Dev warnings should be on by default
run_cmake(Wdev)
+# Deprecated warnings should be on by default
+run_cmake(Wdeprecated)
+
# Conflicting -W options should honor the last value
set(RunCMake_TEST_OPTIONS -Wno-dev -Wdev)
run_cmake(Wdev)
diff --git a/Tests/RunCMake/message/defaultmessage-stderr.txt b/Tests/RunCMake/message/defaultmessage-stderr.txt
index 95656ec..dd1b28f 100644
--- a/Tests/RunCMake/message/defaultmessage-stderr.txt
+++ b/Tests/RunCMake/message/defaultmessage-stderr.txt
@@ -1,4 +1,10 @@
-^CMake Warning \(dev\) at defaultmessage.cmake:4 \(message\):
+^CMake Deprecation Warning at defaultmessage.cmake:2 \(message\):
+ This is a deprecation warning
+Call Stack \(most recent call first\):
+ CMakeLists.txt:3 \(include\)
+
+
+CMake Warning \(dev\) at defaultmessage.cmake:4 \(message\):
This is a author warning
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
--
2.1.4
More information about the cmake-developers
mailing list