diff options
author | Marc Chevrier <marc.chevrier@gmail.com> | 2022-05-28 10:26:05 (GMT) |
---|---|---|
committer | Marc Chevrier <marc.chevrier@gmail.com> | 2022-06-01 13:28:54 (GMT) |
commit | 4d1883df1142fbe5c23cb7f433f619c1a7322984 (patch) | |
tree | 6f066361f28b28e1700aa28d2aa78885bb136de6 | |
parent | f3be15e4382c17d0441a4fa69f44482d888e9c9d (diff) | |
download | CMake-4d1883df1142fbe5c23cb7f433f619c1a7322984.zip CMake-4d1883df1142fbe5c23cb7f433f619c1a7322984.tar.gz CMake-4d1883df1142fbe5c23cb7f433f619c1a7322984.tar.bz2 |
Genex-PATH_EQUAL: path comparison
To complete issue #23498
-rw-r--r-- | Help/command/cmake_path.rst | 1 | ||||
-rw-r--r-- | Help/manual/cmake-generator-expressions.7.rst | 13 | ||||
-rw-r--r-- | Help/release/dev/Genex-PATH_EQUAL.rst | 5 | ||||
-rw-r--r-- | Source/cmGeneratorExpressionNode.cxx | 18 | ||||
-rw-r--r-- | Tests/RunCMake/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/CMakeLists.txt | 5 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/PATH_EQUAL.cmake.in | 8 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/RunCMakeTest.cmake | 14 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-result.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-stderr.txt | 42 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments.cmake | 7 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/check_errors.cmake | 12 | ||||
-rw-r--r-- | Tests/RunCMake/GenEx-PATH_EQUAL/generate.cmake | 2 |
13 files changed, 129 insertions, 0 deletions
diff --git a/Help/command/cmake_path.rst b/Help/command/cmake_path.rst index 77525ed..6fd3cf6 100644 --- a/Help/command/cmake_path.rst +++ b/Help/command/cmake_path.rst @@ -473,6 +473,7 @@ are :ref:`normalized <Normalization>` before the check. set(path "/a/b") cmake_path(IS_PREFIX path "/a/c/../b" NORMALIZE result) # result = true +.. _Path COMPARE: .. _COMPARE: :: diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst index 1f0dd59..03821ec 100644 --- a/Help/manual/cmake-generator-expressions.7.rst +++ b/Help/manual/cmake-generator-expressions.7.rst @@ -123,6 +123,19 @@ String Comparisons ``1`` if ``v1`` is a version greater than or equal to ``v2``, else ``0``. +Path Comparisons +---------------- + +.. genex:: $<PATH_EQUAL:path1,path2> + + .. versionadded:: 3.24 + + Compares the lexical representations of two paths. No normalization is + performed on either path. Returns ``1`` if the paths are equal, ``0`` + otherwise. + + See :ref:`cmake_path(COMPARE) <Path COMPARE>` for more details. + .. _GenEx Path Queries: Path Queries diff --git a/Help/release/dev/Genex-PATH_EQUAL.rst b/Help/release/dev/Genex-PATH_EQUAL.rst new file mode 100644 index 0000000..953ac26 --- /dev/null +++ b/Help/release/dev/Genex-PATH_EQUAL.rst @@ -0,0 +1,5 @@ +Genex-PATH_EQUAL +---------------- + +* The :genex:`PATH_EQUAL` generator expression was added to manage path + comparisons. diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 52b771a..b08cddb 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -1034,6 +1034,23 @@ static const struct PathNode : public cmGeneratorExpressionNode } } pathNode; +static const struct PathEqualNode : public cmGeneratorExpressionNode +{ + PathEqualNode() {} // NOLINT(modernize-use-equals-default) + + int NumExpectedParameters() const override { return 2; } + + std::string Evaluate( + const std::vector<std::string>& parameters, + cmGeneratorExpressionContext* /*context*/, + const GeneratorExpressionContent* /*content*/, + cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override + { + return cmCMakePath{ parameters[0] } == cmCMakePath{ parameters[1] } ? "1" + : "0"; + } +} pathEqualNode; + static const struct MakeCIdentifierNode : public cmGeneratorExpressionNode { MakeCIdentifierNode() {} // NOLINT(modernize-use-equals-default) @@ -3265,6 +3282,7 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode( { "LOWER_CASE", &lowerCaseNode }, { "UPPER_CASE", &upperCaseNode }, { "PATH", &pathNode }, + { "PATH_EQUAL", &pathEqualNode }, { "MAKE_C_IDENTIFIER", &makeCIdentifierNode }, { "BOOL", &boolNode }, { "IF", &ifNode }, diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index a94cf21..3ca01ec 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -331,6 +331,7 @@ add_RunCMake_test(GenEx-TARGET_FILE -DLINKER_SUPPORTS_PDB=${LINKER_SUPPORTS_PDB} add_RunCMake_test(GenEx-GENEX_EVAL) add_RunCMake_test(GenEx-TARGET_RUNTIME_DLLS) add_RunCMake_test(GenEx-PATH) +add_RunCMake_test(GenEx-PATH_EQUAL) add_RunCMake_test(GeneratorExpression) add_RunCMake_test(GeneratorInstance) add_RunCMake_test(GeneratorPlatform) diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/CMakeLists.txt b/Tests/RunCMake/GenEx-PATH_EQUAL/CMakeLists.txt new file mode 100644 index 0000000..f9748e9 --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.18...3.24) + +project(${RunCMake_TEST} NONE) + +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/PATH_EQUAL.cmake.in b/Tests/RunCMake/GenEx-PATH_EQUAL/PATH_EQUAL.cmake.in new file mode 100644 index 0000000..e8a1e95 --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/PATH_EQUAL.cmake.in @@ -0,0 +1,8 @@ + +include ("${RunCMake_SOURCE_DIR}/check_errors.cmake") + +expect_true("$<PATH_EQUAL:a///b/c,a/b/c>" "a///b/c" "a/b/c") + +expect_false("$<PATH_EQUAL:a/b/d/../c,a/b/c>" "a/b/d/../c" "a/b/c") + +expect_true("$<PATH_EQUAL:$<PATH:NORMAL_PATH,a/b/d/../c>,a/b/c>" "a/b/d/../c" "a/b/c") diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/RunCMakeTest.cmake b/Tests/RunCMake/GenEx-PATH_EQUAL/RunCMakeTest.cmake new file mode 100644 index 0000000..802c503 --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/RunCMakeTest.cmake @@ -0,0 +1,14 @@ + +include(RunCMake) + +run_cmake(WrongArguments) + +function(check_path_execution name) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${name}-build) + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_VARIANT_DESCRIPTION " - ${name}") + run_cmake_with_options(generate -DPATH_TEST=${name}) + run_cmake_command(check "${CMAKE_COMMAND}" "-DRunCMake_SOURCE_DIR=${RunCMake_SOURCE_DIR}" -P "${RunCMake_TEST_BINARY_DIR}/${name}.cmake") +endfunction() + +check_path_execution (PATH_EQUAL) diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-result.txt b/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-stderr.txt b/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-stderr.txt new file mode 100644 index 0000000..4cbc7ba --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-stderr.txt @@ -0,0 +1,42 @@ +CMake Error at WrongArguments.cmake:[0-9]+ \(add_custom_target\): + Error evaluating generator expression: + + \$<PATH_EQUAL> + + \$<PATH_EQUAL> expression requires 2 comma separated parameters, but got 0 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\) + + +CMake Error at WrongArguments.cmake:[0-9]+ \(add_custom_target\): + Error evaluating generator expression: + + \$<PATH_EQUAL:> + + \$<PATH_EQUAL> expression requires 2 comma separated parameters, but got 1 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\) + + +CMake Error at WrongArguments.cmake:2 \(add_custom_target\): + Error evaluating generator expression: + + \$<PATH_EQUAL:,,> + + \$<PATH_EQUAL> expression requires 2 comma separated parameters, but got 3 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\) + + +CMake Error at WrongArguments.cmake:[0-9]+ \(add_custom_target\): + Error evaluating generator expression: + + \$<PATH_EQUAL:something,,> + + \$<PATH_EQUAL> expression requires 2 comma separated parameters, but got 3 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments.cmake b/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments.cmake new file mode 100644 index 0000000..1288a0e --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments.cmake @@ -0,0 +1,7 @@ + +add_custom_target(check ALL COMMAND check + $<PATH_EQUAL> + $<PATH_EQUAL:> + $<PATH_EQUAL:,,> + $<PATH_EQUAL:something,,> + VERBATIM) diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/check_errors.cmake b/Tests/RunCMake/GenEx-PATH_EQUAL/check_errors.cmake new file mode 100644 index 0000000..fd99eb4 --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/check_errors.cmake @@ -0,0 +1,12 @@ + +function(EXPECT_TRUE output data reference) + if (NOT output) + message(SEND_ERROR "'${data}' not equal to '${reference}'") + endif() +endfunction() + +function(EXPECT_FALSE output data reference) + if (output) + message(SEND_ERROR "'${data}' equal to '${reference}'") + endif() +endfunction() diff --git a/Tests/RunCMake/GenEx-PATH_EQUAL/generate.cmake b/Tests/RunCMake/GenEx-PATH_EQUAL/generate.cmake new file mode 100644 index 0000000..4bd5f3b --- /dev/null +++ b/Tests/RunCMake/GenEx-PATH_EQUAL/generate.cmake @@ -0,0 +1,2 @@ + +file(GENERATE OUTPUT "${PATH_TEST}.cmake" INPUT "${PATH_TEST}.cmake.in") |