cmake: Enable --warn-uninitialized inside string(CONFIGURE) and configure_file

Fixes: #18489
This commit is contained in:
Artur Ryt 2018-12-13 20:45:17 +01:00 committed by Craig Scott
parent 1d32a35c10
commit cbf0c0fce4
6 changed files with 88 additions and 16 deletions

View File

@ -92,9 +92,11 @@ const char* cmCommandArgumentParserHelper::ExpandVariable(const char* var)
return this->AddString(ostr.str());
}
const char* value = this->Makefile->GetDefinition(var);
if (!value && !this->RemoveEmpty) {
if (!value) {
this->Makefile->MaybeWarnUninitialized(var, this->FileName);
return nullptr;
if (!this->RemoveEmpty) {
return nullptr;
}
}
if (this->EscapeQuotes && value) {
return this->AddString(cmSystemTools::EscapeQuotes(value));

View File

@ -2522,9 +2522,9 @@ const std::string& cmMakefile::ExpandVariablesInString(
// Suppress variable watches to avoid calling hooks twice. Suppress new
// dereferences since the OLD behavior is still what is actually used.
this->SuppressSideEffects = true;
newError = ExpandVariablesInStringNew(
newErrorstr, newResult, escapeQuotes, noEscapes, atOnly, filename,
line, removeEmpty, replaceAt);
newError = ExpandVariablesInStringNew(newErrorstr, newResult,
escapeQuotes, noEscapes, atOnly,
filename, line, replaceAt);
this->SuppressSideEffects = false;
CM_FALLTHROUGH;
}
@ -2537,9 +2537,9 @@ const std::string& cmMakefile::ExpandVariablesInString(
case cmPolicies::REQUIRED_ALWAYS:
// Messaging here would be *very* verbose.
case cmPolicies::NEW:
mtype = ExpandVariablesInStringNew(errorstr, source, escapeQuotes,
noEscapes, atOnly, filename, line,
removeEmpty, replaceAt);
mtype =
ExpandVariablesInStringNew(errorstr, source, escapeQuotes, noEscapes,
atOnly, filename, line, replaceAt);
break;
}
@ -2726,7 +2726,7 @@ bool cmMakefile::IsProjectFile(const char* filename) const
cmake::MessageType cmMakefile::ExpandVariablesInStringNew(
std::string& errorstr, std::string& source, bool escapeQuotes,
bool noEscapes, bool atOnly, const char* filename, long line,
bool removeEmpty, bool replaceAt) const
bool replaceAt) const
{
// This method replaces ${VAR} and @VAR@ where VAR is looked up
// with GetDefinition(), if not found in the map, nothing is expanded.
@ -2783,7 +2783,7 @@ cmake::MessageType cmMakefile::ExpandVariablesInStringNew(
} else {
varresult = value;
}
} else if (!removeEmpty && !this->SuppressSideEffects) {
} else if (!this->SuppressSideEffects) {
this->MaybeWarnUninitialized(lookup, filename);
}
result.replace(var.loc, result.size() - var.loc, varresult);
@ -2896,7 +2896,12 @@ cmake::MessageType cmMakefile::ExpandVariablesInStringNew(
if (filename && variable == lineVar) {
varresult = std::to_string(line);
} else {
varresult = this->GetSafeDefinition(variable);
const std::string* def = this->GetDef(variable);
if (def) {
varresult = *def;
} else if (!this->SuppressSideEffects) {
this->MaybeWarnUninitialized(variable, filename);
}
}
if (escapeQuotes) {

View File

@ -990,7 +990,7 @@ private:
cmake::MessageType ExpandVariablesInStringNew(
std::string& errorstr, std::string& source, bool escapeQuotes,
bool noEscapes, bool atOnly, const char* filename, long line,
bool removeEmpty, bool replaceAt) const;
bool replaceAt) const;
/**
* Old version of GetSourceFileWithOutput(const std::string&) kept for
* backward-compatibility. It implements a linear search and support

View File

@ -350,7 +350,7 @@ set(RunCMake_TEST_OPTIONS --trace-expand --warn-uninitialized)
run_cmake(trace-expand-warn-uninitialized)
unset(RunCMake_TEST_OPTIONS)
set(RunCMake_TEST_OPTIONS --warn-uninitialized)
set(RunCMake_TEST_OPTIONS -Wno-deprecated --warn-uninitialized)
run_cmake(warn-uninitialized)
unset(RunCMake_TEST_OPTIONS)

View File

@ -1,5 +1,53 @@
^CMake Warning \(dev\) at warn-uninitialized.cmake:1 \(set\):
uninitialized variable 'WARN_FROM_NORMAL_CMAKE_FILE'
^CMake Warning \(dev\) at warn-uninitialized.cmake:3 \(set\):
uninitialized variable 'OLD_WARN_FROM_NORMAL_CMAKE_FILE_INSIDE_BRACES'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:4 \(set\):
uninitialized variable 'OLD_WARN_FROM_NORMAL_CMAKE_FILE_IN_ATS'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:5 \(string\):
uninitialized variable 'OLD_WARN_FROM_STRING_CONFIGURE_INSIDE_BRACES'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:7 \(configure_file\):
uninitialized variable 'OLD_WARN_FROM_CONFIGURE_FILE_INSIDE_AT'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:8 \(string\):
uninitialized variable 'OLD_WARN_FROM_STRING_CONFIGURE_INSIDE_AT'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:13 \(set\):
uninitialized variable 'NEW_WARN_FROM_NORMAL_CMAKE_FILE_INSIDE_BRACES'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:14 \(string\):
uninitialized variable 'NEW_WARN_FROM_STRING_CONFIGURE_INSIDE_BRACES'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:16 \(configure_file\):
uninitialized variable 'NEW_WARN_FROM_CONFIGURE_FILE_INSIDE_AT'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning \(dev\) at warn-uninitialized.cmake:17 \(string\):
uninitialized variable 'NEW_WARN_FROM_STRING_CONFIGURE_INSIDE_AT'
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.$

View File

@ -1 +1,18 @@
set(FOO "${WARN_FROM_NORMAL_CMAKE_FILE}")
cmake_policy(PUSH)
cmake_policy(SET CMP0053 OLD)
set(FOO "${OLD_WARN_FROM_NORMAL_CMAKE_FILE_INSIDE_BRACES}")
set(FOO "@OLD_WARN_FROM_NORMAL_CMAKE_FILE_IN_ATS@")
string(CONFIGURE "\${OLD_WARN_FROM_STRING_CONFIGURE_INSIDE_BRACES}" OUT1)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/file1.in "\@OLD_WARN_FROM_CONFIGURE_FILE_INSIDE_AT\@")
configure_file(${CMAKE_CURRENT_BINARY_DIR}/file1.in file1.out)
string(CONFIGURE "\@OLD_WARN_FROM_STRING_CONFIGURE_INSIDE_AT\@" OUT2)
cmake_policy(POP)
cmake_policy(PUSH)
cmake_policy(SET CMP0053 NEW)
set(FOO "${NEW_WARN_FROM_NORMAL_CMAKE_FILE_INSIDE_BRACES}")
string(CONFIGURE "\${NEW_WARN_FROM_STRING_CONFIGURE_INSIDE_BRACES}" OUT3)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/file2.in "\@NEW_WARN_FROM_CONFIGURE_FILE_INSIDE_AT\@")
configure_file(${CMAKE_CURRENT_BINARY_DIR}/file2.in file2.out)
string(CONFIGURE "@NEW_WARN_FROM_STRING_CONFIGURE_INSIDE_AT@" OUT4)
cmake_policy(POP)