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