1 2function(add_dependency_node _node) 3 if(GENERATE_DEPENDENCY_GRAPH) 4 get_target_property(_type ${_node} TYPE) 5 if(_type MATCHES SHARED_LIBRARY|MODULE_LIBRARY OR ${_node} MATCHES ntoskrnl) 6 file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " <node id=\"${_node}\"/>\n") 7 endif() 8 endif() 9endfunction() 10 11function(add_dependency_edge _source _target) 12 if(GENERATE_DEPENDENCY_GRAPH) 13 get_target_property(_type ${_source} TYPE) 14 if(_type MATCHES SHARED_LIBRARY|MODULE_LIBRARY) 15 file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " <edge source=\"${_source}\" target=\"${_target}\"/>\n") 16 endif() 17 endif() 18endfunction() 19 20function(add_dependency_header) 21 if(GENERATE_DEPENDENCY_GRAPH) 22 file(WRITE ${REACTOS_BINARY_DIR}/dependencies.graphml "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<graphml>\n <graph id=\"ReactOS dependencies\" edgedefault=\"directed\">\n") 23 endif() 24endfunction() 25 26function(add_dependency_footer) 27 if(GENERATE_DEPENDENCY_GRAPH) 28 add_dependency_node(ntdll) 29 file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " </graph>\n</graphml>\n") 30 endif() 31endfunction() 32 33function(add_message_headers _type) 34 if(${_type} STREQUAL UNICODE) 35 set(_flag "-U") 36 else() 37 set(_flag "-A") 38 endif() 39 foreach(_file ${ARGN}) 40 get_filename_component(_file_name ${_file} NAME_WE) 41 set(_converted_file ${CMAKE_CURRENT_BINARY_DIR}/${_file}) ## ${_file_name}.mc 42 set(_source_file ${CMAKE_CURRENT_SOURCE_DIR}/${_file}) ## ${_file_name}.mc 43 add_custom_command( 44 OUTPUT "${_converted_file}" 45 COMMAND native-utf16le "${_source_file}" "${_converted_file}" nobom 46 DEPENDS native-utf16le "${_source_file}") 47 macro_mc(${_flag} ${_converted_file}) 48 add_custom_command( 49 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_file_name}.h ${CMAKE_CURRENT_BINARY_DIR}/${_file_name}.rc 50 COMMAND ${COMMAND_MC} 51 DEPENDS "${_converted_file}") 52 set_source_files_properties( 53 ${CMAKE_CURRENT_BINARY_DIR}/${_file_name}.h ${CMAKE_CURRENT_BINARY_DIR}/${_file_name}.rc 54 PROPERTIES GENERATED TRUE) 55 add_custom_target(${_file_name} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_file_name}.h ${CMAKE_CURRENT_BINARY_DIR}/${_file_name}.rc) 56 endforeach() 57endfunction() 58 59function(add_link) 60 cmake_parse_arguments(_LINK "MINIMIZE" "NAME;PATH;CMD_LINE_ARGS;ICON;GUID" "" ${ARGN}) 61 if(NOT _LINK_NAME OR NOT _LINK_PATH) 62 message(FATAL_ERROR "You must provide name and path") 63 endif() 64 65 if(_LINK_CMD_LINE_ARGS) 66 set(_LINK_CMD_LINE_ARGS -c ${_LINK_CMD_LINE_ARGS}) 67 endif() 68 69 if(_LINK_ICON) 70 set(_LINK_ICON -i ${_LINK_ICON}) 71 endif() 72 73 if(_LINK_GUID) 74 set(_LINK_GUID -g ${_LINK_GUID}) 75 endif() 76 77 if(_LINK_MINIMIZE) 78 set(_LINK_MINIMIZE "-m") 79 endif() 80 81 add_custom_command( 82 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_LINK_NAME}.lnk 83 COMMAND native-mkshelllink -o ${CMAKE_CURRENT_BINARY_DIR}/${_LINK_NAME}.lnk ${_LINK_CMD_LINE_ARGS} ${_LINK_ICON} ${_LINK_GUID} ${_LINK_MINIMIZE} ${_LINK_PATH} 84 DEPENDS native-mkshelllink) 85 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${_LINK_NAME}.lnk PROPERTIES GENERATED TRUE) 86endfunction() 87 88# 89# WARNING! 90# Please keep the numbering in this list in sync with 91# boot/bootdata/packages/reactos.dff.in 92# 93macro(dir_to_num dir var) 94 if(${dir} STREQUAL reactos) 95 set(${var} 1) 96 elseif(${dir} STREQUAL reactos/system32) 97 set(${var} 2) 98 elseif(${dir} STREQUAL reactos/system32/drivers) 99 set(${var} 3) 100 elseif(${dir} STREQUAL reactos/Fonts) 101 set(${var} 4) 102 elseif(${dir} STREQUAL reactos/system32/drivers/etc) 103 set(${var} 5) 104 elseif(${dir} STREQUAL reactos/inf) 105 set(${var} 6) 106 elseif(${dir} STREQUAL reactos/bin) 107 set(${var} 7) 108 elseif(${dir} STREQUAL reactos/bin/testdata) 109 set(${var} 8) 110 elseif(${dir} STREQUAL reactos/bin/suppl) 111 set(${var} 80) 112 elseif(${dir} STREQUAL reactos/media) 113 set(${var} 9) 114 elseif(${dir} STREQUAL reactos/Microsoft.NET) 115 set(${var} 10) 116 elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework) 117 set(${var} 11) 118 elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework/v1.0.3705) 119 set(${var} 12) 120 elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework/v1.1.4322) 121 set(${var} 13) 122 elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework/v2.0.50727) 123 set(${var} 14) 124 elseif(${dir} STREQUAL reactos/Resources) 125 set(${var} 15) 126 elseif(${dir} STREQUAL reactos/Resources/Themes) 127 set(${var} 16) 128 elseif(${dir} STREQUAL reactos/system32/wbem) 129 set(${var} 17) 130 elseif(${dir} STREQUAL reactos/Resources/Themes/Lautus) 131 set(${var} 18) 132 elseif(${dir} STREQUAL reactos/Help) 133 set(${var} 19) 134 elseif(${dir} STREQUAL reactos/Config) 135 set(${var} 20) 136 elseif(${dir} STREQUAL reactos/Cursors) 137 set(${var} 21) 138 elseif(${dir} STREQUAL reactos/system32/ShellExt) 139 set(${var} 22) 140 elseif(${dir} STREQUAL reactos/Temp) 141 set(${var} 23) 142 elseif(${dir} STREQUAL reactos/system32/spool) 143 set(${var} 24) 144 elseif(${dir} STREQUAL reactos/system32/spool/drivers) 145 set(${var} 25) 146 elseif(${dir} STREQUAL reactos/system32/spool/drivers/color) 147 set(${var} 26) 148 elseif(${dir} STREQUAL reactos/system32/spool/drivers/w32x86) 149 set(${var} 27) 150 elseif(${dir} STREQUAL reactos/system32/spool/drivers/w32x86/3) 151 set(${var} 28) 152 elseif(${dir} STREQUAL reactos/system32/spool/prtprocs) 153 set(${var} 29) 154 elseif(${dir} STREQUAL reactos/system32/spool/prtprocs/w32x86) 155 set(${var} 30) 156 elseif(${dir} STREQUAL reactos/system32/spool/PRINTERS) 157 set(${var} 31) 158 elseif(${dir} STREQUAL reactos/system32/wbem/Repository) 159 set(${var} 32) 160 elseif(${dir} STREQUAL reactos/system32/wbem/Repository/FS) 161 set(${var} 33) 162 elseif(${dir} STREQUAL reactos/system32/wbem/mof/good) 163 set(${var} 34) 164 elseif(${dir} STREQUAL reactos/system32/wbem/mof/bad) 165 set(${var} 35) 166 elseif(${dir} STREQUAL reactos/system32/wbem/AdStatus) 167 set(${var} 36) 168 elseif(${dir} STREQUAL reactos/system32/wbem/xml) 169 set(${var} 37) 170 elseif(${dir} STREQUAL reactos/system32/wbem/Logs) 171 set(${var} 38) 172 elseif(${dir} STREQUAL reactos/system32/wbem/AutoRecover) 173 set(${var} 39) 174 elseif(${dir} STREQUAL reactos/system32/wbem/snmp) 175 set(${var} 40) 176 elseif(${dir} STREQUAL reactos/system32/wbem/Performance) 177 set(${var} 41) 178 elseif(${dir} STREQUAL reactos/twain_32) 179 set(${var} 42) 180 elseif(${dir} STREQUAL reactos/repair) 181 set(${var} 43) 182 elseif(${dir} STREQUAL reactos/Web) 183 set(${var} 44) 184 elseif(${dir} STREQUAL reactos/Web/Wallpaper) 185 set(${var} 45) 186 elseif(${dir} STREQUAL reactos/Prefetch) 187 set(${var} 46) 188 elseif(${dir} STREQUAL reactos/security) 189 set(${var} 47) 190 elseif(${dir} STREQUAL reactos/security/Database) 191 set(${var} 48) 192 elseif(${dir} STREQUAL reactos/security/logs) 193 set(${var} 49) 194 elseif(${dir} STREQUAL reactos/security/templates) 195 set(${var} 50) 196 elseif(${dir} STREQUAL reactos/system32/CatRoot) 197 set(${var} 51) 198 elseif(${dir} STREQUAL reactos/system32/CatRoot2) 199 set(${var} 52) 200 elseif(${dir} STREQUAL reactos/AppPatch) 201 set(${var} 53) 202 elseif(${dir} STREQUAL reactos/winsxs) 203 set(${var} 54) 204 elseif(${dir} STREQUAL reactos/winsxs/manifests) 205 set(${var} 55) 206 elseif(${dir} STREQUAL reactos/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.2600.2982_none_deadbeef) 207 set(${var} 56) 208 elseif(${dir} STREQUAL reactos/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2982_none_deadbeef) 209 set(${var} 57) 210 elseif(${dir} STREQUAL reactos/winsxs/x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.23038_none_deadbeef) 211 set(${var} 58) 212 elseif(${dir} STREQUAL reactos/winsxs/x86_reactos.apisets_6595b64144ccf1df_1.0.0.0_none_deadbeef) 213 set(${var} 59) 214 elseif(${dir} STREQUAL reactos/winsxs/x86_reactos.newapi_6595b64144ccf1df_1.0.0.0_none_deadbeef) 215 set(${var} 60) 216 elseif(${dir} STREQUAL reactos/winsxs/x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.0.14393.0_none_deadbeef) 217 set(${var} 61) 218 elseif(${dir} STREQUAL reactos/Resources/Themes/Modern) 219 set(${var} 62) 220 elseif(${dir} STREQUAL reactos/3rdParty) 221 set(${var} 63) 222 elseif(${dir} STREQUAL reactos/Resources/Themes/Lunar) 223 set(${var} 64) 224 elseif(${dir} STREQUAL reactos/Resources/Themes/Mizu) 225 set(${var} 65) 226 elseif(${dir} STREQUAL reactos/system32/spool/prtprocs/x64) 227 set(${var} 66) 228 elseif(${dir} STREQUAL reactos/winsxs/amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.2600.2982_none_deadbeef) 229 set(${var} 67) 230 elseif(${dir} STREQUAL reactos/winsxs/amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2982_none_deadbeef) 231 set(${var} 68) 232 elseif(${dir} STREQUAL reactos/winsxs/amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.23038_none_deadbeef) 233 set(${var} 69) 234 elseif(${dir} STREQUAL reactos/winsxs/amd64_reactos.apisets_6595b64144ccf1df_1.0.0.0_none_deadbeef) 235 set(${var} 70) 236 elseif(${dir} STREQUAL reactos/winsxs/amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.0.14393.0_none_deadbeef) 237 set(${var} 71) 238 else() 239 message(FATAL_ERROR "Wrong destination: ${dir}") 240 endif() 241endmacro() 242 243function(add_cd_file) 244 cmake_parse_arguments(_CD "NO_CAB;NOT_IN_HYBRIDCD" "DESTINATION;NAME_ON_CD;TARGET" "FILE;FOR" ${ARGN}) 245 if(NOT (_CD_TARGET OR _CD_FILE)) 246 message(FATAL_ERROR "You must provide a target or a file to install!") 247 endif() 248 249 if(NOT _CD_DESTINATION) 250 message(FATAL_ERROR "You must provide a destination") 251 elseif(${_CD_DESTINATION} STREQUAL root) 252 set(_CD_DESTINATION "") 253 endif() 254 255 if(NOT _CD_FOR) 256 message(FATAL_ERROR "You must provide a cd name (or \"all\" for all of them) to install the file on!") 257 endif() 258 259 # get file if we need to 260 if(NOT _CD_FILE) 261 set(_CD_FILE "$<TARGET_FILE:${_CD_TARGET}>") 262 if(NOT _CD_NAME_ON_CD) 263 set(_CD_NAME_ON_CD "$<TARGET_FILE_NAME:${_CD_TARGET}>") 264 endif() 265 endif() 266 267 # do we add it to all CDs? 268 list(FIND _CD_FOR all __cd) 269 if(NOT __cd EQUAL -1) 270 list(REMOVE_AT _CD_FOR __cd) 271 list(INSERT _CD_FOR __cd "bootcd;livecd;regtest") 272 endif() 273 274 # do we add it to bootcd? 275 list(FIND _CD_FOR bootcd __cd) 276 if(NOT __cd EQUAL -1) 277 # whether or not we should put it in reactos.cab or directly on cd 278 if(_CD_NO_CAB) 279 # directly on cd 280 foreach(item ${_CD_FILE}) 281 if(_CD_NAME_ON_CD) 282 # rename it in the cd tree 283 set(__file ${_CD_NAME_ON_CD}) 284 else() 285 get_filename_component(__file ${item} NAME) 286 endif() 287 set_property(GLOBAL APPEND PROPERTY BOOTCD_FILE_LIST "${_CD_DESTINATION}/${__file}=${item}") 288 # add it also into the hybridcd if not specified otherwise 289 if(NOT _CD_NOT_IN_HYBRIDCD) 290 set_property(GLOBAL APPEND PROPERTY HYBRIDCD_FILE_LIST "bootcd/${_CD_DESTINATION}/${__file}=${item}") 291 endif() 292 endforeach() 293 # manage dependency 294 if(_CD_TARGET) 295 add_dependencies(bootcd ${_CD_TARGET} registry_inf) 296 endif() 297 else() 298 dir_to_num(${_CD_DESTINATION} _num) 299 foreach(item ${_CD_FILE}) 300 # add it in reactos.cab 301 file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.cmake "\"${item}\" ${_num}\n") 302 303 # manage dependency - file level 304 set_property(GLOBAL APPEND PROPERTY REACTOS_CAB_DEPENDS ${item}) 305 endforeach() 306 307 # manage dependency - target level 308 if(_CD_TARGET) 309 add_dependencies(reactos_cab_inf ${_CD_TARGET}) 310 endif() 311 endif() 312 endif() #end bootcd 313 314 # do we add it to livecd? 315 list(FIND _CD_FOR livecd __cd) 316 if(NOT __cd EQUAL -1) 317 # manage dependency 318 if(_CD_TARGET) 319 add_dependencies(livecd ${_CD_TARGET} registry_inf) 320 endif() 321 foreach(item ${_CD_FILE}) 322 if(_CD_NAME_ON_CD) 323 # rename it in the cd tree 324 set(__file ${_CD_NAME_ON_CD}) 325 else() 326 get_filename_component(__file ${item} NAME) 327 endif() 328 set_property(GLOBAL APPEND PROPERTY LIVECD_FILE_LIST "${_CD_DESTINATION}/${__file}=${item}") 329 # add it also into the hybridcd if not specified otherwise 330 if(NOT _CD_NOT_IN_HYBRIDCD) 331 set_property(GLOBAL APPEND PROPERTY HYBRIDCD_FILE_LIST "livecd/${_CD_DESTINATION}/${__file}=${item}") 332 endif() 333 endforeach() 334 endif() #end livecd 335 336 # do we need also to add it to hybridcd? 337 list(FIND _CD_FOR hybridcd __cd) 338 if(NOT __cd EQUAL -1) 339 # manage dependency 340 if(_CD_TARGET) 341 add_dependencies(hybridcd ${_CD_TARGET}) 342 endif() 343 foreach(item ${_CD_FILE}) 344 if(_CD_NAME_ON_CD) 345 # rename it in the cd tree 346 set(__file ${_CD_NAME_ON_CD}) 347 else() 348 get_filename_component(__file ${item} NAME) 349 endif() 350 set_property(GLOBAL APPEND PROPERTY HYBRIDCD_FILE_LIST "${_CD_DESTINATION}/${__file}=${item}") 351 endforeach() 352 endif() #end hybridcd 353 354 # do we add it to regtest? 355 list(FIND _CD_FOR regtest __cd) 356 if(NOT __cd EQUAL -1) 357 # whether or not we should put it in reactos.cab or directly on cd 358 if(_CD_NO_CAB) 359 # directly on cd 360 foreach(item ${_CD_FILE}) 361 if(_CD_NAME_ON_CD) 362 # rename it in the cd tree 363 set(__file ${_CD_NAME_ON_CD}) 364 else() 365 get_filename_component(__file ${item} NAME) 366 endif() 367 set_property(GLOBAL APPEND PROPERTY BOOTCDREGTEST_FILE_LIST "${_CD_DESTINATION}/${__file}=${item}") 368 endforeach() 369 # manage dependency 370 if(_CD_TARGET) 371 add_dependencies(bootcdregtest ${_CD_TARGET} registry_inf) 372 endif() 373 else() 374 #add it in reactos.cab 375 #dir_to_num(${_CD_DESTINATION} _num) 376 #file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n") 377 #if(_CD_TARGET) 378 # #manage dependency 379 # add_dependencies(reactos_cab ${_CD_TARGET}) 380 #endif() 381 endif() 382 endif() #end bootcd 383endfunction() 384 385function(create_iso_lists) 386 # generate reactos.cab before anything else 387 get_property(_filelist GLOBAL PROPERTY REACTOS_CAB_DEPENDS) 388 389 # begin with reactos.inf. We want this command to be always executed, so we pretend it generates another file although it will never do. 390 add_custom_command( 391 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf ${CMAKE_CURRENT_BINARY_DIR}/__some_non_existent_file 392 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf 393 DEPENDS ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf reactos_cab_inf) 394 395 add_custom_command( 396 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab 397 COMMAND native-cabman -C ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff -RC ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf -N -P ${REACTOS_SOURCE_DIR} 398 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf native-cabman ${_filelist}) 399 400 add_custom_target(reactos_cab DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab) 401 add_dependencies(reactos_cab reactos_cab_inf) 402 403 add_cd_file( 404 TARGET reactos_cab 405 FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab 406 DESTINATION reactos 407 NO_CAB FOR bootcd regtest) 408 409 add_cd_file( 410 FILE ${CMAKE_CURRENT_BINARY_DIR}/livecd.iso 411 DESTINATION livecd 412 FOR hybridcd) 413 414 get_property(_filelist GLOBAL PROPERTY BOOTCD_FILE_LIST) 415 string(REPLACE ";" "\n" _filelist "${_filelist}") 416 file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake.lst "${_filelist}") 417 unset(_filelist) 418 file(GENERATE 419 OUTPUT ${REACTOS_BINARY_DIR}/boot/bootcd.$<CONFIG>.lst 420 INPUT ${REACTOS_BINARY_DIR}/boot/bootcd.cmake.lst) 421 422 get_property(_filelist GLOBAL PROPERTY LIVECD_FILE_LIST) 423 string(REPLACE ";" "\n" _filelist "${_filelist}") 424 file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake.lst "${_filelist}") 425 unset(_filelist) 426 file(GENERATE 427 OUTPUT ${REACTOS_BINARY_DIR}/boot/livecd.$<CONFIG>.lst 428 INPUT ${REACTOS_BINARY_DIR}/boot/livecd.cmake.lst) 429 430 get_property(_filelist GLOBAL PROPERTY HYBRIDCD_FILE_LIST) 431 string(REPLACE ";" "\n" _filelist "${_filelist}") 432 file(APPEND ${REACTOS_BINARY_DIR}/boot/hybridcd.cmake.lst "${_filelist}") 433 unset(_filelist) 434 file(GENERATE 435 OUTPUT ${REACTOS_BINARY_DIR}/boot/hybridcd.$<CONFIG>.lst 436 INPUT ${REACTOS_BINARY_DIR}/boot/hybridcd.cmake.lst) 437 438 get_property(_filelist GLOBAL PROPERTY BOOTCDREGTEST_FILE_LIST) 439 string(REPLACE ";" "\n" _filelist "${_filelist}") 440 file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake.lst "${_filelist}") 441 unset(_filelist) 442 file(GENERATE 443 OUTPUT ${REACTOS_BINARY_DIR}/boot/bootcdregtest.$<CONFIG>.lst 444 INPUT ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake.lst) 445endfunction() 446 447# Create module_clean targets 448function(add_clean_target _target) 449 set(_clean_working_directory ${CMAKE_CURRENT_BINARY_DIR}) 450 if(CMAKE_GENERATOR STREQUAL "Unix Makefiles" OR CMAKE_GENERATOR STREQUAL "MinGW Makefiles") 451 set(_clean_command make clean) 452 elseif(CMAKE_GENERATOR STREQUAL "NMake Makefiles") 453 set(_clean_command nmake /nologo clean) 454 elseif(CMAKE_GENERATOR STREQUAL "Ninja") 455 set(_clean_command ninja -t clean ${_target}) 456 set(_clean_working_directory ${REACTOS_BINARY_DIR}) 457 endif() 458 add_custom_target(${_target}_clean 459 COMMAND ${_clean_command} 460 WORKING_DIRECTORY ${_clean_working_directory} 461 COMMENT "Cleaning ${_target}") 462endfunction() 463 464if(NOT MSVC_IDE) 465 function(add_library name) 466 _add_library(${name} ${ARGN}) 467 add_clean_target(${name}) 468 # cmake adds a module_EXPORTS define when compiling a module or a shared library. We don't use that. 469 get_target_property(_type ${name} TYPE) 470 if(_type MATCHES SHARED_LIBRARY|MODULE_LIBRARY) 471 set_target_properties(${name} PROPERTIES DEFINE_SYMBOL "") 472 endif() 473 endfunction() 474 475 function(add_executable name) 476 _add_executable(${name} ${ARGN}) 477 add_clean_target(${name}) 478 endfunction() 479elseif(USE_FOLDER_STRUCTURE) 480 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 481 string(LENGTH ${CMAKE_SOURCE_DIR} CMAKE_SOURCE_DIR_LENGTH) 482 483 function(add_custom_target name) 484 _add_custom_target(${name} ${ARGN}) 485 string(SUBSTRING ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR_LENGTH} -1 CMAKE_CURRENT_SOURCE_DIR_RELATIVE) 486 set_property(TARGET "${name}" PROPERTY FOLDER "${CMAKE_CURRENT_SOURCE_DIR_RELATIVE}") 487 endfunction() 488 489 function(add_library name) 490 _add_library(${name} ${ARGN}) 491 get_target_property(_type ${name} TYPE) 492 if (NOT _type STREQUAL "INTERFACE_LIBRARY") 493 get_target_property(_target_excluded ${name} EXCLUDE_FROM_ALL) 494 if(_target_excluded AND ${name} MATCHES "^lib.*") 495 set_property(TARGET "${name}" PROPERTY FOLDER "Importlibs") 496 else() 497 string(SUBSTRING ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR_LENGTH} -1 CMAKE_CURRENT_SOURCE_DIR_RELATIVE) 498 set_property(TARGET "${name}" PROPERTY FOLDER "${CMAKE_CURRENT_SOURCE_DIR_RELATIVE}") 499 endif() 500 endif() 501 # cmake adds a module_EXPORTS define when compiling a module or a shared library. We don't use that. 502 if(_type MATCHES SHARED_LIBRARY|MODULE_LIBRARY) 503 set_target_properties(${name} PROPERTIES DEFINE_SYMBOL "") 504 endif() 505 endfunction() 506 507 function(add_executable name) 508 _add_executable(${name} ${ARGN}) 509 string(SUBSTRING ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR_LENGTH} -1 CMAKE_CURRENT_SOURCE_DIR_RELATIVE) 510 set_property(TARGET "${name}" PROPERTY FOLDER "${CMAKE_CURRENT_SOURCE_DIR_RELATIVE}") 511 endfunction() 512else() 513 function(add_library name) 514 _add_library(${name} ${ARGN}) 515 # cmake adds a module_EXPORTS define when compiling a module or a shared library. We don't use that. 516 get_target_property(_type ${name} TYPE) 517 if(_type MATCHES SHARED_LIBRARY|MODULE_LIBRARY) 518 set_target_properties(${name} PROPERTIES DEFINE_SYMBOL "") 519 endif() 520 endfunction() 521endif() 522 523if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") 524 function(concatenate_files _output _file1) 525 file(TO_NATIVE_PATH "${_output}" _real_output) 526 file(TO_NATIVE_PATH "${_file1}" _file_list) 527 foreach(_file ${ARGN}) 528 file(TO_NATIVE_PATH "${_file}" _real_file) 529 set(_file_list "${_file_list} + ${_real_file}") 530 endforeach() 531 add_custom_command( 532 OUTPUT ${_output} 533 COMMAND cmd.exe /C "copy /Y /B ${_file_list} ${_real_output} > nul" 534 DEPENDS ${_file1} ${ARGN}) 535 endfunction() 536else() 537 macro(concatenate_files _output) 538 add_custom_command( 539 OUTPUT ${_output} 540 COMMAND cat ${ARGN} > ${_output} 541 DEPENDS ${ARGN}) 542 endmacro() 543endif() 544 545function(add_importlibs _module) 546 add_dependency_node(${_module}) 547 foreach(LIB ${ARGN}) 548 target_link_libraries(${_module} lib${LIB}) 549 add_dependency_edge(${_module} ${LIB}) 550 endforeach() 551endfunction() 552 553# Some helper lists 554list(APPEND VALID_MODULE_TYPES kernel kerneldll kernelmodedriver wdmdriver nativecui nativedll win32cui win32gui win32dll win32ocx cpl module) 555list(APPEND KERNEL_MODULE_TYPES kernel kerneldll kernelmodedriver wdmdriver) 556list(APPEND NATIVE_MODULE_TYPES kernel kerneldll kernelmodedriver wdmdriver nativecui nativedll) 557 558function(set_module_type MODULE TYPE) 559 cmake_parse_arguments(__module "UNICODE" "IMAGEBASE" "ENTRYPOINT" ${ARGN}) 560 561 if(__module_UNPARSED_ARGUMENTS) 562 message(STATUS "set_module_type : unparsed arguments ${__module_UNPARSED_ARGUMENTS}, module : ${MODULE}") 563 endif() 564 565 # Check this is a type that we know 566 if (NOT TYPE IN_LIST VALID_MODULE_TYPES) 567 message(FATAL_ERROR "Unknown type ${TYPE} for module ${MODULE}") 568 endif() 569 570 # Set our target property 571 set_target_properties(${MODULE} PROPERTIES REACTOS_MODULE_TYPE ${TYPE}) 572 573 # Add the module to the module group list, if it is defined 574 if(DEFINED CURRENT_MODULE_GROUP) 575 set_property(GLOBAL APPEND PROPERTY ${CURRENT_MODULE_GROUP}_MODULE_LIST "${MODULE}") 576 endif() 577 578 # Set subsystem. 579 if(TYPE IN_LIST NATIVE_MODULE_TYPES) 580 set_subsystem(${MODULE} native) 581 elseif(${TYPE} STREQUAL win32cui) 582 set_subsystem(${MODULE} console) 583 elseif(${TYPE} STREQUAL win32gui) 584 set_subsystem(${MODULE} windows) 585 endif() 586 587 # Set unicode definitions 588 if(__module_UNICODE) 589 target_compile_definitions(${MODULE} PRIVATE UNICODE _UNICODE) 590 endif() 591 592 # Set entry point 593 if(__module_ENTRYPOINT OR (__module_ENTRYPOINT STREQUAL "0")) 594 set_entrypoint(${MODULE} ${__module_ENTRYPOINT}) 595 elseif(${TYPE} STREQUAL nativecui) 596 set_entrypoint(${MODULE} NtProcessStartup 4) 597 elseif(${TYPE} STREQUAL win32cui) 598 if(__module_UNICODE) 599 set_entrypoint(${MODULE} wmainCRTStartup) 600 else() 601 set_entrypoint(${MODULE} mainCRTStartup) 602 endif() 603 elseif(${TYPE} STREQUAL win32gui) 604 if(__module_UNICODE) 605 set_entrypoint(${MODULE} wWinMainCRTStartup) 606 else() 607 set_entrypoint(${MODULE} WinMainCRTStartup) 608 endif() 609 elseif((${TYPE} STREQUAL win32dll) OR (${TYPE} STREQUAL win32ocx) 610 OR (${TYPE} STREQUAL cpl)) 611 set_entrypoint(${MODULE} DllMainCRTStartup 12) 612 elseif((${TYPE} STREQUAL kernelmodedriver) OR (${TYPE} STREQUAL wdmdriver)) 613 set_entrypoint(${MODULE} DriverEntry 8) 614 elseif(${TYPE} STREQUAL nativedll) 615 set_entrypoint(${MODULE} DllMain 12) 616 elseif(TYPE STREQUAL kernel) 617 set_entrypoint(${MODULE} KiSystemStartup 4) 618 elseif(${TYPE} STREQUAL module) 619 set_entrypoint(${MODULE} 0) 620 endif() 621 622 # Set base address 623 if(__module_IMAGEBASE) 624 set_image_base(${MODULE} ${__module_IMAGEBASE}) 625 elseif(${TYPE} STREQUAL win32dll) 626 if(DEFINED baseaddress_${MODULE}) 627 set_image_base(${MODULE} ${baseaddress_${MODULE}}) 628 else() 629 message(STATUS "${MODULE} has no base address") 630 endif() 631 elseif(TYPE IN_LIST KERNEL_MODULE_TYPES) 632 # special case for kernel 633 if (TYPE STREQUAL kernel) 634 set_image_base(${MODULE} 0x00400000) 635 else() 636 set_image_base(${MODULE} 0x00010000) 637 endif() 638 endif() 639 640 # Now do some stuff which is specific to each type 641 if(TYPE IN_LIST KERNEL_MODULE_TYPES) 642 add_dependencies(${MODULE} bugcodes xdk) 643 if((${TYPE} STREQUAL kernelmodedriver) OR (${TYPE} STREQUAL wdmdriver)) 644 set_target_properties(${MODULE} PROPERTIES SUFFIX ".sys") 645 endif() 646 endif() 647 648 if(TYPE STREQUAL kernel) 649 # Kernels are executables with exports 650 set_property(TARGET ${MODULE} PROPERTY ENABLE_EXPORTS TRUE) 651 set_target_properties(${MODULE} PROPERTIES DEFINE_SYMBOL "") 652 endif() 653 654 if(${TYPE} STREQUAL win32ocx) 655 set_target_properties(${MODULE} PROPERTIES SUFFIX ".ocx") 656 endif() 657 658 if(${TYPE} STREQUAL cpl) 659 set_target_properties(${MODULE} PROPERTIES SUFFIX ".cpl") 660 endif() 661 662 # Do compiler specific stuff 663 set_module_type_toolchain(${MODULE} ${TYPE}) 664endfunction() 665 666function(start_module_group __name) 667 if(DEFINED CURRENT_MODULE_GROUP) 668 message(FATAL_ERROR "CURRENT_MODULE_GROUP is already set ('${CURRENT_MODULE_GROUP}')") 669 endif() 670 set(CURRENT_MODULE_GROUP ${__name} PARENT_SCOPE) 671endfunction() 672 673function(end_module_group) 674 get_property(__modulelist GLOBAL PROPERTY ${CURRENT_MODULE_GROUP}_MODULE_LIST) 675 add_custom_target(${CURRENT_MODULE_GROUP}) 676 foreach(__module ${__modulelist}) 677 add_dependencies(${CURRENT_MODULE_GROUP} ${__module}) 678 endforeach() 679 set(CURRENT_MODULE_GROUP PARENT_SCOPE) 680endfunction() 681 682function(preprocess_file __in __out) 683 set(__arg ${__in}) 684 foreach(__def ${ARGN}) 685 list(APPEND __arg -D${__def}) 686 endforeach() 687 if(MSVC) 688 add_custom_command(OUTPUT ${_out} 689 COMMAND ${CMAKE_C_COMPILER} /EP ${__arg} 690 DEPENDS ${__in}) 691 else() 692 add_custom_command(OUTPUT ${_out} 693 COMMAND ${CMAKE_C_COMPILER} -E ${__arg} 694 DEPENDS ${__in}) 695 endif() 696endfunction() 697 698function(get_includes OUTPUT_VAR) 699 get_directory_property(_includes INCLUDE_DIRECTORIES) 700 foreach(arg ${_includes}) 701 list(APPEND __tmp_var -I${arg}) 702 endforeach() 703 set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE) 704endfunction() 705 706function(get_defines OUTPUT_VAR) 707 get_directory_property(_defines COMPILE_DEFINITIONS) 708 foreach(arg ${_defines}) 709 # Skip generator expressions 710 if (NOT arg MATCHES [[^\$<.*>$]]) 711 list(APPEND __tmp_var -D${arg}) 712 endif() 713 endforeach() 714 set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE) 715endfunction() 716 717function(add_registry_inf) 718 # Add to the inf files list 719 foreach(_file ${ARGN}) 720 set(_source_file "${CMAKE_CURRENT_SOURCE_DIR}/${_file}") 721 set_property(GLOBAL APPEND PROPERTY REGISTRY_INF_LIST ${_source_file}) 722 endforeach() 723endfunction() 724 725function(create_registry_hives) 726 727 # Shortcut to the registry.inf file 728 set(_registry_inf "${CMAKE_BINARY_DIR}/boot/bootdata/registry.inf") 729 730 # Get the list of inf files 731 get_property(_inf_files GLOBAL PROPERTY REGISTRY_INF_LIST) 732 733 # Convert files to utf16le 734 foreach(_file ${_inf_files}) 735 get_filename_component(_file_name ${_file} NAME_WE) 736 file(RELATIVE_PATH _subdir ${CMAKE_SOURCE_DIR} ${_file}) 737 get_filename_component(_subdir ${_subdir} DIRECTORY) 738 set(_converted_file ${CMAKE_BINARY_DIR}/${_subdir}/${_file_name}_utf16.inf) 739 add_custom_command(OUTPUT ${_converted_file} 740 COMMAND native-utf16le ${_file} ${_converted_file} 741 DEPENDS native-utf16le ${_file}) 742 list(APPEND _converted_files ${_converted_file}) 743 endforeach() 744 745 # Concatenate all registry files to registry.inf 746 concatenate_files(${_registry_inf} ${_converted_files}) 747 748 # Add registry.inf to bootcd 749 add_custom_target(registry_inf DEPENDS ${_registry_inf}) 750 add_cd_file(TARGET registry_inf 751 FILE ${_registry_inf} 752 DESTINATION reactos 753 NO_CAB 754 FOR bootcd regtest) 755 756 # BootCD setup system hive 757 add_custom_command( 758 OUTPUT ${CMAKE_BINARY_DIR}/boot/bootdata/SETUPREG.HIV 759 COMMAND native-mkhive -h:SETUPREG -u -d:${CMAKE_BINARY_DIR}/boot/bootdata ${_registry_inf} ${CMAKE_SOURCE_DIR}/boot/bootdata/setupreg.inf 760 DEPENDS native-mkhive ${_registry_inf}) 761 762 add_custom_target(bootcd_hives 763 DEPENDS ${CMAKE_BINARY_DIR}/boot/bootdata/SETUPREG.HIV) 764 765 add_cd_file( 766 FILE ${CMAKE_BINARY_DIR}/boot/bootdata/SETUPREG.HIV 767 TARGET bootcd_hives 768 DESTINATION reactos 769 NO_CAB 770 FOR bootcd regtest) 771 772 # LiveCD hives 773 list(APPEND _livecd_inf_files 774 ${_registry_inf} 775 ${CMAKE_SOURCE_DIR}/boot/bootdata/livecd.inf) 776 if(SARCH STREQUAL "xbox") 777 list(APPEND _livecd_inf_files 778 ${CMAKE_SOURCE_DIR}/boot/bootdata/hiveinst_xbox.inf) 779 elseif(SARCH STREQUAL "pc98") 780 list(APPEND _livecd_inf_files 781 ${CMAKE_SOURCE_DIR}/boot/bootdata/hiveinst_pc98.inf) 782 else() 783 list(APPEND _livecd_inf_files 784 ${CMAKE_SOURCE_DIR}/boot/bootdata/hiveinst.inf) 785 endif() 786 787 add_custom_command( 788 OUTPUT ${CMAKE_BINARY_DIR}/boot/bootdata/system 789 ${CMAKE_BINARY_DIR}/boot/bootdata/software 790 ${CMAKE_BINARY_DIR}/boot/bootdata/default 791 ${CMAKE_BINARY_DIR}/boot/bootdata/sam 792 ${CMAKE_BINARY_DIR}/boot/bootdata/security 793 COMMAND native-mkhive -h:SYSTEM,SOFTWARE,DEFAULT,SAM,SECURITY -d:${CMAKE_BINARY_DIR}/boot/bootdata ${_livecd_inf_files} 794 DEPENDS native-mkhive ${_livecd_inf_files}) 795 796 add_custom_target(livecd_hives 797 DEPENDS ${CMAKE_BINARY_DIR}/boot/bootdata/system 798 ${CMAKE_BINARY_DIR}/boot/bootdata/software 799 ${CMAKE_BINARY_DIR}/boot/bootdata/default 800 ${CMAKE_BINARY_DIR}/boot/bootdata/sam 801 ${CMAKE_BINARY_DIR}/boot/bootdata/security) 802 803 add_cd_file( 804 FILE ${CMAKE_BINARY_DIR}/boot/bootdata/system 805 ${CMAKE_BINARY_DIR}/boot/bootdata/software 806 ${CMAKE_BINARY_DIR}/boot/bootdata/default 807 ${CMAKE_BINARY_DIR}/boot/bootdata/sam 808 ${CMAKE_BINARY_DIR}/boot/bootdata/security 809 TARGET livecd_hives 810 DESTINATION reactos/system32/config 811 FOR livecd) 812 813 # BCD Hive 814 add_custom_command( 815 OUTPUT ${CMAKE_BINARY_DIR}/boot/bootdata/BCD 816 COMMAND native-mkhive -h:BCD -u -d:${CMAKE_BINARY_DIR}/boot/bootdata ${CMAKE_BINARY_DIR}/boot/bootdata/hivebcd_utf16.inf 817 DEPENDS native-mkhive ${CMAKE_BINARY_DIR}/boot/bootdata/hivebcd_utf16.inf) 818 819 add_custom_target(bcd_hive 820 DEPENDS ${CMAKE_BINARY_DIR}/boot/bootdata/BCD) 821 822 add_cd_file( 823 FILE ${CMAKE_BINARY_DIR}/boot/bootdata/BCD 824 TARGET bcd_hive 825 DESTINATION efi/boot 826 NO_CAB 827 FOR bootcd regtest livecd) 828 829endfunction() 830 831function(add_driver_inf _module) 832 # Add to the inf files list 833 foreach(_file ${ARGN}) 834 set(_converted_item ${CMAKE_CURRENT_BINARY_DIR}/${_file}) 835 set(_source_item ${CMAKE_CURRENT_SOURCE_DIR}/${_file}) 836 add_custom_command(OUTPUT "${_converted_item}" 837 COMMAND native-utf16le "${_source_item}" "${_converted_item}" 838 DEPENDS native-utf16le "${_source_item}") 839 list(APPEND _converted_inf_files ${_converted_item}) 840 endforeach() 841 842 add_custom_target(${_module}_inf_files DEPENDS ${_converted_inf_files}) 843 add_cd_file(FILE ${_converted_inf_files} TARGET ${_module}_inf_files DESTINATION reactos/inf FOR all) 844endfunction() 845 846if(KDBG) 847 set(ROSSYM_LIB "rossym") 848else() 849 set(ROSSYM_LIB "") 850endif() 851 852function(add_rc_deps _target_rc) 853 set_source_files_properties(${_target_rc} PROPERTIES OBJECT_DEPENDS "${ARGN}") 854endfunction() 855 856add_custom_target(rostests_install COMMAND ${CMAKE_COMMAND} -DCOMPONENT=rostests -P ${CMAKE_BINARY_DIR}/cmake_install.cmake) 857function(add_rostests_file) 858 cmake_parse_arguments(_ROSTESTS "" "RENAME;SUBDIR;TARGET" "FILE" ${ARGN}) 859 if(NOT (_ROSTESTS_TARGET OR _ROSTESTS_FILE)) 860 message(FATAL_ERROR "You must provide a target or a file to install!") 861 endif() 862 863 set(_ROSTESTS_NAME_ON_CD "${_ROSTESTS_RENAME}") 864 if(NOT _ROSTESTS_FILE) 865 set(_ROSTESTS_FILE "$<TARGET_FILE:${_ROSTESTS_TARGET}>") 866 if(NOT _ROSTESTS_RENAME) 867 set(_ROSTESTS_NAME_ON_CD "$<TARGET_FILE_NAME:${_ROSTESTS_TARGET}>") 868 endif() 869 else() 870 if(NOT _ROSTESTS_RENAME) 871 get_filename_component(_ROSTESTS_NAME_ON_CD ${_ROSTESTS_FILE} NAME) 872 endif() 873 endif() 874 875 if(_ROSTESTS_SUBDIR) 876 set(_ROSTESTS_SUBDIR "/${_ROSTESTS_SUBDIR}") 877 endif() 878 879 if(_ROSTESTS_TARGET) 880 add_cd_file(TARGET ${_ROSTESTS_TARGET} FILE ${_ROSTESTS_FILE} DESTINATION "reactos/bin${_ROSTESTS_SUBDIR}" NAME_ON_CD ${_ROSTESTS_NAME_ON_CD} FOR all) 881 else() 882 add_cd_file(FILE ${_ROSTESTS_FILE} DESTINATION "reactos/bin${_ROSTESTS_SUBDIR}" NAME_ON_CD ${_ROSTESTS_NAME_ON_CD} FOR all) 883 endif() 884 885 if(DEFINED ENV{ROSTESTS_INSTALL}) 886 if(_ROSTESTS_RENAME) 887 install(FILES ${_ROSTESTS_FILE} DESTINATION "$ENV{ROSTESTS_INSTALL}${_ROSTESTS_SUBDIR}" COMPONENT rostests RENAME ${_ROSTESTS_RENAME}) 888 else() 889 install(FILES ${_ROSTESTS_FILE} DESTINATION "$ENV{ROSTESTS_INSTALL}${_ROSTESTS_SUBDIR}" COMPONENT rostests) 890 endif() 891 endif() 892endfunction() 893 894if(PCH) 895 macro(add_pch _target _pch _skip_list) 896 target_precompile_headers(${_target} PRIVATE ${_pch}) 897 set_source_files_properties(${_skip_list} PROPERTIES SKIP_PRECOMPILE_HEADERS ON) 898 endmacro() 899else() 900 macro(add_pch _target _pch _skip_list) 901 endmacro() 902endif() 903 904function(set_target_cpp_properties _target) 905 cmake_parse_arguments(_CPP "WITH_EXCEPTIONS;WITH_RTTI" "" "" ${ARGN}) 906 907 if (_CPP_WITH_EXCEPTIONS) 908 set_target_properties(${_target} PROPERTIES WITH_CXX_EXCEPTIONS TRUE) 909 endif() 910 911 if (_CPP_WITH_RTTI) 912 set_target_properties(${_target} PROPERTIES WITH_CXX_RTTI TRUE) 913 endif() 914endfunction() 915