Skip to content

Commit 5f75502

Browse files
committed
Added some initial support for free toolchains
1 parent 6f6e11f commit 5f75502

File tree

3 files changed

+758
-23
lines changed

3 files changed

+758
-23
lines changed

cmake/FindWdk.cmake

Lines changed: 101 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
# target_link_libraries(KmdfCppDriver KmdfCppLib)
3232
#
3333

34+
find_package(WindowsSDK) # the headers are needed
35+
3436
if ( DEFINED ENV{WindowsSdkDir} )
3537
file(GLOB WDK_NTDDK_FILES
3638
"$ENV{WindowsSdkDir}/Include/*/km/ntddk.h"
@@ -48,9 +50,35 @@ endif()
4850
include(FindPackageHandleStandardArgs)
4951
find_package_handle_standard_args(WDK REQUIRED_VARS WDK_LATEST_NTDDK_FILE)
5052

51-
if (NOT WDK_LATEST_NTDDK_FILE)
52-
return()
53-
endif()
53+
if (MINGW)
54+
get_filename_component(MINGW_BIN_DIR ${CMAKE_RC_COMPILER} DIRECTORY)
55+
get_filename_component(MINGW_DIR ${MINGW_BIN_DIR} DIRECTORY)
56+
if(REACTOS_SDK)
57+
set(REACTOS_DDK "${REACTOS_SDK}/include/ddk" CACHE PATH "The path to ReactOS DDK")
58+
set(REACTOS_CRT_HEADERS "${REACTOS_SDK}/include/CRT" CACHE PATH "The path to ReactOS CRT headers")
59+
set(REACTOS_PSDK_HEADERS "${REACTOS_SDK}/include/psdk" CACHE PATH "The path to ReactOS PSDK headers")
60+
set(REACTOS_XDK_HEADERS "${REACTOS_SDK}/include/xdk" CACHE PATH "The path to ReactOS XDK headers")
61+
endif(REACTOS_SDK)
62+
message( STATUS "MINGW_DIR ${MINGW_DIR}")
63+
64+
file(GLOB MINGW_INCLUDE_EXCPT_HS "${MINGW_DIR}/*/include/excpt.h")
65+
list(GET MINGW_INCLUDE_EXCPT_HS -1 MINGW_INCLUDE_EXCPT_H)
66+
get_filename_component(MINGW_INCLUDE_DIR ${MINGW_INCLUDE_EXCPT_H} DIRECTORY)
67+
68+
set(MINGW_INCLUDE_DIR "${MINGW_INCLUDE_DIR}" CACHE PATH "The path to MinGW include")
69+
set(MINGW_DDK "${MINGW_INCLUDE_DIR}/ddk" CACHE PATH "The path to MinGW DDK")
70+
71+
if (NOT MINGW_DDK)
72+
message(FATAL_ERROR "MINGW_DDK not found!")
73+
return()
74+
else()
75+
message(STATUS "MINGW_DDK_ROOT: " ${MINGW_DDK})
76+
endif()
77+
else(MINGW)
78+
if (NOT WDK_LATEST_NTDDK_FILE)
79+
return()
80+
endif()
81+
endif(MINGW)
5482

5583
get_filename_component(WDK_ROOT ${WDK_LATEST_NTDDK_FILE} DIRECTORY)
5684
get_filename_component(WDK_ROOT ${WDK_ROOT} DIRECTORY)
@@ -66,15 +94,43 @@ set(WDK_WINVER "0x0601" CACHE STRING "Default WINVER for WDK targets")
6694
set(WDK_ADDITIONAL_FLAGS_FILE "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/wdkflags.h")
6795
file(WRITE ${WDK_ADDITIONAL_FLAGS_FILE} "#pragma runtime_checks(\"suc\", off)")
6896

69-
set(WDK_COMPILE_FLAGS
70-
"/Zp8" # set struct alignment
71-
"/GF" # enable string pooling
72-
"/GR-" # disable RTTI
73-
"/Gz" # __stdcall by default
74-
"/kernel" # create kernel mode binary
75-
"/FIwarning.h" # disable warnings in WDK headers
76-
"/FI${WDK_ADDITIONAL_FLAGS_FILE}" # include file to disable RTC
97+
if(MINGW)
98+
set(WDK_COMPILE_FLAGS
99+
"-shared"
100+
"-nostartfiles"
101+
"-nostdlib"
102+
"-lntoskrnl"
103+
"-lhal"
104+
"-lndis"
105+
"-mdll"
106+
"-fno-rtti"
107+
"-mrtd" # __stdcall by default
108+
"-fpack-struct=8" # set struct alignment
109+
"-fms-extensions" # microsoft visual c++ compatibility
110+
"-fdelayed-template-parsing"
111+
"-fms-compatibility"
112+
"-D_MSC_VER=1300"
113+
"-masm=intel" #MSVC headers use intel syntax
114+
#"-std=c++17"
77115
)
116+
include_directories(SYSTEM "${LIB_DIR}/Include")
117+
#set(WDK_COMPILE_FLAGS
118+
# "/kernel" # create kernel mode binary
119+
# "/FIwarning.h" # disable warnings in WDK headers
120+
# "/FI${WDK_ADDITIONAL_FLAGS_FILE}" # include file to disable RTC
121+
# )
122+
elseif(MSVC)
123+
set(WDK_COMPILE_FLAGS
124+
"/Zp8" # set struct alignment
125+
"/GF" # enable string pooling
126+
"/GR-" # disable RTTI
127+
"/Gz" # __stdcall by default
128+
"/kernel" # create kernel mode binary
129+
"/FIwarning.h" # disable warnings in WDK headers
130+
"/FI${WDK_ADDITIONAL_FLAGS_FILE}" # include file to disable RTC
131+
)
132+
endif(MINGW)
133+
78134

79135
set(WDK_COMPILE_DEFINITIONS "WINNT=1")
80136
set(WDK_COMPILE_DEFINITIONS_DEBUG "MSC_NOOPT;DEPRECATE_DDK_FUNCTIONS=1;DBG=1")
@@ -89,18 +145,28 @@ else()
89145
message(FATAL_ERROR "Unsupported architecture")
90146
endif()
91147

92-
string(CONCAT WDK_LINK_FLAGS
93-
"/MANIFEST:NO " #
94-
"/DRIVER " #
95-
"/OPT:REF " #
96-
"/INCREMENTAL:NO " #
97-
"/OPT:ICF " #
98-
"/SUBSYSTEM:NATIVE " #
99-
"/MERGE:_TEXT=.text;_PAGE=PAGE " #
100-
"/NODEFAULTLIB " # do not link default CRT
101-
"/SECTION:INIT,d " #
102-
"/VERSION:10.0 " #
148+
if(MINGW)
149+
string(CONCAT WDK_LINK_FLAGS
150+
"--subsystem,native "
151+
"--image-base,0x10000 "
152+
"--file-alignment,0x1000 "
153+
"--section-alignment,0x1000 "
154+
"--entry,_DriverEntry@8 "
103155
)
156+
elseif(MSVC)
157+
string(CONCAT WDK_LINK_FLAGS
158+
"/MANIFEST:NO " #
159+
"/DRIVER " #
160+
"/OPT:REF " #
161+
"/INCREMENTAL:NO " #
162+
"/OPT:ICF " #
163+
"/SUBSYSTEM:NATIVE " #
164+
"/MERGE:_TEXT=.text;_PAGE=PAGE " #
165+
"/NODEFAULTLIB " # do not link default CRT
166+
"/SECTION:INIT,d " #
167+
"/VERSION:10.0 " #
168+
)
169+
endif(MINGW)
104170

105171
# Generate imported targets for WDK lib files
106172
file(GLOB WDK_LIBRARIES "${WDK_ROOT}/Lib/${WDK_VERSION}/km/${WDK_PLATFORM}/*.lib")
@@ -123,10 +189,16 @@ function(wdk_add_driver _target)
123189
"${WDK_COMPILE_DEFINITIONS};$<$<CONFIG:Debug>:${WDK_COMPILE_DEFINITIONS_DEBUG}>;_WIN32_WINNT=${WDK_WINVER}"
124190
)
125191
set_target_properties(${_target} PROPERTIES LINK_FLAGS "${WDK_LINK_FLAGS}")
126-
192+
127193
target_include_directories(${_target} SYSTEM PRIVATE
194+
#"${REACTOS_DDK}"
195+
#"${REACTOS_CRT_HEADERS}"
196+
#"${REACTOS_PSDK_HEADERS}"
197+
#"${REACTOS_XDK_HEADERS}"
128198
"${WDK_ROOT}/Include/${WDK_VERSION}/shared"
129199
"${WDK_ROOT}/Include/${WDK_VERSION}/km"
200+
"${MINGW_DDK}"
201+
#"${MINGW_INCLUDE_DIR}"
130202
)
131203

132204
target_link_libraries(${_target} WDK::NTOSKRNL WDK::HAL WDK::BUFFEROVERFLOWK WDK::WMILIB)
@@ -167,8 +239,14 @@ function(wdk_add_library _target)
167239
)
168240

169241
target_include_directories(${_target} SYSTEM PRIVATE
242+
#"${REACTOS_DDK}"
243+
#"${REACTOS_CRT_HEADERS}"
244+
#"${REACTOS_PSDK_HEADERS}"
245+
#"${REACTOS_XDK_HEADERS}"
170246
"${WDK_ROOT}/Include/${WDK_VERSION}/shared"
171247
"${WDK_ROOT}/Include/${WDK_VERSION}/km"
248+
"${MINGW_DDK}"
249+
#"${MINGW_INCLUDE_DIR}"
172250
)
173251

174252
if(DEFINED WDK_KMDF)

0 commit comments

Comments
 (0)