summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Help/manual/cmake-variables.7.rst1
-rw-r--r--Help/variable/CMAKE_WINDOWS_KMDF_VERSION.rst13
-rw-r--r--Modules/Platform/WindowsKernelModeDriver-MSVC-C.cmake1
-rw-r--r--Modules/Platform/WindowsKernelModeDriver-MSVC-CXX.cmake1
-rw-r--r--Modules/Platform/WindowsKernelModeDriver.cmake69
-rw-r--r--Source/cmExperimental.cxx2
-rw-r--r--Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake2
7 files changed, 87 insertions, 2 deletions
diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst
index 48d4a5c..ca063e7 100644
--- a/Help/manual/cmake-variables.7.rst
+++ b/Help/manual/cmake-variables.7.rst
@@ -143,6 +143,7 @@ Variables that Provide Information
/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION
/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION
/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM
+ /variable/CMAKE_WINDOWS_KMDF_VERSION
/variable/CMAKE_XCODE_BUILD_SYSTEM
/variable/CMAKE_XCODE_PLATFORM_TOOLSET
/variable/PROJECT-NAME_BINARY_DIR
diff --git a/Help/variable/CMAKE_WINDOWS_KMDF_VERSION.rst b/Help/variable/CMAKE_WINDOWS_KMDF_VERSION.rst
new file mode 100644
index 0000000..f878f77
--- /dev/null
+++ b/Help/variable/CMAKE_WINDOWS_KMDF_VERSION.rst
@@ -0,0 +1,13 @@
+CMAKE_WINDOWS_KMDF_VERSION
+--------------------------
+
+.. versionadded:: 3.31
+
+Specify the `Kernel-Mode Drive Framework`_ target version.
+
+A :variable:`toolchain file <CMAKE_TOOLCHAIN_FILE>` that sets
+:variable:`CMAKE_SYSTEM_NAME` to ``WindowsKernelModeDriver``
+must also set ``CMAKE_WINDOWS_KMDF_VERSION`` to specify the
+KMDF target version.
+
+.. _`Kernel-Mode Drive Framework`: https://learn.microsoft.com/en-us/windows-hardware/drivers/wdf/kmdf-version-history
diff --git a/Modules/Platform/WindowsKernelModeDriver-MSVC-C.cmake b/Modules/Platform/WindowsKernelModeDriver-MSVC-C.cmake
index ce8060b..e3858b3 100644
--- a/Modules/Platform/WindowsKernelModeDriver-MSVC-C.cmake
+++ b/Modules/Platform/WindowsKernelModeDriver-MSVC-C.cmake
@@ -1 +1,2 @@
include(Platform/Windows-MSVC-C)
+__windows_kernel_mode(C)
diff --git a/Modules/Platform/WindowsKernelModeDriver-MSVC-CXX.cmake b/Modules/Platform/WindowsKernelModeDriver-MSVC-CXX.cmake
index 281eadc..e0b46ca 100644
--- a/Modules/Platform/WindowsKernelModeDriver-MSVC-CXX.cmake
+++ b/Modules/Platform/WindowsKernelModeDriver-MSVC-CXX.cmake
@@ -1 +1,2 @@
include(Platform/Windows-MSVC-CXX)
+__windows_kernel_mode(CXX)
diff --git a/Modules/Platform/WindowsKernelModeDriver.cmake b/Modules/Platform/WindowsKernelModeDriver.cmake
index 65b2eae..3b1a427 100644
--- a/Modules/Platform/WindowsKernelModeDriver.cmake
+++ b/Modules/Platform/WindowsKernelModeDriver.cmake
@@ -1 +1,70 @@
include(Platform/Windows)
+macro(__windows_kernel_mode lang)
+ if(CMAKE_CROSSCOMPILING)
+ set(_KMDF_ERROR_EPILOGUE
+ "Please set a valid CMAKE_WINDOWS_KMDF_VERSION in the toolchain file. "
+ "For more information, see\n"
+ " https://learn.microsoft.com/en-us/windows-hardware/drivers/wdf/kmdf-version-history"
+ )
+ if(NOT DEFINED CMAKE_WINDOWS_KMDF_VERSION)
+ message(FATAL_ERROR
+ "The Kernel-Mode Driver Framework (KMDF) version has not been set. "
+ ${_KMDF_ERROR_EPILOGUE}
+ )
+ endif()
+ if(NOT CMAKE_WINDOWS_KMDF_VERSION MATCHES "^[0-9]\.[0-9]+$")
+ message(FATAL_ERROR
+ "The Kernel-Mode Driver Framework (KMDF) version is set to an invalid value. "
+ "The expected format is [0-9].[0-9]+. For example, 1.15 or 1.9. "
+ ${_KMDF_ERROR_EPILOGUE}
+ )
+ endif()
+
+ set(_KMDF_ENV_VARS
+ Platform
+ WindowsSdkDir
+ VCToolsInstallDir
+ )
+ if(DEFINED ENV{EnterpriseWDK})
+ set(_WINDOWS_SDK_VERSION "$ENV{Version_Number}")
+ list(APPEND _KMDF_ENV_VARS Version_Number)
+ else()
+ set(_WINDOWS_SDK_VERSION "$ENV{WindowsSDKLibVersion}")
+ list(APPEND _KMDF_ENV_VARS WindowsSDKLibVersion)
+ endif()
+ foreach(var IN LISTS _KMDF_ENV_VARS)
+ if(NOT DEFINED ENV{${var}})
+ message(FATAL_ERROR "Required environment variable '${var}' is not defined.")
+ endif()
+ endforeach()
+ unset(_KMDF_ENV_VARS)
+
+ set(_KMDF_PLATFORM "$ENV{Platform}")
+
+ if(NOT DEFINED CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES
+ $ENV{WindowsSdkDir}/Include/${_WINDOWS_SDK_VERSION}/km
+ $ENV{WindowsSdkDir}/Include/${_WINDOWS_SDK_VERSION}/km/crt
+ $ENV{WindowsSdkDir}/Include/${_WINDOWS_SDK_VERSION}/shared
+ $ENV{WindowsSdkDir}/Include/wdf/kmdf/${CMAKE_WINDOWS_KMDF_VERSION}
+ $ENV{VCToolsInstallDir}/include
+ )
+ endif()
+
+ if(NOT DEFINED CMAKE_RC_STANDARD_INCLUDE_DIRECTORIES)
+ set(CMAKE_RC_STANDARD_INCLUDE_DIRECTORIES
+ ${CMAKE_${lang}_STANDARD_INCLUDE_DIRECTORIES}
+ )
+ endif()
+
+ if(NOT DEFINED CMAKE_${lang}_STANDARD_LINK_DIRECTORIES)
+ set(CMAKE_${lang}_STANDARD_LINK_DIRECTORIES
+ $ENV{WindowsSdkDir}/Lib/${_WINDOWS_SDK_VERSION}/km/${_KMDF_PLATFORM}
+ )
+ endif()
+
+ unset(_KMDF_ERROR_EPILOGUE)
+ unset(_KMDF_PLATFORM)
+ unset(_WINDOWS_SDK_VERSION)
+ endif()
+endmacro()
diff --git a/Source/cmExperimental.cxx b/Source/cmExperimental.cxx
index 4504c07..e2a6bc8 100644
--- a/Source/cmExperimental.cxx
+++ b/Source/cmExperimental.cxx
@@ -30,7 +30,7 @@ cmExperimental::FeatureData LookupTable[] = {
false },
// WindowsKernelModeDriver
{ "WindowsKernelModeDriver",
- "5c2d848d-4efa-4529-a768-efd57171bf68",
+ "7f524e81-99c7-48f3-a35d-278bae54282c",
"CMAKE_EXPERIMENTAL_WINDOWS_KERNEL_MODE_DRIVER",
"CMake's Windows kernel-mode driver support is experimental. It is meant "
"only for experimentation and feedback to CMake developers.",
diff --git a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake
index f942d95..8068aaa 100644
--- a/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake
+++ b/Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake
@@ -1,5 +1,5 @@
set(CMAKE_EXPERIMENTAL_WINDOWS_KERNEL_MODE_DRIVER
- "5c2d848d-4efa-4529-a768-efd57171bf68")
+ "7f524e81-99c7-48f3-a35d-278bae54282c")
cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED
"WindowsKernelModeDriver"