@@ -4,6 +4,28 @@ cmake_policy(SET CMP0021 OLD)
44set (CMAKE_CXX_STANDARD_LIBRARIES " " )
55set (CMAKE_C_STANDARD_LIBRARIES ${CMAKE_CXX_STANDARD_LIBRARIES} )
66
7+ if (NOT DEFINED CRTSYS_NTL_MAIN)
8+ set (CRTSYS_NTL_MAIN ON )
9+ endif ()
10+
11+ if (NOT DEFINED CRTSYS_USE_LIBCNTPR)
12+ set (CRTSYS_USE_LIBCNTPR ON )
13+ endif ()
14+
15+ if (DEFINED crtsys_SOURCE_DIR )
16+ set (_CRTSYS_ROOT "${crtsys_SOURCE_DIR } " )
17+ else ()
18+ get_filename_component (_CRTSYS_ROOT "${CMAKE_CURRENT_LIST_DIR } /.." ABSOLUTE )
19+ endif ()
20+
21+ if (NOT DEFINED CRTSYS_USE_PREBUILT)
22+ if (NOT TARGET crtsys AND EXISTS "${_CRTSYS_ROOT} /lib/native" )
23+ set (CRTSYS_USE_PREBUILT ON )
24+ else ()
25+ set (CRTSYS_USE_PREBUILT OFF )
26+ endif ()
27+ endif ()
28+
729function (crtsys_scope_compile_options_to_c_cxx TARGET_NAME )
830 get_target_property (TARGET_COMPILE_OPTIONS ${TARGET_NAME} COMPILE_OPTIONS )
931 if (NOT TARGET_COMPILE_OPTIONS)
@@ -57,23 +79,100 @@ CPMAddPackage("gh:ntoskrnl7/FindWDK#master")
5779list (APPEND CMAKE_MODULE_PATH "${FindWDK_SOURCE_DIR } /cmake" )
5880find_package (WDK REQUIRED )
5981
60- function (crtsys_add_driver _target )
61- cmake_parse_arguments (WDK "" "WINVER" "" ${ARGN} )
62- wdk_add_driver (${_target} ${WDK_UNPARSED_ARGUMENTS} CUSTOM_ENTRY_POINT CrtSysDriverEntry EXTENDED_CPP_FEATURES )
63- crtsys_scope_compile_options_to_c_cxx (${_target} )
82+ function (crtsys_get_prebuilt_arch _out_arch )
83+ if ("${CMAKE_VS_PLATFORM_NAME} " STREQUAL "x64" )
84+ set (_arch x64)
85+ elseif ("${CMAKE_VS_PLATFORM_NAME} " STREQUAL "ARM64" )
86+ set (_arch ARM64)
87+ elseif ("${CMAKE_VS_PLATFORM_NAME} " STREQUAL "Win32" )
88+ message (FATAL_ERROR "The crtsys prebuilt driver bundle does not include x86 driver libraries." )
89+ else ()
90+ message (FATAL_ERROR "Unsupported crtsys prebuilt platform: ${CMAKE_VS_PLATFORM_NAME} " )
91+ endif ()
92+
93+ set (${_out_arch} "${_arch} " PARENT_SCOPE )
94+ endfunction ()
95+
96+ function (crtsys_get_prebuilt_library _out_path _library _configuration )
97+ crtsys_get_prebuilt_arch (_arch )
98+
99+ if ("${_configuration} " STREQUAL "Debug" )
100+ set (_config_dir Debug)
101+ else ()
102+ set (_config_dir Release)
103+ endif ()
64104
65- target_link_libraries (${_target} crtsys )
105+ set (_path "${_CRTSYS_ROOT} /lib/native/${_arch} /${_config_dir} /${_library} " )
106+ file (TO_CMAKE_PATH "${_path} " _path )
107+ if (NOT EXISTS "${_path} " )
108+ message (FATAL_ERROR "Required crtsys prebuilt library was not found: ${_path} " )
109+ endif ()
66110
111+ set (${_out_path} "${_path} " PARENT_SCOPE )
112+ endfunction ()
113+
114+ function (crtsys_apply_driver_settings _target _root )
67115 get_target_property (INC_DIR_TMP ${_target} INCLUDE_DIRECTORIES)
68- set_property (TARGET ${_target} PROPERTY INCLUDE_DIRECTORIES "${crtsys_SOURCE_DIR } /include;${crtsys_SOURCE_DIR } /include/.internal/msvc/$(VCToolsVersion);${crtsys_SOURCE_DIR } /include/.internal/msvc/${MSVC_TOOLSET_VERSION } ;${crtsys_SOURCE_DIR } /include/.internal/msvc/$(VCToolsVersion)/stl;${crtsys_SOURCE_DIR } /include/.internal/msvc/${MSVC_TOOLSET_VERSION } /stl;$(VC_IncludePath);$(WindowsSDK_IncludePath);${INC_DIR_TMP} " )
116+ if (NOT INC_DIR_TMP)
117+ set (INC_DIR_TMP "" )
118+ endif ()
69119
70- if (EXISTS "${crtsys_SOURCE_DIR } /include/.internal/winsdk/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} /wdk/${WDK_VERSION} /forced.h" )
71- target_compile_options (${_target} PRIVATE "$<$<COMPILE_LANGUAGE :C ,CXX >:/FI ${crtsys_SOURCE_DIR } /include /.internal /winsdk /${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} /wdk /${WDK_VERSION} /forced .h >" )
120+ set_property (TARGET ${_target} PROPERTY INCLUDE_DIRECTORIES "${_root} /include;${_root} /include/.internal/msvc/$(VCToolsVersion);${_root} /include/.internal/msvc/${MSVC_TOOLSET_VERSION } ;${_root} /include/.internal/msvc/$(VCToolsVersion)/stl;${_root} /include/.internal/msvc/${MSVC_TOOLSET_VERSION } /stl;$(VC_IncludePath);$(WindowsSDK_IncludePath);${INC_DIR_TMP} " )
121+
122+ if (EXISTS "${_root} /include/.internal/winsdk/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} /wdk/${WDK_VERSION} /forced.h" )
123+ target_compile_options (${_target} PRIVATE "$<$<COMPILE_LANGUAGE :C ,CXX >:/FI ${_root} /include /.internal /winsdk /${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} /wdk /${WDK_VERSION} /forced .h >" )
72124 endif ()
73125
74- target_compile_options (${_target} PRIVATE "$<$<COMPILE_LANGUAGE :C ,CXX >:/FI ${crtsys_SOURCE_DIR } /include /.internal /adjust_link_order >" )
126+ target_compile_options (${_target} PRIVATE "$<$<COMPILE_LANGUAGE :C ,CXX >:/FI ${_root } /include /.internal /adjust_link_order >" )
75127
76128 if (CRTSYS_NTL_MAIN)
77129 target_compile_definitions (${_target} PUBLIC CRTSYS_USE_NTL_MAIN )
78130 endif ()
79131endfunction ()
132+
133+ function (crtsys_link_prebuilt_driver_libraries _target )
134+ crtsys_get_prebuilt_library (_crtsys_debug crtsys.lib Debug )
135+ crtsys_get_prebuilt_library (_ldk_debug Ldk.lib Debug )
136+ crtsys_get_prebuilt_library (_crtsys_release crtsys.lib Release )
137+ crtsys_get_prebuilt_library (_ldk_release Ldk.lib Release )
138+
139+ target_link_libraries (
140+ ${_target}
141+ debug "${_crtsys_debug} "
142+ debug "${_ldk_debug} "
143+ optimized "${_crtsys_release} "
144+ optimized "${_ldk_release} "
145+ )
146+
147+ target_compile_definitions (${_target} PUBLIC "_KERNEL32_" "_ITERATOR_DEBUG_LEVEL=0" "_HAS_EXCEPTIONS" )
148+ target_compile_options (${_target} PUBLIC "$<$<COMPILE_LANGUAGE :CXX >:/Zc :threadSafeInit ->" )
149+ target_compile_options (${_target} PUBLIC "$<$<COMPILE_LANGUAGE :C ,CXX >:/MT >" )
150+
151+ if (CRTSYS_USE_LIBCNTPR)
152+ if (NOT TARGET WDK::LIBCNTPR)
153+ message (FATAL_ERROR "WDK::LIBCNTPR is required for crtsys prebuilt driver support." )
154+ endif ()
155+
156+ target_link_libraries (${_target} WDK::LIBCNTPR )
157+ target_compile_definitions (${_target} PUBLIC CRTSYS_USE_LIBCNTPR )
158+ target_link_options (${_target} PUBLIC "/FORCE:MULTIPLE" )
159+ endif ()
160+ endfunction ()
161+
162+ function (crtsys_add_driver _target )
163+ cmake_parse_arguments (WDK "" "WINVER" "" ${ARGN} )
164+ wdk_add_driver (${_target} ${WDK_UNPARSED_ARGUMENTS} CUSTOM_ENTRY_POINT CrtSysDriverEntry EXTENDED_CPP_FEATURES )
165+ crtsys_scope_compile_options_to_c_cxx (${_target} )
166+
167+ crtsys_apply_driver_settings (${_target} "${_CRTSYS_ROOT} " )
168+
169+ if (CRTSYS_USE_PREBUILT)
170+ crtsys_link_prebuilt_driver_libraries (${_target} )
171+ else ()
172+ if (NOT TARGET crtsys)
173+ message (FATAL_ERROR "crtsys target was not found. Add crtsys with CPMAddPackage or use an unpacked crtsys native release bundle." )
174+ endif ()
175+
176+ target_link_libraries (${_target} crtsys )
177+ endif ()
178+ endfunction ()
0 commit comments