Merge topic 'backward-compatibility'

f2eee72f add_custom_command: Disallow use of SOURCE signatures.
c248a437 Add policy CMP0049 to avoid variable expansion in source lists
This commit is contained in:
Brad King 2014-02-12 11:31:30 -05:00 committed by CMake Topic Stage
commit 54d9e01487
34 changed files with 250 additions and 0 deletions

View File

@ -100,3 +100,5 @@ All Policies
/policy/CMP0046
/policy/CMP0047
/policy/CMP0048
/policy/CMP0049
/policy/CMP0050

23
Help/policy/CMP0049.rst Normal file
View File

@ -0,0 +1,23 @@
CMP0049
-------
Do not expand variables in target source entries.
CMake 2.8.12 and lower performed and extra layer of variable expansion
when evaluating source file names:
.. code-block:: cmake
set(a_source foo.c)
add_executable(foo \${a_source})
This was undocumented behavior.
The OLD behavior for this policy is to expand such variables when processing
the target sources. The NEW behavior for this policy is to issue an error
if such variables need to be expanded.
This policy was introduced in CMake version 3.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.

18
Help/policy/CMP0050.rst Normal file
View File

@ -0,0 +1,18 @@
CMP0050
-------
Disallow add_custom_command SOURCE signatures.
CMake 2.8.12 and lower allowed a signature for :command:`add_custom_command`
which specified an input to a command. This was undocumented behavior.
Modern use of CMake associates custom commands with their output, rather
than their input.
The OLD behavior for this policy is to allow the use of
:command:`add_custom_command` SOURCE signatures. The NEW behavior for this
policy is to issue an error if such a signature is used.
This policy was introduced in CMake version 3.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.

View File

@ -322,6 +322,14 @@ New Diagnostics
messages up front and stops processing when no working compiler
is known to be available.
* Target sources specified with the :command:`add_library` or
:command:`add_executable` command learned to reject items which
require an undocumented extra layer of variable expansion.
See policy :policy:`CMP0049`.
* Use of :command:`add_custom_command` undocumented ``SOURCE``
signatures now results in an error. See policy :policy:`CMP0050`.
Deprecated and Removed Features
===============================

View File

@ -344,6 +344,36 @@ bool cmAddCustomCommandCommand
}
else
{
bool issueMessage = true;
cmOStringStream e;
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0050))
{
case cmPolicies::WARN:
e << (this->Makefile->GetPolicies()
->GetPolicyWarning(cmPolicies::CMP0050)) << "\n";
break;
case cmPolicies::OLD:
issueMessage = false;
break;
case cmPolicies::REQUIRED_ALWAYS:
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::NEW:
messageType = cmake::FATAL_ERROR;
break;
}
if (issueMessage)
{
e << "The SOURCE signatures of add_custom_command are no longer "
"supported.";
this->Makefile->IssueMessage(messageType, e.str().c_str());
if (messageType == cmake::FATAL_ERROR)
{
return false;
}
}
// Use the old-style mode for backward compatibility.
this->Makefile->AddCustomCommandOldStyle(target.c_str(), outputs, depends,
source.c_str(), commandLines,

View File

@ -333,6 +333,16 @@ cmPolicies::cmPolicies()
CMP0048, "CMP0048",
"project() command manages VERSION variables.",
3,0,0, cmPolicies::WARN);
this->DefinePolicy(
CMP0049, "CMP0049",
"Do not expand variables in target source entries.",
3,0,0, cmPolicies::WARN);
this->DefinePolicy(
CMP0050, "CMP0050",
"Disallow add_custom_command SOURCE signatures.",
3,0,0, cmPolicies::WARN);
}
cmPolicies::~cmPolicies()

View File

@ -102,6 +102,8 @@ public:
CMP0046, ///< Error on non-existent dependency in add_dependencies
CMP0047, ///< Use QCC compiler id for the qcc drivers on QNX.
CMP0048, ///< project() command manages VERSION variables
CMP0049, ///< Do not expand variables in target source entries
CMP0050, ///< Disallow add_custom_command SOURCE signatures
/** \brief Always the last entry.
*

View File

@ -590,6 +590,38 @@ cmSourceFile* cmTarget::AddSource(const char* s)
// For backwards compatibility replace varibles in source names.
// This should eventually be removed.
this->Makefile->ExpandVariablesInString(src);
if (src != s)
{
cmOStringStream e;
bool noMessage = false;
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0049))
{
case cmPolicies::WARN:
e << (this->Makefile->GetPolicies()
->GetPolicyWarning(cmPolicies::CMP0049)) << "\n";
break;
case cmPolicies::OLD:
noMessage = true;
break;
case cmPolicies::REQUIRED_ALWAYS:
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::NEW:
messageType = cmake::FATAL_ERROR;
}
if (!noMessage)
{
e << "Legacy variable expansion in source file \""
<< s << "\" expanded to \"" << src << "\" in target \""
<< this->GetName() << "\". This behavior will be removed in a "
"future version of CMake.";
this->Makefile->IssueMessage(messageType, e.str().c_str());
if (messageType == cmake::FATAL_ERROR)
{
return 0;
}
}
}
cmSourceFile* sf = this->Makefile->GetOrCreateSource(src.c_str());
this->AddSourceFile(sf);

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,6 @@
CMake Error at CMP0049-NEW.cmake:5 \(add_library\):
Legacy variable expansion in source file "\${tgt_srcs}" expanded to
"empty.cpp" in target "tgt". This behavior will be removed in a future
version of CMake.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)

View File

@ -0,0 +1,5 @@
cmake_policy(SET CMP0049 NEW)
set(tgt_srcs empty.cpp)
add_library(tgt \${tgt_srcs})

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,5 @@
cmake_policy(SET CMP0049 OLD)
set(tgt_srcs empty.cpp)
add_library(tgt \${tgt_srcs})

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,11 @@
CMake Warning \(dev\) at CMP0049-WARN.cmake:3 \(add_library\):
Policy CMP0049 is not set: Do not expand variables in target source
entries. Run "cmake --help-policy CMP0049" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Legacy variable expansion in source file "\${tgt_srcs}" expanded to
"empty.cpp" in target "tgt". This behavior will be removed in a future
version of CMake.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.

View File

@ -0,0 +1,3 @@
set(tgt_srcs empty.cpp)
add_library(tgt \${tgt_srcs})

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 2.8.12)
project(${RunCMake_TEST} CXX)
include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)

View File

@ -0,0 +1,5 @@
include(RunCMake)
run_cmake(CMP0049-OLD)
run_cmake(CMP0049-NEW)
run_cmake(CMP0049-WARN)

View File

@ -0,0 +1,7 @@
#ifdef _WIN32
__declspec(dllexport)
#endif
int empty()
{
return 0;
}

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,4 @@
CMake Error at CMP0050-NEW.cmake:5 \(add_custom_command\):
The SOURCE signatures of add_custom_command are no longer supported.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)

View File

@ -0,0 +1,13 @@
cmake_policy(SET CMP0050 NEW)
add_library(empty empty.cpp)
add_custom_command(
TARGET empty
SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/input.h.in
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.h.in
${CMAKE_CURRENT_BINARY_DIR}/input.h
OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/input.h
DEPENDS ${CMAKE_COMMAND}
)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,13 @@
cmake_policy(SET CMP0050 OLD)
add_library(empty empty.cpp)
add_custom_command(
TARGET empty
SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/input.h.in
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.h.in
${CMAKE_CURRENT_BINARY_DIR}/input.h
OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/input.h
DEPENDS ${CMAKE_COMMAND}
)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,9 @@
CMake Warning \(dev\) at CMP0050-WARN.cmake:3 \(add_custom_command\):
Policy CMP0050 is not set: Disallow add_custom_command SOURCE signatures.
Run "cmake --help-policy CMP0050" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
The SOURCE signatures of add_custom_command are no longer supported.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.

View File

@ -0,0 +1,11 @@
add_library(empty empty.cpp)
add_custom_command(
TARGET empty
SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/input.h.in
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.h.in
${CMAKE_CURRENT_BINARY_DIR}/input.h
OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/input.h
DEPENDS ${CMAKE_COMMAND}
)

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 2.8.12)
project(${RunCMake_TEST} CXX)
include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)

View File

@ -0,0 +1,5 @@
include(RunCMake)
run_cmake(CMP0050-OLD)
run_cmake(CMP0050-NEW)
run_cmake(CMP0050-WARN)

View File

@ -0,0 +1,10 @@
#include "input.h"
#ifdef _WIN32
__declspec(dllexport)
#endif
int empty()
{
return 0;
}

View File

@ -0,0 +1,2 @@
#define INPUT

View File

@ -32,6 +32,8 @@ endif()
add_RunCMake_test(CMP0043)
add_RunCMake_test(CMP0045)
add_RunCMake_test(CMP0046)
add_RunCMake_test(CMP0049)
add_RunCMake_test(CMP0050)
add_RunCMake_test(CTest)
if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
add_RunCMake_test(CompilerChange)