X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=CMakeMacros.cmake;h=3d4e3a2bc21bd38cfc0bb4c6c40de6e1f93e8d97;hp=9a77fba2514796802f23f6f5e52eda3629b06de9;hb=53fbd8e18538e430a677ca80bb451f70e5652eea;hpb=d7733b45c33ae5ac9e1214ab2ab95e1df2a6b3e0 diff --git a/CMakeMacros.cmake b/CMakeMacros.cmake index 9a77fba2514..3d4e3a2bc21 100644 --- a/CMakeMacros.cmake +++ b/CMakeMacros.cmake @@ -1,116 +1,155 @@ -MACRO(_PCH_GET_COMPILE_FLAGS _target_name _out_compile_flags _header_filename) - - # Add the precompiled header to the build - get_filename_component(FILE ${_header_filename} NAME) - set(_gch_filename "${_target_name}_${FILE}.gch") - list(APPEND ${_out_compile_flags} -c ${_header_filename} -o ${_gch_filename}) - - # This gets us our includes - get_directory_property(DIRINC INCLUDE_DIRECTORIES) - foreach(item ${DIRINC}) - list(APPEND ${_out_compile_flags} -I${item}) - endforeach(item) - - # This is a particular bit of undocumented/hacky magic I'm quite proud of - get_directory_property(_compiler_flags DEFINITIONS) - string(REPLACE "\ " "\t" _compiler_flags ${_compiler_flags}) - list(APPEND ${_out_compile_flags} ${_compiler_flags}) - - # This gets any specific definitions that were added with set-target-property - get_target_property(_target_defs ${_target_name} COMPILE_DEFINITIONS) - if (_target_defs) - foreach(item ${_target_defs}) - list(APPEND ${_out_compile_flags} -D${item}) - endforeach(item) - endif() - -ENDMACRO(_PCH_GET_COMPILE_FLAGS) - -MACRO(add_pch _target_name _header_filename _src_list) - - get_filename_component(FILE ${_header_filename} NAME) - set(_gch_filename "${_target_name}_${FILE}.gch") - list(APPEND ${_src_list} ${_gch_filename}) - _PCH_GET_COMPILE_FLAGS(${_target_name} _args ${_header_filename}) - file(REMOVE ${_gch_filename}) - add_custom_command( - OUTPUT ${_gch_filename} - COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} ${_args} - DEPENDS ${_header_filename}) - -ENDMACRO(add_pch _target_name _header_filename _src_list) - -MACRO(spec2def _target_name _spec_file _def_file) - - add_custom_command( - OUTPUT ${_def_file} - COMMAND native-winebuild -o ${_def_file} --def -E ${_spec_file} --filename ${_target_name}.dll - DEPENDS native-winebuild) - set_source_files_properties(${_def_file} PROPERTIES GENERATED TRUE) - add_custom_target(${_target_name}_def ALL DEPENDS ${_def_file}) - -ENDMACRO(spec2def _target_name _spec_file _def_file) - if (NOT MSVC) -MACRO(CreateBootSectorTarget _target_name _asm_file _object_file) +macro(CreateBootSectorTarget _target_name _asm_file _object_file) get_filename_component(OBJECT_PATH ${_object_file} PATH) + get_filename_component(OBJECT_NAME ${_object_file} NAME) file(MAKE_DIRECTORY ${OBJECT_PATH}) get_directory_property(defines COMPILE_DEFINITIONS) get_directory_property(includes INCLUDE_DIRECTORIES) foreach(arg ${defines}) set(result_defs ${result_defs} -D${arg}) - endforeach(arg ${defines}) + endforeach() foreach(arg ${includes}) set(result_incs -I${arg} ${result_incs}) - endforeach(arg ${includes}) + endforeach() add_custom_command( OUTPUT ${_object_file} COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file} - DEPENDS native-winebuild) + DEPENDS ${_asm_file}) set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE) add_custom_target(${_target_name} ALL DEPENDS ${_object_file}) +endmacro() -ENDMACRO(CreateBootSectorTarget _target_name _asm_file _object_file) else() -MACRO(CreateBootSectorTarget _target_name _asm_file _object_file) -ENDMACRO() + +macro(CreateBootSectorTarget _target_name _asm_file _object_file) +endmacro() + endif() -MACRO(MACRO_IDL_COMPILE_OBJECT OBJECT SOURCE) - GET_PROPERTY(FLAGS SOURCE ${SOURCE} PROPERTY COMPILE_FLAGS) - GET_PROPERTY(DEFINES SOURCE ${SOURCE} PROPERTY COMPILE_DEFINITIONS) - GET_PROPERTY(INCLUDE_DIRECTORIES DIRECTORY PROPERTY INCLUDE_DIRECTORIES) - FOREACH(DIR ${INCLUDE_DIRECTORIES}) - SET(FLAGS "${FLAGS} -I${DIR}") - ENDFOREACH() - - SET(IDL_COMMAND ${CMAKE_IDL_COMPILE_OBJECT}) - STRING(REPLACE "" "${CMAKE_IDL_COMPILER}" IDL_COMMAND "${IDL_COMMAND}") - STRING(REPLACE "${FLAGS}" IDL_COMMAND "${IDL_COMMAND}") - STRING(REPLACE "" "${DEFINES}" IDL_COMMAND "${IDL_COMMAND}") - STRING(REPLACE "" "${OBJECT}" IDL_COMMAND "${IDL_COMMAND}") - STRING(REPLACE "" "${SOURCE}" IDL_COMMAND "${IDL_COMMAND}") - SEPARATE_ARGUMENTS(IDL_COMMAND) - - ADD_CUSTOM_COMMAND( - OUTPUT ${OBJECT} - COMMAND ${IDL_COMMAND} - DEPENDS ${SOURCE} - VERBATIM - ) -ENDMACRO() - -MACRO(ADD_INTERFACE_DEFINITIONS TARGET) - FOREACH(SOURCE ${ARGN}) - GET_FILENAME_COMPONENT(FILE ${SOURCE} NAME_WE) - SET(OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}.h) - MACRO_IDL_COMPILE_OBJECT(${OBJECT} ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}) - LIST(APPEND OBJECTS ${OBJECT}) - ENDFOREACH() - ADD_CUSTOM_TARGET(${TARGET} ALL DEPENDS ${OBJECTS}) -ENDMACRO() +macro(set_cpp) + include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport) + set(IS_CPP 1) + add_definitions( + -DNATIVE_CPP_INCLUDE=${REACTOS_SOURCE_DIR}/include/c++ + -DNATIVE_C_INCLUDE=${REACTOS_SOURCE_DIR}/include/crt) +endmacro() + +macro(add_dependency_node _node) + if(GENERATE_DEPENDENCY_GRAPH) + get_target_property(_type ${_node} TYPE) + if(_type MATCHES SHARED_LIBRARY) + file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n") + endif() + endif() +endmacro() + +macro(add_dependency_edge _source _target) + if(GENERATE_DEPENDENCY_GRAPH) + get_target_property(_type ${_source} TYPE) + if(_type MATCHES SHARED_LIBRARY) + file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n") + endif() + endif() +endmacro() + +macro(add_dependency_header) + file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml "\n\n \n") + add_dependency_node(ntdll) +endmacro() + +macro(add_dependency_footer) + file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n\n") +endmacro() + +macro(add_message_headers) + foreach(_in_FILE ${ARGN}) + get_filename_component(FILE ${_in_FILE} NAME_WE) + macro_mc(${FILE}) + add_custom_command( + OUTPUT ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h + COMMAND ${COMMAND_MC} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.mc) + set_source_files_properties( + ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc + PROPERTIES GENERATED TRUE) + add_custom_target(${FILE} ALL DEPENDS ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc) + endforeach() +endmacro() + +macro(dir_to_num dir var) + if(${dir} STREQUAL reactos/system32) + set(${var} 1) + elseif(${dir} STREQUAL reactos/system32/drivers) + set(${var} 2) + elseif(${dir} STREQUAL reactos/Fonts) + set(${var} 3) + elseif(${dir} STREQUAL reactos) + set(${var} 4) + elseif(${dir} STREQUAL reactos/system32/drivers/etc) + set(${var} 5) + elseif(${dir} STREQUAL reactos/inf) + set(${var} 6) + elseif(${dir} STREQUAL reactos/bin) + set(${var} 7) + elseif(${dir} STREQUAL reactos/media) + set(${var} 8) + else() + message(ERROR "Wrong destination: ${dir}") + endif() +endmacro() + +function(add_cd_file) + cmake_parse_arguments(_CD "NO_CAB;NO_LIVECD" "DESTINATION;NAME_ON_CD;TARGET" "FILE" ${ARGN}) + if(NOT (_CD_TARGET OR _CD_FILE)) + message(FATAL_ERROR "You must provide a target or a file to install!") + endif() + + if(NOT _CD_DESTINATION) + message(FATAL_ERROR "You must provide a destination") + elseif(${_CD_DESTINATION} STREQUAL root) + set(_CD_DESTINATION "") + endif() + + if(NOT _CD_FILE) + get_target_property(__file ${_CD_TARGET} LOCATION) + else() + if(NOT _CD_NO_CAB) + add_dependencies(reactos_cab ${_CD_FILE}) + endif() + set(__file ${_CD_FILE}) + endif() + #whether or not we should put it in reactos.cab or directly on cd + if(_CD_NO_CAB) + foreach(item ${__file}) + file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n") + endforeach() + if(_CD_NAME_ON_CD) + get_filename_component(__file ${__file} NAME) + #rename it in the cd tree + file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n") + endif() + #add right dependency + if(_CD_TARGET) + add_dependencies(bootcd ${_CD_TARGET}) + else() + add_dependencies(bootcd ${_CD_FILE}) + endif() + if(NOT _CD_NO_LIVECD) + file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(COPY \"${__file}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n") + endif() + else() + #add right dependency + if(_CD_TARGET) + add_dependencies(reactos_cab ${_CD_TARGET}) + else() + add_dependencies(reactos_cab ${_CD_FILE}) + endif() + dir_to_num(${_CD_DESTINATION} _num) + file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${__file} ${_num}\n") + endif() +endfunction()