Răsfoiți Sursa

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.
Matt McCormick 10 ani în urmă
părinte
comite
14e49ed156

+ 4 - 0
Help/command/if.rst

@@ -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.

+ 1 - 0
Help/manual/cmake-policies.7.rst

@@ -121,3 +121,4 @@ All Policies
    /policy/CMP0061
    /policy/CMP0062
    /policy/CMP0063
+   /policy/CMP0064

+ 17 - 0
Help/policy/CMP0064.rst

@@ -0,0 +1,17 @@
+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

+ 5 - 0
Help/release/dev/if-TEST.rst

@@ -0,0 +1,5 @@
+if-TEST
+-------
+
+* Add a new TEST operator to if() that evaluates to true
+  if a given test name has been defined.

+ 25 - 1
Source/cmConditionEvaluator.cxx

@@ -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())
         {

+ 1 - 0
Source/cmConditionEvaluator.h

@@ -94,6 +94,7 @@ private:
   cmPolicies::PolicyStatus Policy12Status;
   cmPolicies::PolicyStatus Policy54Status;
   cmPolicies::PolicyStatus Policy57Status;
+  cmPolicies::PolicyStatus Policy64Status;
 };
 
 #endif

+ 3 - 0
Source/cmPolicies.h

@@ -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)

+ 5 - 0
Tests/RunCMake/CMP0064/CMP0064-NEW.cmake

@@ -0,0 +1,5 @@
+cmake_policy(SET CMP0064 NEW)
+
+if(NOT TEST TestThatDoesNotExist)
+  message(STATUS "if NOT TestThatDoesNotExist is true")
+endif()

+ 7 - 0
Tests/RunCMake/CMP0064/CMP0064-OLD.cmake

@@ -0,0 +1,7 @@
+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()

+ 7 - 0
Tests/RunCMake/CMP0064/CMP0064-WARN.cmake

@@ -0,0 +1,7 @@
+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()

+ 3 - 0
Tests/RunCMake/CMP0064/CMakeLists.txt

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

+ 5 - 0
Tests/RunCMake/CMP0064/RunCMakeTest.cmake

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

+ 1 - 0
Tests/RunCMake/CMakeLists.txt

@@ -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()

+ 3 - 0
Tests/RunCMake/if/RunCMakeTest.cmake

@@ -4,3 +4,6 @@ run_cmake(InvalidArgument1)
 run_cmake(IsDirectory)
 run_cmake(IsDirectoryLong)
 run_cmake(elseif-message)
+
+run_cmake(TestNameThatExists)
+run_cmake(TestNameThatDoesNotExist)

+ 1 - 0
Tests/RunCMake/if/TestNameThatDoesNotExist-stdout.txt

@@ -0,0 +1 @@
+TestThatDoesNotExist is false

+ 6 - 0
Tests/RunCMake/if/TestNameThatDoesNotExist.cmake

@@ -0,0 +1,6 @@
+cmake_policy(SET CMP0064 NEW)
+if(TEST TestThatDoesNotExist)
+  message(FATAL_ERROR "if TestThatDoesNotExist is true")
+else()
+  message(STATUS "if TestThatDoesNotExist is false")
+endif()

+ 1 - 0
Tests/RunCMake/if/TestNameThatExists-stdout.txt

@@ -0,0 +1 @@
+TestThatExists is true

+ 7 - 0
Tests/RunCMake/if/TestNameThatExists.cmake

@@ -0,0 +1,7 @@
+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()