add_custom_command: Diagnose MAIN_DEPENDENCY limitation.

The new policy CMP0057 diagnoses reuse of the same MAIN_DEPENDENCY across
multiple custom commands.
This commit is contained in:
Nils Gladitz 2015-03-09 12:12:13 +01:00
parent bdb00b3613
commit 242c396656
17 changed files with 132 additions and 0 deletions

View File

@ -114,3 +114,4 @@ All Policies
/policy/CMP0054
/policy/CMP0055
/policy/CMP0056
/policy/CMP0057

21
Help/policy/CMP0057.rst Normal file
View File

@ -0,0 +1,21 @@
CMP0057
-------
Disallow multiple ``MAIN_DEPENDENCY`` specifications for the same file.
CMake 3.3 and above no longer allow the same input file to be used
as a ``MAIN_DEPENDENCY`` in more than one custom command.
Listing the same input file more than once in this context has not been
supported by earlier versions either and would lead to build time issues
but was not diagnosed.
The ``OLD`` behavior for this policy is to allow using the same input file
in a ``MAIN_DEPENDENCY`` specfication more than once.
The ``NEW`` behavior is to disallow using the same input file in a
``MAIN_DEPENDENCY`` specification more than once.
This policy was introduced in CMake version 3.3.
CMake version |release| warns when the policy is not set and uses
``OLD`` behavior. Use the :command:`cmake_policy` command to set
it to ``OLD`` or ``NEW`` explicitly.

View File

@ -0,0 +1,6 @@
main_dependency_diagnostic
--------------------------
* Listing the same input file as a MAIN_DEPENDENCY of a custom command
can lead to broken build time behavior. This is now diagnosed.
See policy :policy:`CMP0057`.

View File

@ -985,6 +985,33 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs,
}
else
{
std::ostringstream e;
cmake::MessageType messageType = cmake::AUTHOR_WARNING;
bool issueMessage = false;
switch(this->GetPolicyStatus(cmPolicies::CMP0057))
{
case cmPolicies::WARN:
e << (this->GetPolicies()->
GetPolicyWarning(cmPolicies::CMP0057)) << "\n";
issueMessage = true;
case cmPolicies::OLD:
break;
case cmPolicies::NEW:
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
issueMessage = true;
messageType = cmake::FATAL_ERROR;
break;
}
if(issueMessage)
{
e << "\"" << main_dependency << "\" can only be specified as a "
"custom command MAIN_DEPENDENCY once.";
IssueMessage(messageType, e.str());
}
// The existing custom command is different. We need to
// generate a rule file for this new command.
file = 0;

View File

@ -374,6 +374,11 @@ cmPolicies::cmPolicies()
CMP0056, "CMP0056",
"Honor link flags in try_compile() source-file signature.",
3,2,0, cmPolicies::WARN);
this->DefinePolicy(
CMP0057, "CMP0057",
"Disallow multiple MAIN_DEPENDENCY specifications for the same file.",
3,3,0, cmPolicies::WARN);
}
cmPolicies::~cmPolicies()

View File

@ -113,6 +113,8 @@ public:
/// or keywords when unquoted.
CMP0055, ///< Strict checking for break() command.
CMP0056, ///< Honor link flags in try_compile() source-file signature.
CMP0057, ///< Disallow multiple MAIN_DEPENDENCY specifications
/// for the same file.
/** \brief Always the last entry.
*

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,4 @@
CMake Error at CMP0057-NEW.cmake:8 \(add_custom_command\):
"input.txt" can only be specified as a custom command MAIN_DEPENDENCY once.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)

View File

@ -0,0 +1,13 @@
cmake_policy(SET CMP0057 NEW)
add_custom_command(OUTPUT out1
COMMAND ${CMAKE_COMMAND} -E echo out1
MAIN_DEPENDENCY input.txt
)
add_custom_command(OUTPUT out2
COMMAND ${CMAKE_COMMAND} -E echo out2
MAIN_DEPENDENCY input.txt
)
add_custom_target(mytarget1 ALL DEPENDS out1 out2)

View File

@ -0,0 +1,13 @@
cmake_policy(SET CMP0057 OLD)
add_custom_command(OUTPUT out1
COMMAND ${CMAKE_COMMAND} -E echo out1
MAIN_DEPENDENCY input.txt
)
add_custom_command(OUTPUT out2
COMMAND ${CMAKE_COMMAND} -E echo out2
MAIN_DEPENDENCY input.txt
)
add_custom_target(mytarget1 ALL DEPENDS out1 out2)

View File

@ -0,0 +1,9 @@
CMake Warning \(dev\) at CMP0057-WARN.cmake:6 \(add_custom_command\):
Policy CMP0057 is not set: Disallow multiple MAIN_DEPENDENCY specifications
for the same file. Run "cmake --help-policy CMP0057" for policy details.
Use the cmake_policy command to set the policy and suppress this warning.
"input.txt" can only be specified as a custom command MAIN_DEPENDENCY once.
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_custom_command(OUTPUT out1
COMMAND ${CMAKE_COMMAND} -E echo out1
MAIN_DEPENDENCY input.txt
)
add_custom_command(OUTPUT out2
COMMAND ${CMAKE_COMMAND} -E echo out2
MAIN_DEPENDENCY input.txt
)
add_custom_target(mytarget1 ALL DEPENDS out1 out2)

View File

@ -0,0 +1,8 @@
cmake_policy(SET CMP0057 NEW)
add_custom_command(OUTPUT out1
COMMAND ${CMAKE_COMMAND} -E echo out1
MAIN_DEPENDENCY input.txt
)
add_custom_target(mytarget1 ALL DEPENDS out1)

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.1)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@ -0,0 +1,7 @@
include(RunCMake)
run_cmake(CMP0057-OLD)
run_cmake(CMP0057-NEW)
run_cmake(CMP0057-WARN)
run_cmake(CMP0057-once_is_ok)

View File

View File

@ -63,6 +63,7 @@ add_RunCMake_test(CMP0051)
add_RunCMake_test(CMP0053)
add_RunCMake_test(CMP0054)
add_RunCMake_test(CMP0055)
add_RunCMake_test(CMP0057)
add_RunCMake_test(CTest)
if(NOT CMake_TEST_EXTERNAL_CMAKE)