Commit 14e49ed1 authored by Matt McCormick's avatar Matt McCormick Committed by Brad King

if: Add "TEST <test>" condition

if(TEST TestNameThatExists) will return true if a test with the name
TestNameThatExists has been added with add_test.  The syntax is similar
to if(TARGET TargetName).  Since use of "TEST" as an argument to if()
could previously be interpreted as a non-keyword argument, add policy
CMP0064 to treat it as a keyword as NEW behavior.
parent 623dcc85
......@@ -71,6 +71,10 @@ Possible expressions are:
created by the :command:`add_executable`, :command:`add_library`, or
:command:`add_custom_target` commands.
``if(TEST test-name)``
True if the given name is an existing test name created by the
:command:`add_test` command.
``if(EXISTS path-to-file-or-directory)``
True if the named file or directory exists. Behavior is well-defined
only for full paths.
......
......@@ -121,3 +121,4 @@ All Policies
/policy/CMP0061
/policy/CMP0062
/policy/CMP0063
/policy/CMP0064
CMP0064
-------
Recognize ``TEST`` as a operator for the :command:`if` command.
The ``TEST`` operator was added to the :command:`if` command to determine if a
given test name was created by the :command:`add_test` command.
The ``OLD`` behavior for this policy is to ignore the ``TEST`` operator.
The ``NEW`` behavior is to interpret the ``TEST`` operator.
This policy was introduced in CMake version 3.4. 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.
.. include:: DEPRECATED.txt
if-TEST
-------
* Add a new TEST operator to if() that evaluates to true
if a given test name has been defined.
......@@ -16,7 +16,8 @@ cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile):
Makefile(makefile),
Policy12Status(makefile.GetPolicyStatus(cmPolicies::CMP0012)),
Policy54Status(makefile.GetPolicyStatus(cmPolicies::CMP0054)),
Policy57Status(makefile.GetPolicyStatus(cmPolicies::CMP0057))
Policy57Status(makefile.GetPolicyStatus(cmPolicies::CMP0057)),
Policy64Status(makefile.GetPolicyStatus(cmPolicies::CMP0064))
{
}
......@@ -493,6 +494,29 @@ bool cmConditionEvaluator::HandleLevel1(cmArgumentList &newArgs,
this->Makefile.FindTargetToUse(argP1->GetValue())?true:false,
reducible, arg, newArgs, argP1, argP2);
}
// does a test exist
if(this->Policy64Status != cmPolicies::OLD &&
this->Policy64Status != cmPolicies::WARN)
{
if (this->IsKeyword("TEST", *arg) && argP1 != newArgs.end())
{
const cmTest* haveTest = this->Makefile.GetTest(argP1->c_str());
this->HandlePredicate(
haveTest?true:false,
reducible, arg, newArgs, argP1, argP2);
}
}
else if(this->Policy64Status == cmPolicies::WARN &&
this->IsKeyword("TEST", *arg))
{
std::ostringstream e;
e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0064) << "\n";
e << "TEST will be interpreted as an operator "
"when the policy is set to NEW. "
"Since the policy is not set the OLD behavior will be used.";
this->Makefile.IssueMessage(cmake::AUTHOR_WARNING, e.str());
}
// is a variable defined
if (this->IsKeyword("DEFINED", *arg) && argP1 != newArgs.end())
{
......
......@@ -94,6 +94,7 @@ private:
cmPolicies::PolicyStatus Policy12Status;
cmPolicies::PolicyStatus Policy54Status;
cmPolicies::PolicyStatus Policy57Status;
cmPolicies::PolicyStatus Policy64Status;
};
#endif
......@@ -217,6 +217,9 @@ class cmPolicy;
3, 3, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0063, \
"Honor visibility properties for all target types.", \
3, 3, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0064, \
"Support new TEST if() operator.", \
3, 3, 0, cmPolicies::WARN)
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
......
cmake_policy(SET CMP0064 NEW)
if(NOT TEST TestThatDoesNotExist)
message(STATUS "if NOT TestThatDoesNotExist is true")
endif()
cmake_policy(SET CMP0064 OLD)
if(TEST)
message(FATAL_ERROR "TEST was not recognized to be undefined")
else()
message(STATUS "TEST was treated as a variable")
endif()
cmake_policy(SET CMP0064 OLD)
if(TEST)
message(FATAL_ERROR "TEST was not recognized to be undefined")
else()
message(STATUS "TEST was treated as a variable")
endif()
cmake_minimum_required(VERSION 3.3)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)
include(RunCMake)
run_cmake(CMP0064-OLD)
run_cmake(CMP0064-WARN)
run_cmake(CMP0064-NEW)
......@@ -103,6 +103,7 @@ add_RunCMake_test(CMP0055)
add_RunCMake_test(CMP0057)
add_RunCMake_test(CMP0059)
add_RunCMake_test(CMP0060)
add_RunCMake_test(CMP0064)
if(CMAKE_GENERATOR MATCHES "Make")
add_RunCMake_test(Make)
endif()
......
......@@ -4,3 +4,6 @@ run_cmake(InvalidArgument1)
run_cmake(IsDirectory)
run_cmake(IsDirectoryLong)
run_cmake(elseif-message)
run_cmake(TestNameThatExists)
run_cmake(TestNameThatDoesNotExist)
cmake_policy(SET CMP0064 NEW)
if(TEST TestThatDoesNotExist)
message(FATAL_ERROR "if TestThatDoesNotExist is true")
else()
message(STATUS "if TestThatDoesNotExist is false")
endif()
cmake_policy(SET CMP0064 NEW)
add_test(NAME TestThatExists COMMAND ${CMAKE_COMMAND} -E echo "A CMake Test")
if(TEST TestThatExists)
message(STATUS "if TestThatExists is true")
else()
message(FATAL_ERROR "if TestThatExists is false")
endif()
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