Commit 05f5fde0 authored by Stephen Kelly's avatar Stephen Kelly
Browse files

Disallow invalid target names (#13140)

Exclude Borland and NMake from the CMP0037 test. They do not accept
the colon in a target name.
parent 18985f6c
......@@ -70,3 +70,4 @@ All Policies
/policy/CMP0034
/policy/CMP0035
/policy/CMP0036
/policy/CMP0037
CMP0037
-------
Target names should match a validity pattern.
CMake 2.8.12 and lower allowed creating targets using :command:`add_library` and
:command:`add_executable` with unrestricted choice for the target name. Newer
cmake features such as :manual:`cmake-generator-expressions(7)` and some
diagnostics expect target names to match a restricted pattern.
Target names may contain upper and lower case letters, numbers, the underscore
character (_), dot(.), plus(+) and minus(-). As a special case, ALIAS
targets and INTERFACE library targets may contain two consequtive colons.
The OLD behavior for this policy is to allow creating targets which do not match
the validity pattern. The NEW behavior for this policy is to report an error
if an add_* command is used with an invalid target name.
This policy was introduced in CMake version 3.0.0. CMake version
|release| warns when the policy is not set and uses OLD behavior. Use
the cmake_policy command to set it to OLD or NEW explicitly.
......@@ -69,6 +69,44 @@ bool cmAddExecutableCommand
}
}
bool nameOk = cmGeneratorExpression::IsValidTargetName(exename);
if (nameOk && !importTarget && !isAlias)
{
nameOk = exename.find(":") == std::string::npos;
}
if (!nameOk)
{
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
bool issueMessage = false;
switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0037))
{
case cmPolicies::WARN:
issueMessage = true;
case cmPolicies::OLD:
break;
case cmPolicies::NEW:
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
issueMessage = true;
messageType = cmake::FATAL_ERROR;
}
if (issueMessage)
{
cmOStringStream e;
e << (this->Makefile->GetPolicies()
->GetPolicyWarning(cmPolicies::CMP0037)) << "\n";
e << "The target name \"" << exename << "\" is not valid for certain "
"CMake features, such as generator expressions, and may result "
"in undefined behavior.";
this->Makefile->IssueMessage(messageType, e.str().c_str());
if (messageType == cmake::FATAL_ERROR)
{
return false;
}
}
}
// Special modifiers are not allowed with IMPORTED signature.
if(importTarget
&& (use_win32 || use_macbundle || excludeFromAll))
......
......@@ -108,6 +108,45 @@ bool cmAddLibraryCommand
break;
}
}
bool nameOk = cmGeneratorExpression::IsValidTargetName(libName);
if (nameOk && !importTarget && !isAlias)
{
nameOk = libName.find(":") == std::string::npos;
}
if (!nameOk)
{
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
bool issueMessage = false;
switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0037))
{
case cmPolicies::WARN:
issueMessage = type != cmTarget::INTERFACE_LIBRARY;
case cmPolicies::OLD:
break;
case cmPolicies::NEW:
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
issueMessage = true;
messageType = cmake::FATAL_ERROR;
}
if (issueMessage)
{
cmOStringStream e;
e << (this->Makefile->GetPolicies()
->GetPolicyWarning(cmPolicies::CMP0037)) << "\n";
e << "The target name \"" << libName << "\" is not valid for certain "
"CMake features, such as generator expressions, and may result "
"in undefined behavior.";
this->Makefile->IssueMessage(messageType, e.str().c_str());
if (messageType == cmake::FATAL_ERROR)
{
return false;
}
}
}
if (isAlias)
{
if(!cmGeneratorExpression::IsValidTargetName(libName.c_str()))
......
......@@ -286,6 +286,11 @@ cmPolicies::cmPolicies()
CMP0036, "CMP0036",
"The build_name command should not be called.",
3,0,0,0, cmPolicies::WARN);
this->DefinePolicy(
CMP0037, "CMP0037",
"Target names should match a validity pattern.",
3,0,0,0, cmPolicies::WARN);
}
cmPolicies::~cmPolicies()
......
......@@ -88,6 +88,7 @@ public:
CMP0034, ///< Disallow command: utility_source
CMP0035, ///< Disallow command: variable_requires
CMP0036, ///< Disallow command: build_name
CMP0037, ///< Target names should match a validity pattern.
/** \brief Always the last entry.
*
......
CMake Error at CMP0037-NEW.cmake:4 \(add_library\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "lib with spaces" is not valid for certain CMake features,
such as generator expressions, and may result in undefined behavior.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
+
CMake Error at CMP0037-NEW.cmake:5 \(add_executable\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "exe with spaces" is not valid for certain CMake features,
such as generator expressions, and may result in undefined behavior.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
+
CMake Error at CMP0037-NEW.cmake:6 \(add_library\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "lib:colon" is not valid for certain CMake features, such
as generator expressions, and may result in undefined behavior.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
+
CMake Error at CMP0037-NEW.cmake:7 \(add_executable\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "exe:colon" is not valid for certain CMake features, such
as generator expressions, and may result in undefined behavior.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
cmake_policy(SET CMP0037 NEW)
add_library("lib with spaces" empty.cpp)
add_executable("exe with spaces" empty.cpp)
add_library("lib:colon" empty.cpp)
add_executable("exe:colon" empty.cpp)
cmake_policy(SET CMP0037 OLD)
add_library("lib with spaces" empty.cpp)
add_executable("exe with spaces" empty.cpp)
CMake Warning \(dev\) at CMP0037-WARN.cmake:2 \(add_library\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "lib with spaces" is not valid for certain CMake features,
such as generator expressions, and may result in undefined behavior.
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 CMP0037-WARN.cmake:3 \(add_executable\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "exe with spaces" is not valid for certain CMake features,
such as generator expressions, and may result in undefined behavior.
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 CMP0037-WARN.cmake:4 \(add_library\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "lib:colon" is not valid for certain CMake features, such
as generator expressions, and may result in undefined behavior.
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 CMP0037-WARN.cmake:5 \(add_executable\):
Policy CMP0037 is not set: Target names should match a validity pattern.
Run "cmake --help-policy CMP0037" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The target name "exe:colon" is not valid for certain CMake features, such
as generator expressions, and may result in undefined behavior.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
add_library("lib with spaces" empty.cpp)
add_executable("exe with spaces" empty.cpp)
add_library("lib:colon" empty.cpp)
add_executable("exe:colon" empty.cpp)
cmake_minimum_required(VERSION 2.8.4)
project(${RunCMake_TEST} CXX)
include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)
include(RunCMake)
run_cmake(CMP0037-NEW)
run_cmake(CMP0037-OLD)
run_cmake(CMP0037-WARN)
#ifdef _WIN32
__declspec(dllexport)
#endif
int empty()
{
return 0;
}
......@@ -56,6 +56,9 @@ add_RunCMake_test(CMP0022)
add_RunCMake_test(CMP0026)
add_RunCMake_test(CMP0027)
add_RunCMake_test(CMP0028)
if (NOT "${CMAKE_TEST_GENERATOR}" MATCHES "(MSYS|MinGW|NMake|Borland) Makefiles")
add_RunCMake_test(CMP0037)
endif()
add_RunCMake_test(CTest)
if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
add_RunCMake_test(CompilerChange)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment