From e8582abc6d13840b1885abdc0de4ad94b1157c94 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 9 Apr 2024 20:05:19 -0400 Subject: cmExperimental: add support for getting a feature value from its name --- Source/cmExperimental.cxx | 14 ++++++++++++++ Source/cmExperimental.h | 3 +++ 2 files changed, 17 insertions(+) diff --git a/Source/cmExperimental.cxx b/Source/cmExperimental.cxx index fb21f53..8adf4e2 100644 --- a/Source/cmExperimental.cxx +++ b/Source/cmExperimental.cxx @@ -54,6 +54,20 @@ const cmExperimental::FeatureData& cmExperimental::DataForFeature(Feature f) return ::DataForFeature(f); } +cm::optional cmExperimental::FeatureByName( + std::string const& name) +{ + size_t idx = 0; + for (auto const& feature : LookupTable) { + if (feature.Name == name) { + return static_cast(idx); + } + ++idx; + } + + return {}; +} + bool cmExperimental::HasSupportEnabled(cmMakefile const& mf, Feature f) { bool enabled = false; diff --git a/Source/cmExperimental.h b/Source/cmExperimental.h index 5593c85..1abfbc3 100644 --- a/Source/cmExperimental.h +++ b/Source/cmExperimental.h @@ -8,6 +8,8 @@ #include #include +#include + class cmMakefile; class cmExperimental @@ -40,5 +42,6 @@ public: }; static const FeatureData& DataForFeature(Feature f); + static cm::optional FeatureByName(std::string const& name); static bool HasSupportEnabled(cmMakefile const& mf, Feature f); }; -- cgit v0.12 From 46da8e64b03578e3b7b7059574ee2efff7be071c Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 10 Apr 2024 00:56:32 -0400 Subject: cmCMakeLanguageCommand: use `cmExperimental::FeatureByName` --- Source/cmCMakeLanguageCommand.cxx | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/Source/cmCMakeLanguageCommand.cxx b/Source/cmCMakeLanguageCommand.cxx index 9ffc363..fe9257e 100644 --- a/Source/cmCMakeLanguageCommand.cxx +++ b/Source/cmCMakeLanguageCommand.cxx @@ -345,27 +345,18 @@ bool cmCMakeLanguageCommandGET_EXPERIMENTAL_FEATURE_ENABLED( auto const& featureName = expandedArgs[1]; auto const& variableName = expandedArgs[2]; - auto feature = cmExperimental::Feature::Sentinel; - for (std::size_t i = 0; - i < static_cast(cmExperimental::Feature::Sentinel); i++) { - if (cmExperimental::DataForFeature(static_cast(i)) - .Name == featureName) { - feature = static_cast(i); - break; + if (auto feature = cmExperimental::FeatureByName(featureName)) { + if (cmExperimental::HasSupportEnabled(makefile, *feature)) { + makefile.AddDefinition(variableName, "TRUE"); + } else { + makefile.AddDefinition(variableName, "FALSE"); } - } - if (feature == cmExperimental::Feature::Sentinel) { + } else { return FatalError(status, cmStrCat("Experimental feature name \"", featureName, "\" does not exist.")); } - if (cmExperimental::HasSupportEnabled(makefile, feature)) { - makefile.AddDefinition(variableName, "TRUE"); - } else { - makefile.AddDefinition(variableName, "FALSE"); - } - return true; } } -- cgit v0.12 From 8fd089018d3d720d9725480893301121e06c7d6e Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 9 Apr 2024 20:12:28 -0400 Subject: Tests/RunCMake/cmake_language: test GET_EXPERIMENTAL_FEATURE_ENABLED --- .../Experimental/ExportPackageDependencies-set-stderr.txt | 6 ++++++ .../Experimental/ExportPackageDependencies-set.cmake | 11 +++++++++++ .../Experimental/ExportPackageDependencies-unset.cmake | 8 ++++++++ Tests/RunCMake/cmake_language/Experimental/Unknown-result.txt | 1 + Tests/RunCMake/cmake_language/Experimental/Unknown-stderr.txt | 4 ++++ Tests/RunCMake/cmake_language/Experimental/Unknown.cmake | 8 ++++++++ .../Experimental/WindowsKernelModeDriver-set-stderr.txt | 6 ++++++ .../Experimental/WindowsKernelModeDriver-set.cmake | 11 +++++++++++ .../Experimental/WindowsKernelModeDriver-unset.cmake | 8 ++++++++ Tests/RunCMake/cmake_language/RunCMakeTest.cmake | 6 ++++++ 10 files changed, 69 insertions(+) create mode 100644 Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set-stderr.txt create mode 100644 Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set.cmake create mode 100644 Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-unset.cmake create mode 100644 Tests/RunCMake/cmake_language/Experimental/Unknown-result.txt create mode 100644 Tests/RunCMake/cmake_language/Experimental/Unknown-stderr.txt create mode 100644 Tests/RunCMake/cmake_language/Experimental/Unknown.cmake create mode 100644 Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set-stderr.txt create mode 100644 Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake create mode 100644 Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-unset.cmake diff --git a/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set-stderr.txt b/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set-stderr.txt new file mode 100644 index 0000000..0207835 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set-stderr.txt @@ -0,0 +1,6 @@ +CMake Warning \(dev\) at Experimental/ExportPackageDependencies-set.cmake:4 \(cmake_language\): + CMake's EXPORT_PACKAGE_DEPENDENCIES support is experimental. It is meant + only for experimentation and feedback to CMake developers. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set.cmake b/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set.cmake new file mode 100644 index 0000000..74b3f93 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-set.cmake @@ -0,0 +1,11 @@ +set(CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES + "1942b4fa-b2c5-4546-9385-83f254070067") + +cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED + "ExportPackageDependencies" + feature_present) + +if (NOT feature_present STREQUAL "TRUE") + message(FATAL_ERROR + "Expected the `ExportPackageDependencies` feature to be enabled.") +endif () diff --git a/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-unset.cmake b/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-unset.cmake new file mode 100644 index 0000000..c60595f --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/ExportPackageDependencies-unset.cmake @@ -0,0 +1,8 @@ +cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED + "ExportPackageDependencies" + feature_present) + +if (NOT feature_present STREQUAL "FALSE") + message(FATAL_ERROR + "Expected the `ExportPackageDependencies` feature to be disabled.") +endif () diff --git a/Tests/RunCMake/cmake_language/Experimental/Unknown-result.txt b/Tests/RunCMake/cmake_language/Experimental/Unknown-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/Unknown-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/cmake_language/Experimental/Unknown-stderr.txt b/Tests/RunCMake/cmake_language/Experimental/Unknown-stderr.txt new file mode 100644 index 0000000..ca7c058 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/Unknown-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at Experimental/Unknown.cmake:1 \(cmake_language\): + cmake_language Experimental feature name "Unknown" does not exist. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/cmake_language/Experimental/Unknown.cmake b/Tests/RunCMake/cmake_language/Experimental/Unknown.cmake new file mode 100644 index 0000000..d5e3047 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/Unknown.cmake @@ -0,0 +1,8 @@ +cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED + "Unknown" + feature_present) + +if (NOT feature_present STREQUAL "") + message(FATAL_ERROR + "Got a result for the `Unknown` experimental feature.") +endif () diff --git a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set-stderr.txt b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set-stderr.txt new file mode 100644 index 0000000..d6f8788 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set-stderr.txt @@ -0,0 +1,6 @@ +CMake Warning \(dev\) at Experimental/WindowsKernelModeDriver-set.cmake:4 \(cmake_language\): + CMake's Windows kernel-mode driver support is experimental. It is meant + only for experimentation and feedback to CMake developers. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake new file mode 100644 index 0000000..f942d95 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake @@ -0,0 +1,11 @@ +set(CMAKE_EXPERIMENTAL_WINDOWS_KERNEL_MODE_DRIVER + "5c2d848d-4efa-4529-a768-efd57171bf68") + +cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED + "WindowsKernelModeDriver" + feature_present) + +if (NOT feature_present STREQUAL "TRUE") + message(FATAL_ERROR + "Expected the `WindowsKernelModeDriver` feature to be enabled.") +endif () diff --git a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-unset.cmake b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-unset.cmake new file mode 100644 index 0000000..7aee0d3 --- /dev/null +++ b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-unset.cmake @@ -0,0 +1,8 @@ +cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED + "WindowsKernelModeDriver" + feature_present) + +if (NOT feature_present STREQUAL "FALSE") + message(FATAL_ERROR + "Expected the `WindowsKernelModeDriver` feature to be disabled.") +endif () diff --git a/Tests/RunCMake/cmake_language/RunCMakeTest.cmake b/Tests/RunCMake/cmake_language/RunCMakeTest.cmake index 5fb2de6..7c47b06 100644 --- a/Tests/RunCMake/cmake_language/RunCMakeTest.cmake +++ b/Tests/RunCMake/cmake_language/RunCMakeTest.cmake @@ -156,3 +156,9 @@ run_cmake_command( -DCMAKE_MESSAGE_LOG_LEVEL=TRACE -P ${RunCMake_SOURCE_DIR}/get_message_log_level.cmake ) + +run_cmake(Experimental/ExportPackageDependencies-set) +run_cmake(Experimental/ExportPackageDependencies-unset) +run_cmake(Experimental/WindowsKernelModeDriver-set) +run_cmake(Experimental/WindowsKernelModeDriver-unset) +run_cmake(Experimental/Unknown) -- cgit v0.12