peerapi/cmake/Mergestaticlibs.cmake

104 lines
3.8 KiB
CMake

macro (MERGE_STATIC_LIBRARIES TARGET_LIB LIBRARIES LIBRARIES_DEBUG OBJECTS OBJECTS_DEBUG)
if("${CMAKE_CFG_INTDIR}" STREQUAL ".")
set(multiconfig FALSE)
else()
set(multiconfig TRUE)
endif()
if (WIN32)
# On Windows you must add aditional formatting to the LIBRARIES variable as a single string for the windows libtool
# with each library path wrapped in "" in case it contains spaces
string (REPLACE ";" "\" \"" LIBS "${LIBRARIES}")
string (REPLACE ";" "\" \"" LIBS_DEBUG "${LIBRARIES_DEBUG}")
set (LIBS \"${LIBS}\")
set (LIBS_DEBUG \"${LIBS_DEBUG}\")
string (REPLACE ";" "\" \"" OBJS "${OBJECTS}")
string (REPLACE ";" "\" \"" OBJS_DEBUG "${OBJECTS_DEBUG}")
set (OBJS \"${OBJS}\")
set (OBJS_DEBUG \"${OBJS_DEBUG}\")
foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER "${CONFIG_TYPE}" _CONFIG_TYPE)
string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME)
if ("${_CONFIG_TYPE}" STREQUAL "DEBUG")
set_property (TARGET ${TARGET_LIB} APPEND PROPERTY ${PROPNAME} "${LIBS_DEBUG} ${OBJS_DEBUG}")
else()
set_property (TARGET ${TARGET_LIB} APPEND PROPERTY ${PROPNAME} "${LIBS} ${OBJS}")
endif()
endforeach()
elseif (APPLE)
# Use OSX's libtool to merge archives
if(multiconfig)
message(FATAL_ERROR "Multiple configurations are not supported")
endif()
set(outfile $<TARGET_FILE:${TARGET_LIB}>)
set(target_temp_file "${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_LIB}_temp.a")
string(TOUPPER "${CMAKE_BUILD_TYPE}" _CMAKE_BUILD_TYPE)
if (_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
set(_LIBRARIES ${LIBRARIES_DEBUG})
set(_OBJECTS ${OBJECTS_DEBUG})
else()
set(_LIBRARIES ${LIBRARIES})
set(_OBJECTS ${OBJECTS})
endif()
add_custom_command(TARGET ${TARGET_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${outfile}"
"${target_temp_file}"
COMMAND rm "${outfile}"
COMMAND /usr/bin/libtool -no_warning_for_no_symbols -static -o "${outfile}"
"${target_temp_file}" ${_LIBRARIES} ${_OBJECTS}
COMMAND rm "${target_temp_file}"
)
elseif (UNIX)
# general UNIX - need to "ar -M"
if(multiconfig)
message(FATAL_ERROR "Multiple configurations are not supported")
endif()
string(TOUPPER "${CMAKE_BUILD_TYPE}" _CMAKE_BUILD_TYPE)
if (_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
set(_LIBRARIES ${LIBRARIES_DEBUG})
set(_OBJECTS ${OBJECTS_DEBUG})
else()
set(_LIBRARIES ${LIBRARIES})
set(_OBJECTS ${OBJECTS})
endif()
set(outfile "libpeerapi.a")
set(target_temp_file "${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_LIB}_temp.a")
set(MRI_SCRIPT "create ${outfile}\n")
foreach(lib ${_LIBRARIES})
set(MRI_SCRIPT "${MRI_SCRIPT}addlib ${lib}\n")
endforeach()
foreach(obj ${_OBJECTS})
set(MRI_SCRIPT "${MRI_SCRIPT}addmod ${obj}\n")
endforeach()
set(MRI_SCRIPT "${MRI_SCRIPT}addlib ${target_temp_file}\n")
set(MRI_SCRIPT "${MRI_SCRIPT}delete messagehandler.o\n")
set(MRI_SCRIPT "${MRI_SCRIPT}save\n")
set(MRI_SCRIPT "${MRI_SCRIPT}end\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/peerapi.mri" "${MRI_SCRIPT}")
add_custom_command(TARGET ${TARGET_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${outfile}"
"${target_temp_file}"
COMMAND rm "${outfile}"
COMMAND ${CMAKE_AR} -M < "${CMAKE_CURRENT_BINARY_DIR}/peerapi.mri"
COMMAND rm "${target_temp_file}"
)
endif (WIN32)
endmacro (MERGE_STATIC_LIBRARIES)