summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Chevrier <marc.chevrier@gmail.com>2022-05-28 10:26:05 (GMT)
committerMarc Chevrier <marc.chevrier@gmail.com>2022-06-01 13:28:54 (GMT)
commit4d1883df1142fbe5c23cb7f433f619c1a7322984 (patch)
tree6f066361f28b28e1700aa28d2aa78885bb136de6
parentf3be15e4382c17d0441a4fa69f44482d888e9c9d (diff)
downloadCMake-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.rst1
-rw-r--r--Help/manual/cmake-generator-expressions.7.rst13
-rw-r--r--Help/release/dev/Genex-PATH_EQUAL.rst5
-rw-r--r--Source/cmGeneratorExpressionNode.cxx18
-rw-r--r--Tests/RunCMake/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/CMakeLists.txt5
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/PATH_EQUAL.cmake.in8
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/RunCMakeTest.cmake14
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-result.txt1
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments-stderr.txt42
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/WrongArguments.cmake7
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/check_errors.cmake12
-rw-r--r--Tests/RunCMake/GenEx-PATH_EQUAL/generate.cmake2
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")