diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index c097697cc..8650a584c 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -101,3 +101,4 @@ All Policies /policy/CMP0047 /policy/CMP0048 /policy/CMP0049 + /policy/CMP0050 diff --git a/Help/policy/CMP0050.rst b/Help/policy/CMP0050.rst new file mode 100644 index 000000000..76ae0aa75 --- /dev/null +++ b/Help/policy/CMP0050.rst @@ -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. diff --git a/Help/release/3.0.rst b/Help/release/3.0.rst index 39f906a91..45f763554 100644 --- a/Help/release/3.0.rst +++ b/Help/release/3.0.rst @@ -327,6 +327,9 @@ New Diagnostics 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 =============================== diff --git a/Source/cmAddCustomCommandCommand.cxx b/Source/cmAddCustomCommandCommand.cxx index 56348494d..3de04f5f2 100644 --- a/Source/cmAddCustomCommandCommand.cxx +++ b/Source/cmAddCustomCommandCommand.cxx @@ -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, diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 78453db90..93072f50b 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -338,6 +338,11 @@ cmPolicies::cmPolicies() 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() diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 952365065..b77235dc4 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -103,6 +103,7 @@ public: 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. * diff --git a/Tests/RunCMake/CMP0050/CMP0050-NEW-result.txt b/Tests/RunCMake/CMP0050/CMP0050-NEW-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-NEW-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMP0050/CMP0050-NEW-stderr.txt b/Tests/RunCMake/CMP0050/CMP0050-NEW-stderr.txt new file mode 100644 index 000000000..e913b3fa9 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-NEW-stderr.txt @@ -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\) diff --git a/Tests/RunCMake/CMP0050/CMP0050-NEW.cmake b/Tests/RunCMake/CMP0050/CMP0050-NEW.cmake new file mode 100644 index 000000000..cdc65b897 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-NEW.cmake @@ -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} +) diff --git a/Tests/RunCMake/CMP0050/CMP0050-OLD-result.txt b/Tests/RunCMake/CMP0050/CMP0050-OLD-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-OLD-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0050/CMP0050-OLD-stderr.txt b/Tests/RunCMake/CMP0050/CMP0050-OLD-stderr.txt new file mode 100644 index 000000000..10f32932e --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-OLD-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0050/CMP0050-OLD.cmake b/Tests/RunCMake/CMP0050/CMP0050-OLD.cmake new file mode 100644 index 000000000..efb37e55b --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-OLD.cmake @@ -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} +) diff --git a/Tests/RunCMake/CMP0050/CMP0050-WARN-result.txt b/Tests/RunCMake/CMP0050/CMP0050-WARN-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-WARN-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0050/CMP0050-WARN-stderr.txt b/Tests/RunCMake/CMP0050/CMP0050-WARN-stderr.txt new file mode 100644 index 000000000..c88d59523 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-WARN-stderr.txt @@ -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. diff --git a/Tests/RunCMake/CMP0050/CMP0050-WARN.cmake b/Tests/RunCMake/CMP0050/CMP0050-WARN.cmake new file mode 100644 index 000000000..e57230e5b --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMP0050-WARN.cmake @@ -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} +) diff --git a/Tests/RunCMake/CMP0050/CMakeLists.txt b/Tests/RunCMake/CMP0050/CMakeLists.txt new file mode 100644 index 000000000..2f10cb092 --- /dev/null +++ b/Tests/RunCMake/CMP0050/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.12) +project(${RunCMake_TEST} CXX) +include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE) diff --git a/Tests/RunCMake/CMP0050/RunCMakeTest.cmake b/Tests/RunCMake/CMP0050/RunCMakeTest.cmake new file mode 100644 index 000000000..b7de28491 --- /dev/null +++ b/Tests/RunCMake/CMP0050/RunCMakeTest.cmake @@ -0,0 +1,5 @@ +include(RunCMake) + +run_cmake(CMP0050-OLD) +run_cmake(CMP0050-NEW) +run_cmake(CMP0050-WARN) diff --git a/Tests/RunCMake/CMP0050/empty.cpp b/Tests/RunCMake/CMP0050/empty.cpp new file mode 100644 index 000000000..182ea29c9 --- /dev/null +++ b/Tests/RunCMake/CMP0050/empty.cpp @@ -0,0 +1,10 @@ + +#include "input.h" + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int empty() +{ + return 0; +} diff --git a/Tests/RunCMake/CMP0050/input.h.in b/Tests/RunCMake/CMP0050/input.h.in new file mode 100644 index 000000000..d8c5d26a8 --- /dev/null +++ b/Tests/RunCMake/CMP0050/input.h.in @@ -0,0 +1,2 @@ + +#define INPUT diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index ef6f69d4f..9bb097b15 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -33,6 +33,7 @@ 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)