Просмотр исходного кода

Merge topic 'GenEx-SOURCE_PROPERTY'

e2a38a3990 GenEx SOURCE_PROPERTY

Acked-by: Kitware Robot <[email protected]>
Tested-by: buildbot <[email protected]>
Merge-request: !11558
Brad King 1 месяц назад
Родитель
Сommit
fe4e02d159
76 измененных файлов с 710 добавлено и 0 удалено
  1. 89 0
      Help/manual/cmake-generator-expressions.7.rst
  2. 5 0
      Help/release/dev/GenEx-SOURCE_PROPERTY.rst
  3. 166 0
      Source/cmGeneratorExpressionNode.cxx
  4. 2 0
      Tests/RunCMake/CMakeLists.txt
  5. 5 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/CMakeLists.txt
  6. 2 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/Local-check.cmake
  7. 31 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/Local.cmake
  8. 14 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/RunCMakeTest.cmake
  9. 2 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/Subdir-check.cmake
  10. 24 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/Subdir.cmake
  11. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-DIRECTORY-result.txt
  12. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-DIRECTORY-stderr.txt
  13. 6 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-DIRECTORY.cmake
  14. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-TARGET_DIRECTORY-result.txt
  15. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-TARGET_DIRECTORY-stderr.txt
  16. 6 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-TARGET_DIRECTORY.cmake
  17. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-arguments-result.txt
  18. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-arguments-stderr.txt
  19. 2 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-arguments.cmake
  20. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-option-result.txt
  21. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-option-stderr.txt
  22. 6 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-option.cmake
  23. 0 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/foo.c
  24. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-DIRECTORY-result.txt
  25. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-DIRECTORY-stderr.txt
  26. 6 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-DIRECTORY.cmake
  27. 0 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-TARGET_DIRECTORY-result.txt
  28. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-TARGET_DIRECTORY-stderr.txt
  29. 6 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-TARGET_DIRECTORY.cmake
  30. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-arguments-result.txt
  31. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-arguments-stderr.txt
  32. 2 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-arguments.cmake
  33. 1 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-source-result.txt
  34. 8 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-source-stderr.txt
  35. 2 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/no-source.cmake
  36. 3 0
      Tests/RunCMake/GenEx-SOURCE_EXISTS/subdir/CMakeLists.txt
  37. 5 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/CMakeLists.txt
  38. 2 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local-check.cmake
  39. 46 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local.cmake
  40. 17 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/RunCMakeTest.cmake
  41. 38 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/Subdir.cmake
  42. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-DIRECTORY-result.txt
  43. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-DIRECTORY-stderr.txt
  44. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-DIRECTORY.cmake
  45. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-TARGET_DIRECTORY-result.txt
  46. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-TARGET_DIRECTORY-stderr.txt
  47. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-TARGET_DIRECTORY.cmake
  48. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-arguments-result.txt
  49. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-arguments-stderr.txt
  50. 2 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-arguments.cmake
  51. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-option-result.txt
  52. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-option-stderr.txt
  53. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-option.cmake
  54. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-property-result.txt
  55. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-property-stderr.txt
  56. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-property.cmake
  57. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-source-result.txt
  58. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-source-stderr.txt
  59. 2 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-source.cmake
  60. 0 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/foo.c
  61. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-DIRECTORY-result.txt
  62. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-DIRECTORY-stderr.txt
  63. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-DIRECTORY.cmake
  64. 0 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-TARGET_DIRECTORY-result.txt
  65. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-TARGET_DIRECTORY-stderr.txt
  66. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-TARGET_DIRECTORY.cmake
  67. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-arguments-result.txt
  68. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-arguments-stderr.txt
  69. 2 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-arguments.cmake
  70. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-property-result.txt
  71. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-property-stderr.txt
  72. 6 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-property.cmake
  73. 1 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-source-result.txt
  74. 8 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-source-stderr.txt
  75. 2 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-source.cmake
  76. 4 0
      Tests/RunCMake/GenEx-SOURCE_PROPERTY/subdir/CMakeLists.txt

+ 89 - 0
Help/manual/cmake-generator-expressions.7.rst

@@ -2422,6 +2422,95 @@ closely related to most of the expressions in this sub-section.
   any one of the entries in ``variant_ids``, otherwise ``0``.
 
 
+.. _`Source-Dependent Expressions`:
+
+Source-Dependent Expressions
+----------------------------
+
+The source file, as specified in the following expressions, can be nonexistent
+on the file system (i.e. generated file) but must be known from CMake. A source
+file becomes known from CMake if it is part of some target (library or
+executable) or when a source file property is defined. Moreover, this
+information is specific to the directory where the declaration occurred.
+
+For example, these generator expressions enable to offer a uniform behavior,
+for the :command:`add_custom_command` and :command:`add_custom_target`
+commands, regarding the source properties:
+
+.. code-block:: cmake
+
+  function(custom_add_library target)
+    unset(sources)
+    foreach(source IN LISTS ARGN)
+      add_custom_command(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${source}.bin
+        COMMAND my-compiler -o ${CMAKE_CURRENT_BINARY_DIR}/${source}.bin
+                            "$<$<SOURCE_EXISTS:${source}>:$<SOURCE_PROPERTY:${source},COMPILE_OPTIONS>>"
+                            ${source})
+      list(APPEND sources ${CMAKE_CURRENT_BINARY_DIR}/${source}.bin)
+    endforeach()
+    add_custom_target(${target}
+                      DEPENDS ${sources})
+  endfunction()
+
+  custom_add_library(my-lib file1.x file2.x file3.x)
+  set_property(SOURCE file1.x PROPERTY COMPILE_OPTIONS -X)
+  set_property(SOURCE file2.x PROPERTY COMPILE_OPTIONS -Y)
+
+Source Meta-Data
+^^^^^^^^^^^^^^^^
+
+These expressions look up information about a source file.
+
+.. genex:: $<SOURCE_EXISTS:src[,(DIRECTORY:dir|TARGET_DIRECTORY:tgt)]>
+
+  .. versionadded:: 4.3
+
+  ``1`` if ``src`` exists as a CMake source file, else ``0``. By default, the
+  source file is searched in the scope of the current source directory or the
+  directory of the consuming target.
+
+  Directory scope can be overridden with one of the following sub-options:
+
+  ``DIRECTORY:dir``
+    The source file will be searched in the ``dir`` directory's scope.
+    CMake must know about the directory, either by having added  it through a
+    call to :command:`add_subdirectory` or ``dir`` being the top level
+    directory. Relative paths are treated as relative to the current source
+    directory.
+
+  ``TARGET_DIRECTORY:target``
+      The source file will be searched in the directory scope in which
+      ``target`` was created (``target`` must therefore exist).
+
+Source Properties
+^^^^^^^^^^^^^^^^^
+
+These expressions look up the values of
+:ref:`source file properties <Source File Properties>`.
+
+.. genex:: $<SOURCE_PROPERTY:src[,(DIRECTORY:dir|TARGET_DIRECTORY:target)],prop>
+
+  .. versionadded:: 4.3
+
+  Value of the property ``prop`` on the source file ``src``, or empty if
+  the property is not set. An error will be raised if the source file is not
+  known by CMake. By default, the source file's property will be read from the
+  current source directory's scope or the directory of the consuming target.
+
+  Directory scope can be overridden with one of the following sub-options:
+
+  ``DIRECTORY:dir``
+    The source file property will be read from the ``dir`` directory's scope.
+    CMake must know about the directory, either by having added  it through a
+    call to :command:`add_subdirectory` or ``dir`` being the top level
+    directory. Relative paths are treated as relative to the current source
+    directory.
+
+  ``TARGET_DIRECTORY:target``
+      The source file property will be read from the directory scope in which
+      ``target`` was created (``target`` must therefore exist).
+
 .. _`Target-Dependent Expressions`:
 
 Target-Dependent Expressions

+ 5 - 0
Help/release/dev/GenEx-SOURCE_PROPERTY.rst

@@ -0,0 +1,5 @@
+GenEx-SOURCE_PROPERTY
+---------------------
+
+* :genex:`$<SOURCE_EXISTS>` and :genex:`$<SOURCE_PROPERTY>` generator
+  expressions were added to query CMake source files existence and properties.

+ 166 - 0
Source/cmGeneratorExpressionNode.cxx

@@ -45,6 +45,7 @@
 #include "cmOutputConverter.h"
 #include "cmPolicies.h"
 #include "cmRange.h"
+#include "cmSourceFile.h"
 #include "cmStandardLevelResolver.h"
 #include "cmState.h"
 #include "cmStateSnapshot.h"
@@ -3577,6 +3578,169 @@ static const struct DeviceLinkNode : public cmGeneratorExpressionNode
   }
 } deviceLinkNode;
 
+namespace {
+bool GetSourceFile(
+  cmRange<std::vector<std::string>::const_iterator> parameters,
+  cm::GenEx::Evaluation* eval, GeneratorExpressionContent const* content,
+  cmSourceFile*& sourceFile)
+{
+  auto sourceName = *parameters.begin();
+  auto* makefile = eval->Context.LG->GetMakefile();
+  sourceFile = nullptr;
+
+  if (parameters.size() == 2) {
+    auto const& option = *parameters.advance(1).begin();
+    auto const DIRECTORY = "DIRECTORY:"_s;
+    auto const TARGET_DIRECTORY = "TARGET_DIRECTORY:"_s;
+    if (cmHasPrefix(option, DIRECTORY)) {
+      auto dir = option.substr(DIRECTORY.length());
+      if (dir.empty()) {
+        reportError(
+          eval, content->GetOriginalExpression(),
+          cmStrCat("No value provided for the ", DIRECTORY, " option."));
+        return false;
+      }
+      dir = cmSystemTools::CollapseFullPath(
+        dir, makefile->GetCurrentSourceDirectory());
+      makefile = makefile->GetGlobalGenerator()->FindMakefile(dir);
+      if (!makefile) {
+        reportError(
+          eval, content->GetOriginalExpression(),
+          cmStrCat("Directory \"", dir, "\" is not known from CMake."));
+        return false;
+      }
+    } else if (cmHasPrefix(option, TARGET_DIRECTORY)) {
+      auto targetName = option.substr(TARGET_DIRECTORY.length());
+      if (targetName.empty()) {
+        reportError(eval, content->GetOriginalExpression(),
+                    cmStrCat("No value provided for the ", TARGET_DIRECTORY,
+                             " option."));
+        return false;
+      }
+      auto* target = makefile->FindTargetToUse(targetName);
+      if (!target) {
+        reportError(eval, content->GetOriginalExpression(),
+                    cmStrCat("Non-existent target: ", targetName));
+        return false;
+      }
+      makefile = makefile->GetGlobalGenerator()->FindMakefile(
+        target->GetProperty("BINARY_DIR"));
+    } else {
+      reportError(eval, content->GetOriginalExpression(),
+                  cmStrCat("Invalid option. ", DIRECTORY, " or ",
+                           TARGET_DIRECTORY, " expected."));
+      return false;
+    }
+
+    sourceName = cmSystemTools::CollapseFullPath(
+      sourceName,
+      eval->Context.LG->GetMakefile()->GetCurrentSourceDirectory());
+  }
+
+  sourceFile = makefile->GetSource(sourceName);
+  return true;
+}
+}
+
+static const struct SourceExistsNode : public cmGeneratorExpressionNode
+{
+  SourceExistsNode() {} // NOLINT(modernize-use-equals-default)
+
+  // This node handles errors on parameter count itself.
+  int NumExpectedParameters() const override { return OneOrMoreParameters; }
+
+  std::string Evaluate(
+    std::vector<std::string> const& parameters, cm::GenEx::Evaluation* eval,
+    GeneratorExpressionContent const* content,
+    cmGeneratorExpressionDAGChecker* /*dagCheckerParent*/) const override
+  {
+    if (parameters.size() > 2) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "$<SOURCE_EXISTS:...> expression requires at most two "
+                  "parameters.");
+      return std::string{};
+    }
+
+    if (parameters[0].empty()) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "$<SOURCE_EXISTS:src> expression requires a "
+                  "non-empty source name.");
+      return std::string{};
+    }
+
+    cmSourceFile* sourceFile = nullptr;
+    if (!GetSourceFile(cmMakeRange(parameters), eval, content, sourceFile)) {
+      return std::string{};
+    }
+
+    return sourceFile ? "1" : "0";
+  }
+} sourceExistsNode;
+
+static const struct SourcePropertyNode : public cmGeneratorExpressionNode
+{
+  SourcePropertyNode() {} // NOLINT(modernize-use-equals-default)
+
+  // This node handles errors on parameter count itself.
+  int NumExpectedParameters() const override { return TwoOrMoreParameters; }
+
+  std::string Evaluate(
+    std::vector<std::string> const& parameters, cm::GenEx::Evaluation* eval,
+    GeneratorExpressionContent const* content,
+    cmGeneratorExpressionDAGChecker* /*dagCheckerParent*/) const override
+  {
+    static cmsys::RegularExpression propertyNameValidator("^[A-Za-z0-9_]+$");
+
+    if (parameters.size() > 3) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "$<SOURCE_PROPERTY:...> expression requires at most three "
+                  "parameters.");
+      return std::string{};
+    }
+
+    std::string sourceName = parameters.front();
+    std::string const& propertyName = parameters.back();
+
+    if (sourceName.empty() && propertyName.empty()) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "$<SOURCE_PROPERTY:src,prop> expression requires a "
+                  "non-empty source name and property name.");
+      return std::string{};
+    }
+    if (sourceName.empty()) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "$<SOURCE_PROPERTY:src,prop> expression requires a "
+                  "non-empty source name.");
+      return std::string{};
+    }
+    if (propertyName.empty()) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "$<SOURCE_PROPERTY:src,prop> expression requires a "
+                  "non-empty property name.");
+      return std::string{};
+    }
+    if (!propertyNameValidator.find(propertyName)) {
+      reportError(eval, content->GetOriginalExpression(),
+                  "Property name not supported.");
+      return std::string{};
+    }
+
+    cmSourceFile* sourceFile = nullptr;
+    if (!GetSourceFile(cmMakeRange(parameters).retreat(1), eval, content,
+                       sourceFile)) {
+      return std::string{};
+    }
+    if (!sourceFile) {
+      reportError(
+        eval, content->GetOriginalExpression(),
+        cmStrCat("Source file \"", sourceName, "\" is not known from CMake."));
+      return std::string{};
+    }
+
+    return sourceFile->GetPropertyForUser(propertyName);
+  }
+} sourcePropertyNode;
+
 static std::string getLinkedTargetsContent(
   cmGeneratorTarget const* target, std::string const& prop,
   cm::GenEx::Evaluation* eval, cmGeneratorExpressionDAGChecker* dagChecker,
@@ -5535,6 +5699,8 @@ cmGeneratorExpressionNode const* cmGeneratorExpressionNode::GetNode(
     { "COMMA", &commaNode },
     { "SEMICOLON", &semicolonNode },
     { "QUOTE", &quoteNode },
+    { "SOURCE_EXISTS", &sourceExistsNode },
+    { "SOURCE_PROPERTY", &sourcePropertyNode },
     { "TARGET_PROPERTY", &targetPropertyNode },
     { "TARGET_INTERMEDIATE_DIR", &targetIntermediateDirNode },
     { "TARGET_NAME", &targetNameNode },

+ 2 - 0
Tests/RunCMake/CMakeLists.txt

@@ -530,6 +530,8 @@ add_RunCMake_test(GenEx-LINK_GROUP)
 add_RunCMake_test(GenEx-TARGET_FILE -DLINKER_SUPPORTS_PDB=${LINKER_SUPPORTS_PDB})
 add_RunCMake_test(GenEx-TARGET_IMPORT_FILE)
 add_RunCMake_test(GenEx-GENEX_EVAL)
+add_RunCMake_test(GenEx-SOURCE_EXISTS)
+add_RunCMake_test(GenEx-SOURCE_PROPERTY)
 add_RunCMake_test(GenEx-TARGET_PROPERTY)
 add_RunCMake_test(GenEx-TARGET_RUNTIME_DLLS)
 add_RunCMake_test(GenEx-STRING)

+ 5 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/CMakeLists.txt

@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 4.0...4.3)
+
+project(${RunCMake_TEST} NONE)
+
+include(${RunCMake_TEST}.cmake)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/Local-check.cmake

@@ -0,0 +1,2 @@
+
+include ("${RunCMake_TEST_BINARY_DIR}/Local-generated.cmake")

+ 31 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/Local.cmake

@@ -0,0 +1,31 @@
+
+
+enable_language(C)
+
+
+set (GENERATE_CONTENT [[
+macro (CHECK_VALUE test_msg value expected)
+  if (NOT "${value}" STREQUAL "${expected}")
+    string (APPEND RunCMake_TEST_FAILED "${test_msg}: actual result:\n [${value}]\nbut expected:\n [${expected}]\n")
+  endif()
+endmacro()
+
+]])
+
+
+add_library(foo STATIC foo.c)
+
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_EXISTS:bar.c>\" \"$<SOURCE_EXISTS:bar.c>\" \"0\")\n"
+  "check_value (\"<SOURCE_EXISTS:${CMAKE_CURRENT_SOURCE_DIR}/bar.c>\" \"$<SOURCE_EXISTS:${CMAKE_CURRENT_SOURCE_DIR}/bar.c>\" \"0\")\n")
+
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_EXISTS:foo.c>\" \"$<SOURCE_EXISTS:foo.c>\" \"1\")\n"
+  "check_value (\"<SOURCE_EXISTS:${CMAKE_CURRENT_SOURCE_DIR}/foo.c>\" \"$<SOURCE_EXISTS:${CMAKE_CURRENT_SOURCE_DIR}/foo.c>\" \"1\")\n"
+  "check_value (\"<SOURCE_EXISTS:${CMAKE_CURRENT_SOURCE_DIR}/foo.c>\" \"$<SOURCE_EXISTS:${CMAKE_CURRENT_SOURCE_DIR}/foo.c>\" \"1\")\n"
+  "check_value (\"<SOURCE_EXISTS:foo.c,DIRECTORY:${CMAKE_CURRENT_SOURCE_DIR}>\" \"$<SOURCE_EXISTS:foo.c,DIRECTORY:${CMAKE_CURRENT_SOURCE_DIR}>\" \"1\")\n"
+  "check_value (\"<SOURCE_EXISTS:foo.c,TARGET_DIRECTORY:foo>\" \"$<SOURCE_EXISTS:foo.c,TARGET_DIRECTORY:foo>\" \"1\")\n")
+
+
+file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Local-generated.cmake"
+  CONTENT "${GENERATE_CONTENT}")

+ 14 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/RunCMakeTest.cmake

@@ -0,0 +1,14 @@
+
+include(RunCMake)
+
+run_cmake(no-arguments)
+run_cmake(bad-arguments)
+run_cmake(no-source)
+run_cmake(bad-option)
+run_cmake(no-DIRECTORY)
+run_cmake(bad-DIRECTORY)
+run_cmake(no-TARGET_DIRECTORY)
+run_cmake(bad-TARGET_DIRECTORY)
+
+run_cmake(Local)
+run_cmake(Subdir)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/Subdir-check.cmake

@@ -0,0 +1,2 @@
+
+include ("${RunCMake_TEST_BINARY_DIR}/Subdir-generated.cmake")

+ 24 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/Subdir.cmake

@@ -0,0 +1,24 @@
+
+
+enable_language(C)
+
+
+set (GENERATE_CONTENT [[
+macro (CHECK_VALUE test_msg value expected)
+  if (NOT "${value}" STREQUAL "${expected}")
+    string (APPEND RunCMake_TEST_FAILED "${test_msg}: actual result:\n [${value}]\nbut expected:\n [${expected}]\n")
+  endif()
+endmacro()
+
+]])
+
+add_subdirectory(subdir)
+
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_EXISTS:foo.c>\" \"$<SOURCE_EXISTS:foo.c>\" \"0\")\n"
+  "check_value (\"<SOURCE_EXISTS:foo.c,DIRECTORY:subdir>\" \"$<SOURCE_EXISTS:foo.c,DIRECTORY:subdir>\" \"1\")\n"
+  "check_value (\"<SOURCE_EXISTS:foo.c,TARGET_DIRECTORY:foo>\" \"$<SOURCE_EXISTS:foo.c,TARGET_DIRECTORY:foo>\" \"1\")\n")
+
+
+file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Subdir-generated.cmake"
+  CONTENT "${GENERATE_CONTENT}")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-DIRECTORY-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:foo\.c,DIRECTORY:foo>
+
+  Directory.+".+/Tests/RunCMake/GenEx-SOURCE_EXISTS/foo".+is.+not.+known.+from.+CMake\.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:foo.c,DIRECTORY:foo>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-TARGET_DIRECTORY-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-TARGET_DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-TARGET_DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:foo\.c,TARGET_DIRECTORY:bar>
+
+  Non-existent target: bar
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-TARGET_DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:foo.c,TARGET_DIRECTORY:bar>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-arguments-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-arguments-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-arguments\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:src,opt,foo>
+
+  \$<SOURCE_EXISTS:...> expression requires at most two parameters.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-arguments.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:src,opt,foo>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-option-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-option-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-option\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:foo\.c,BAD_OPTION>
+
+  Invalid option.  DIRECTORY: or TARGET_DIRECTORY: expected.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/bad-option.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:foo.c,BAD_OPTION>")

+ 0 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/foo.c


+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-DIRECTORY-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:foo\.c,DIRECTORY:>
+
+  No value provided for the DIRECTORY: option.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:foo.c,DIRECTORY:>")

+ 0 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-TARGET_DIRECTORY-result.txt


+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-TARGET_DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-TARGET_DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:foo\.c,TARGET_DIRECTORY:>
+
+  No value provided for the TARGET_DIRECTORY: option.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-TARGET_DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:foo.c,TARGET_DIRECTORY:>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-arguments-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-arguments-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-arguments\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS>
+
+  \$<SOURCE_EXISTS> expression requires at least one parameter.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-arguments.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-source-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-source-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-source\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_EXISTS:>
+
+  \$<SOURCE_EXISTS:src> expression requires a non-empty source name.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/no-source.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_EXISTS:>")

+ 3 - 0
Tests/RunCMake/GenEx-SOURCE_EXISTS/subdir/CMakeLists.txt

@@ -0,0 +1,3 @@
+
+
+add_library(foo STATIC ${CMAKE_SOURCE_DIR}/foo.c)

+ 5 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/CMakeLists.txt

@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 4.0...4.3)
+
+project(${RunCMake_TEST} NONE)
+
+include(${RunCMake_TEST}.cmake)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local-check.cmake

@@ -0,0 +1,2 @@
+
+include ("${RunCMake_TEST_BINARY_DIR}/Local-generated.cmake")

+ 46 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local.cmake

@@ -0,0 +1,46 @@
+
+
+enable_language(C)
+
+
+set (GENERATE_CONTENT [[
+macro (CHECK_VALUE test_msg value expected)
+  if (NOT "${value}" STREQUAL "${expected}")
+    string (APPEND RunCMake_TEST_FAILED "${test_msg}: actual result:\n [${value}]\nbut expected:\n [${expected}]\n")
+  endif()
+endmacro()
+
+]])
+
+set_property(SOURCE foo.c PROPERTY FOO BAR)
+
+get_property(reference SOURCE foo.c PROPERTY FOO)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,FOO>\" \"$<SOURCE_PROPERTY:foo.c,FOO>\" \"${reference}\")\n")
+
+get_property(reference SOURCE foo.c DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY FOO)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,DIRECTORY:${CMAKE_CURRENT_SOURCE_DIR},FOO>\" \"$<SOURCE_PROPERTY:foo.c,DIRECTORY:${CMAKE_CURRENT_SOURCE_DIR},FOO>\" \"${reference}\")\n")
+
+get_property(reference SOURCE foo.c PROPERTY VOID)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,VOID>\" \"$<SOURCE_PROPERTY:foo.c,VOID>\" \"${reference}\")\n")
+
+get_property(reference SOURCE foo.c DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY VOID)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,DIRECTORY:${CMAKE_CURRENT_SOURCE_DIR},VOID>\" \"$<SOURCE_PROPERTY:foo.c,DIRECTORY:${CMAKE_CURRENT_SOURCE_DIR},VOID>\" \"${reference}\")\n")
+
+
+add_library(foo STATIC foo.c)
+
+get_property(reference SOURCE foo.c TARGET_DIRECTORY foo PROPERTY FOO)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,FOO>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,FOO>\" \"${reference}\")\n")
+
+get_property(reference SOURCE foo.c TARGET_DIRECTORY foo PROPERTY VOID)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,VOID>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,VOID>\" \"${reference}\")\n")
+
+
+file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Local-generated.cmake"
+  CONTENT "${GENERATE_CONTENT}")

+ 17 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/RunCMakeTest.cmake

@@ -0,0 +1,17 @@
+
+include(RunCMake)
+
+run_cmake(no-arguments)
+run_cmake(bad-arguments)
+run_cmake(no-source)
+run_cmake(bad-source)
+run_cmake(no-property)
+run_cmake(bad-property)
+run_cmake(bad-option)
+run_cmake(no-DIRECTORY)
+run_cmake(bad-DIRECTORY)
+run_cmake(no-TARGET_DIRECTORY)
+run_cmake(bad-TARGET_DIRECTORY)
+
+run_cmake(Local)
+run_cmake(Subdir)

+ 38 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/Subdir.cmake

@@ -0,0 +1,38 @@
+
+
+enable_language(C)
+
+
+set (GENERATE_CONTENT [[
+macro (CHECK_VALUE test_msg value expected)
+  if (NOT "${value}" STREQUAL "${expected}")
+    string (APPEND RunCMake_TEST_FAILED "${test_msg}: actual result:\n [${value}]\nbut expected:\n [${expected}]\n")
+  endif()
+endmacro()
+
+]])
+
+set_property(SOURCE foo.c PROPERTY FOO ROOT)
+
+add_subdirectory(subdir)
+
+get_property(reference SOURCE foo.c DIRECTORY "subdir" PROPERTY FOO)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,DIRECTORY:subdir,FOO>\" \"$<SOURCE_PROPERTY:foo.c,DIRECTORY:subdir,FOO>\" \"${reference}\")\n")
+
+get_property(reference SOURCE foo.c DIRECTORY "subdir" PROPERTY VOID)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,DIRECTORY:subdir,VOID>\" \"$<SOURCE_PROPERTY:foo.c,DIRECTORY:subdir,VOID>\" \"${reference}\")\n")
+
+
+get_property(reference SOURCE foo.c TARGET_DIRECTORY foo PROPERTY FOO)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,FOO>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,FOO>\" \"${reference}\")\n")
+
+get_property(reference SOURCE foo.c TARGET_DIRECTORY foo PROPERTY VOID)
+string (APPEND GENERATE_CONTENT
+  "check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,VOID>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,VOID>\" \"${reference}\")\n")
+
+
+file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Subdir-generated.cmake"
+  CONTENT "${GENERATE_CONTENT}")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-DIRECTORY-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo\.c,DIRECTORY:foo,FOO>
+
+  Directory.+".+/Tests/RunCMake/GenEx-SOURCE_PROPERTY/foo".+is.+not.+known.+from.+CMake\.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,DIRECTORY:foo,FOO>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-TARGET_DIRECTORY-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-TARGET_DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-TARGET_DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo\.c,TARGET_DIRECTORY:bar,FOO>
+
+  Non-existent target: bar
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-TARGET_DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:bar,FOO>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-arguments-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-arguments-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-arguments\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:src,opt,prop,foo>
+
+  \$<SOURCE_PROPERTY:...> expression requires at most three parameters.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-arguments.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:src,opt,prop,foo>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-option-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-option-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-option\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo\.c,BAD_OPTION,FOO>
+
+  Invalid option.  DIRECTORY: or TARGET_DIRECTORY: expected.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-option.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,BAD_OPTION,FOO>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-property-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-property-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-property\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo.c,F\?OO>
+
+  Property name not supported.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-property.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,F?OO>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-source-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-source-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at bad-source\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo.c,FOO>
+
+  Source file "foo\.c" is not known from CMake.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/bad-source.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,FOO>")

+ 0 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/foo.c


+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-DIRECTORY-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo\.c,DIRECTORY:,FOO>
+
+  No value provided for the DIRECTORY: option.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,DIRECTORY:,FOO>")

+ 0 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-TARGET_DIRECTORY-result.txt


+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-TARGET_DIRECTORY-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-TARGET_DIRECTORY\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo\.c,TARGET_DIRECTORY:,FOO>
+
+  No value provided for the TARGET_DIRECTORY: option.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-TARGET_DIRECTORY.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:,FOO>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-arguments-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-arguments-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-arguments\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:>
+
+  \$<SOURCE_PROPERTY> expression requires at least two parameters.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-arguments.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-property-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-property-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-property\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:foo.c,>
+
+  \$<SOURCE_PROPERTY:src,prop> expression requires a non-empty property name.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-property.cmake

@@ -0,0 +1,6 @@
+
+enable_language(C)
+
+add_library(foo foo.c)
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:foo.c,>")

+ 1 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-source-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-source-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at no-source\.cmake:[0-9]+ \(file\):
+  Error evaluating generator expression:
+
+    \$<SOURCE_PROPERTY:,FOO>
+
+  \$<SOURCE_PROPERTY:src,prop> expression requires a non-empty source name.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 2 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/no-source.cmake

@@ -0,0 +1,2 @@
+
+file(GENERATE OUTPUT result.txt CONTENT "$<SOURCE_PROPERTY:,FOO>")

+ 4 - 0
Tests/RunCMake/GenEx-SOURCE_PROPERTY/subdir/CMakeLists.txt

@@ -0,0 +1,4 @@
+
+set_property(SOURCE ../foo.c PROPERTY FOO BAR)
+
+add_library(foo STATIC ../foo.c)