X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=CMakeMacros.cmake;h=880555a55948f95e4ddbb5130385a79e48397011;hp=d3e4a34d31ec9d1273c26267d2b903d4aebe125d;hb=7dce7ccce4171b1e16bdbc9b258b15369236600b;hpb=ba7d98adba5f2e27d7abf3e9ddfb7c6d8a9c8185 diff --git a/CMakeMacros.cmake b/CMakeMacros.cmake index d3e4a34d31e..880555a5594 100644 --- a/CMakeMacros.cmake +++ b/CMakeMacros.cmake @@ -1,40 +1,258 @@ -MACRO(_PCH_GET_COMPILE_FLAGS _target_name _out_compile_flags _header_filename) +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) + + 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}) + + foreach(arg ${includes}) + set(result_incs -I${arg} ${result_incs}) + endforeach(arg ${includes}) + + add_custom_command( + OUTPUT ${_object_file} + COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file} + DEPENDS native-winebuild) + set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE) + add_custom_target(${_target_name} ALL DEPENDS ${_object_file}) + add_minicd(${_object_file} loader ${OBJECT_NAME}) +ENDMACRO(CreateBootSectorTarget _target_name _asm_file _object_file) +else() +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(add_minicd_target _targetname _dir) # optional parameter: _nameoncd + get_target_property(FILENAME ${_targetname} LOCATION) + + if("${ARGN}" STREQUAL "") + get_filename_component(_nameoncd ${FILENAME} NAME) + else() + set(_nameoncd ${ARGN}) + endif() + + add_custom_command( + OUTPUT ${BOOTCD_DIR}/${_dir}/${_nameoncd} + COMMAND ${CMAKE_COMMAND} -E copy ${FILENAME} ${BOOTCD_DIR}/${_dir}/${_nameoncd}) + + add_custom_target(${_targetname}_minicd DEPENDS ${BOOTCD_DIR}/${_dir}/${_nameoncd}) + + add_dependencies(${_targetname}_minicd ${_targetname}) + add_dependencies(minicd ${_targetname}_minicd) +ENDMACRO(add_minicd_target _targetname _dir _nameoncd) + +MACRO(add_minicd FILENAME _dir _nameoncd) + add_custom_command( + OUTPUT ${BOOTCD_DIR}/${_dir}/${_nameoncd} + DEPENDS ${FILENAME} + COMMAND ${CMAKE_COMMAND} -E copy ${FILENAME} ${BOOTCD_DIR}/${_dir}/${_nameoncd}) + + add_custom_target(${_nameoncd}_minicd DEPENDS ${BOOTCD_DIR}/${_dir}/${_nameoncd}) + + add_dependencies(minicd ${_nameoncd}_minicd) +ENDMACRO(add_minicd) - # Add the precompiled header to the build - set(_gch_filename "${_header_filename}.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) - - set(_gch_filename "${_header_filename}.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(set_cpp) + include_directories(BEFORE ${REACTOS_SOURCE_DIR}/lib/3rdparty/stlport/stlport) + set(IS_CPP 1) +endmacro() + +MACRO(add_livecd_target _targetname _dir )# optional parameter : _nameoncd + + get_target_property(FILENAME ${_targetname} LOCATION) + + if("${ARGN}" STREQUAL "") + get_filename_component(_nameoncd ${FILENAME} NAME) + else() + set(_nameoncd ${ARGN}) + endif() + + add_custom_command( + OUTPUT ${LIVECD_DIR}/${_dir}/${_nameoncd} + COMMAND ${CMAKE_COMMAND} -E copy ${FILENAME} ${LIVECD_DIR}/${_dir}/${_nameoncd}) + + add_custom_target(${_targetname}_livecd DEPENDS ${LIVECD_DIR}/${_dir}/${_nameoncd}) + + add_dependencies(${_targetname}_livecd ${_targetname}) + add_dependencies(livecd ${_targetname}_livecd) +ENDMACRO(add_livecd_target _targetname _dir _nameoncd) + +MACRO(add_livecd FILENAME _dir _nameoncd) + add_custom_command( + OUTPUT ${LIVECD_DIR}/${_dir}/${_nameoncd} + DEPENDS ${FILENAME} + COMMAND ${CMAKE_COMMAND} -E copy ${FILENAME} ${LIVECD_DIR}/${_dir}/${_nameoncd}) + + add_custom_target(${_nameoncd}_livecd DEPENDS ${LIVECD_DIR}/${_dir}/${_nameoncd}) + + add_dependencies(livecd ${_nameoncd}_livecd) +ENDMACRO(add_livecd) + +macro(custom_incdefs) + if(NOT DEFINED result_incs) #rpc_defines + get_directory_property(rpc_defines COMPILE_DEFINITIONS) + get_directory_property(rpc_includes INCLUDE_DIRECTORIES) + + foreach(arg ${rpc_defines}) + set(result_defs ${result_defs} -D${arg}) + endforeach(arg ${defines}) + + foreach(arg ${rpc_includes}) + set(result_incs -I${arg} ${result_incs}) + endforeach(arg ${includes}) + endif() +endmacro(custom_incdefs) + +macro(rpcproxy TARGET) + custom_incdefs() + list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c) + + foreach(_in_FILE ${ARGN}) + get_filename_component(FILE ${_in_FILE} NAME_WE) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c + COMMAND native-widl ${result_incs} ${result_defs} -m32 --win32 -h -H ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.h -p -P ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl + DEPENDS native-widl) + set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c + PROPERTIES GENERATED TRUE) + list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c) + list(APPEND IDLS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl) + list(APPEND PROXY_DEPENDS ${TARGET}_${FILE}_p) + add_custom_target(${TARGET}_${FILE}_p + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c) + #add_dependencies(${TARGET}_proxy ${TARGET}_${FILE}_p) + endforeach(_in_FILE ${ARGN}) + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c + COMMAND native-widl ${result_incs} ${result_defs} -m32 --win32 --dlldata-only --dlldata=${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c ${IDLS} + DEPENDS native-widl) + set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c + PROPERTIES GENERATED TRUE) + + add_library(${TARGET}_proxy ${SOURCE}) + add_dependencies(${TARGET}_proxy psdk ${PROXY_DEPENDS}) +endmacro(rpcproxy) + +macro (MACRO_IDL_FILES) + custom_incdefs() + foreach(_in_FILE ${ARGN}) + get_filename_component(FILE ${_in_FILE} NAME_WE) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c + COMMAND native-widl ${result_incs} ${result_defs} -m32 --win32 -h -H ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.h -s -S ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl + DEPENDS native-widl) + set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c + PROPERTIES GENERATED TRUE) + add_library(${FILE}_server ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c) + add_dependencies(${FILE}_server psdk) + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c + COMMAND native-widl ${result_incs} ${result_defs} -m32 --win32 -h -H ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h -c -C ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl + DEPENDS native-widl) + set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c + PROPERTIES GENERATED TRUE) + add_library(${FILE}_client ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c) + add_dependencies(${FILE}_client psdk) + endforeach(_in_FILE ${ARGN}) + +endmacro (MACRO_IDL_FILES)