mirror of
https://github.com/reactos/reactos.git
synced 2024-09-22 18:45:51 +00:00
c4f1145fca
- add new macro add_linkerflag to avoid code duplication - add new macro set_pdef_file, replacing the use of pdef2def, which is neccessary to resolve issues with MSVC. cmake doesn't handle def files as source files very well, when they are not in the current source directory. svn path=/branches/cmake-bringup/; revision=49524
143 lines
4.5 KiB
CMake
143 lines
4.5 KiB
CMake
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
|
|
add_definitions(-D__i386__)
|
|
endif()
|
|
|
|
add_definitions(-Dinline=__inline)
|
|
|
|
if(NOT CMAKE_CROSSCOMPILING)
|
|
|
|
|
|
else()
|
|
|
|
add_definitions(/GS- /Zl /Zi)
|
|
add_definitions(-Dinline=__inline -D__STDC__=1)
|
|
|
|
IF(${_MACHINE_ARCH_FLAG} MATCHES X86)
|
|
SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
|
|
SET (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
|
|
SET (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
|
|
ENDIF()
|
|
|
|
link_directories("${REACTOS_BINARY_DIR}/importlibs" ${REACTOS_BINARY_DIR}/lib/3rdparty/mingw)
|
|
|
|
set(CMAKE_RC_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
|
|
|
macro(add_linkerflag MODULE _flag)
|
|
set(NEW_LINKER_FLAGS ${_flag})
|
|
get_target_property(LINKER_FLAGS ${MODULE} LINK_FLAGS)
|
|
if(LINKER_FLAGS)
|
|
set(NEW_LINKER_FLAGS "${LINKER_FLAGS} ${NEW_LINKER_FLAGS}")
|
|
endif()
|
|
set_target_properties(${MODULE} PROPERTIES LINK_FLAGS ${NEW_LINKER_FLAGS})
|
|
endmacro()
|
|
|
|
macro(set_entrypoint MODULE ENTRYPOINT)
|
|
if(${ENTRYPOINT} STREQUAL "0")
|
|
add_linkerflag(${MODULE} "/ENTRY:0")
|
|
else()
|
|
add_linkerflag(${MODULE} "/ENTRY:${ENTRYPOINT}")
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(set_subsystem MODULE SUBSYSTEM)
|
|
add_linkerflag(${MODULE} "/subsystem:${SUBSYSTEM}")
|
|
endmacro()
|
|
|
|
macro(set_image_base MODULE IMAGE_BASE)
|
|
add_linkerflag(${MODULE} "/BASE:${IMAGE_BASE}")
|
|
endmacro()
|
|
|
|
macro(set_module_type MODULE TYPE)
|
|
add_dependencies(${MODULE} psdk buildno_header)
|
|
if(${TYPE} MATCHES nativecui)
|
|
set_subsystem(${MODULE} native)
|
|
add_importlibs(${MODULE} ntdll)
|
|
endif()
|
|
if (${TYPE} MATCHES win32gui)
|
|
set_subsystem(${MODULE} windows)
|
|
endif ()
|
|
if (${TYPE} MATCHES win32cui)
|
|
set_subsystem(${MODULE} console)
|
|
set_entrypoint(${MODULE} mainCRTStartup)
|
|
target_link_libraries(${MODULE} mingw_common mingw_wmain)
|
|
endif ()
|
|
if(${TYPE} MATCHES win32dll)
|
|
# Need this only because mingw library is broken
|
|
set_entrypoint(${MODULE} DllMainCRTStartup@12)
|
|
if(DEFINED baseaddress_${MODULE})
|
|
set_image_base(${MODULE} ${baseaddress_${MODULE}})
|
|
else()
|
|
message(STATUS "${MODULE} has no base address")
|
|
endif()
|
|
target_link_libraries(${MODULE} mingw_common mingw_dllmain)
|
|
add_importlibs(${MODULE} msvcrt kernel32)
|
|
endif()
|
|
|
|
endmacro()
|
|
|
|
macro(set_unicode)
|
|
add_definitions(-DUNICODE -D_UNICODE)
|
|
endmacro()
|
|
|
|
set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Zi /Ob0 /Od")
|
|
set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Zi /Ob0 /Od")
|
|
|
|
macro(set_rc_compiler)
|
|
# dummy, this workaround is only needed in mingw due to lack of RC support in cmake
|
|
endmacro()
|
|
|
|
#idl files support
|
|
set(IDL_COMPILER midl)
|
|
set(IDL_FLAGS /win32)
|
|
set(IDL_HEADER_ARG /h) #.h
|
|
set(IDL_TYPELIB_ARG /tlb) #.tlb
|
|
set(IDL_SERVER_ARG /sstub) #.c for stub server library
|
|
set(IDL_CLIENT_ARG /cstub) #.c for stub client library
|
|
|
|
|
|
macro(add_importlib_target _def_file)
|
|
get_filename_component(_name ${_def_file} NAME_WE)
|
|
add_custom_command(
|
|
OUTPUT {CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib
|
|
COMMAND LINK /LIB /MACHINE:X86 /DEF:${_def_file} /OUT:${CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib
|
|
DEPENDS ${_def_file}
|
|
)
|
|
add_custom_target(
|
|
lib${_name}
|
|
DEPENDS {CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib
|
|
)
|
|
endmacro()
|
|
|
|
macro(add_importlibs MODULE)
|
|
foreach(LIB ${ARGN})
|
|
target_link_libraries(${MODULE} ${CMAKE_BINARY_DIR}/importlibs/lib${LIB}.lib)
|
|
add_dependencies(${MODULE} lib${LIB})
|
|
endforeach()
|
|
endmacro()
|
|
|
|
macro(pdef2def _pdef_file)
|
|
get_filename_component(_file ${_pdef_file} NAME_WE)
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_file}.def
|
|
COMMAND ${CMAKE_C_COMPILER} /EP /c ${CMAKE_CURRENT_SOURCE_DIR}/${_pdef_file} > ${CMAKE_CURRENT_BINARY_DIR}/${_file}.def
|
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_pdef_file})
|
|
add_custom_target(
|
|
${_file}_def
|
|
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_file}.def)
|
|
endmacro(pdef2def _pdef_file)
|
|
|
|
macro(set_pdef_file _module _pdef_file)
|
|
pdef2def(${_pdef_file})
|
|
get_filename_component(_file ${_pdef_file} NAME_WE)
|
|
add_linkerflag(${_module} "/DEF:${CMAKE_CURRENT_BINARY_DIR}/${_file}.def")
|
|
add_dependencies(${_module} ${_file}_def)
|
|
endmacro()
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/importlibs)
|
|
|
|
#pseh workaround
|
|
set(PSEH_LIB "")
|
|
|
|
endif()
|