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