diff options
-rw-r--r-- | Help/manual/cmake-variables.7.rst | 1 | ||||
-rw-r--r-- | Help/variable/CMAKE_WINDOWS_KMDF_VERSION.rst | 13 | ||||
-rw-r--r-- | Modules/Platform/WindowsKernelModeDriver-MSVC-C.cmake | 1 | ||||
-rw-r--r-- | Modules/Platform/WindowsKernelModeDriver-MSVC-CXX.cmake | 1 | ||||
-rw-r--r-- | Modules/Platform/WindowsKernelModeDriver.cmake | 69 | ||||
-rw-r--r-- | Source/cmExperimental.cxx | 2 | ||||
-rw-r--r-- | Tests/RunCMake/cmake_language/Experimental/WindowsKernelModeDriver-set.cmake | 2 |
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" |