|
|
|
@ -106,22 +106,22 @@ function(merge_static_libs TARGET_NAME)
|
|
|
|
|
endforeach()
|
|
|
|
|
list(REMOVE_DUPLICATES libs_deps)
|
|
|
|
|
|
|
|
|
|
if(APPLE) # Use OSX's libtool to merge archives
|
|
|
|
|
# To produce a library we need at least one source file.
|
|
|
|
|
# It is created by add_custom_command below and will helps
|
|
|
|
|
# also help to track dependencies.
|
|
|
|
|
set(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_dummy.c)
|
|
|
|
|
# To produce a library we need at least one source file.
|
|
|
|
|
# It is created by add_custom_command below and will helps
|
|
|
|
|
# also help to track dependencies.
|
|
|
|
|
set(target_SRCS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_dummy.c)
|
|
|
|
|
|
|
|
|
|
if(APPLE) # Use OSX's libtool to merge archives
|
|
|
|
|
# Make the generated dummy source file depended on all static input
|
|
|
|
|
# libs. If input lib changes,the source file is touched
|
|
|
|
|
# which causes the desired effect (relink).
|
|
|
|
|
add_custom_command(OUTPUT ${dummyfile}
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${dummyfile}
|
|
|
|
|
add_custom_command(OUTPUT ${target_SRCS}
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${target_SRCS}
|
|
|
|
|
DEPENDS ${libs})
|
|
|
|
|
|
|
|
|
|
# Generate dummy staic lib
|
|
|
|
|
file(WRITE ${dummyfile} "const char * dummy = \"${dummyfile}\";")
|
|
|
|
|
add_library(${TARGET_NAME} STATIC ${dummyfile})
|
|
|
|
|
file(WRITE ${target_SRCS} "const char *dummy = \"${target_SRCS}\";")
|
|
|
|
|
add_library(${TARGET_NAME} STATIC ${target_SRCS})
|
|
|
|
|
target_link_libraries(${TARGET_NAME} ${libs_deps})
|
|
|
|
|
|
|
|
|
|
foreach(lib ${libs})
|
|
|
|
@ -130,11 +130,14 @@ function(merge_static_libs TARGET_NAME)
|
|
|
|
|
endforeach()
|
|
|
|
|
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
|
|
|
|
COMMAND rm "${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a"
|
|
|
|
|
COMMAND /usr/bin/libtool -static -o "${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a" ${libfiles})
|
|
|
|
|
COMMAND /usr/bin/libtool -static -o "${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a" ${libfiles}
|
|
|
|
|
)
|
|
|
|
|
else() # general UNIX: use "ar" to extract objects and re-add to a common lib
|
|
|
|
|
set(target_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.dir)
|
|
|
|
|
|
|
|
|
|
foreach(lib ${libs})
|
|
|
|
|
set(objlistfile ${lib}.objlist) # list of objects in the input library
|
|
|
|
|
set(objdir ${lib}.objdir)
|
|
|
|
|
set(objlistfile ${target_DIR}/${lib}.objlist) # list of objects in the input library
|
|
|
|
|
set(objdir ${target_DIR}/${lib}.objdir)
|
|
|
|
|
|
|
|
|
|
add_custom_command(OUTPUT ${objdir}
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${objdir}
|
|
|
|
@ -142,31 +145,32 @@ function(merge_static_libs TARGET_NAME)
|
|
|
|
|
|
|
|
|
|
add_custom_command(OUTPUT ${objlistfile}
|
|
|
|
|
COMMAND ${CMAKE_AR} -x "$<TARGET_FILE:${lib}>"
|
|
|
|
|
COMMAND ${CMAKE_AR} -t "$<TARGET_FILE:${lib}>" > ../${objlistfile}
|
|
|
|
|
COMMAND ${CMAKE_AR} -t "$<TARGET_FILE:${lib}>" > ${objlistfile}
|
|
|
|
|
DEPENDS ${lib} ${objdir}
|
|
|
|
|
WORKING_DIRECTORY ${objdir})
|
|
|
|
|
|
|
|
|
|
# Empty dummy source file that goes into merged library
|
|
|
|
|
set(mergebase ${lib}.mergebase.c)
|
|
|
|
|
add_custom_command(OUTPUT ${mergebase}
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${mergebase}
|
|
|
|
|
DEPENDS ${objlistfile})
|
|
|
|
|
|
|
|
|
|
list(APPEND mergebases "${mergebase}")
|
|
|
|
|
list(APPEND target_OBJS "${objlistfile}")
|
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
|
|
add_library(${TARGET_NAME} STATIC ${mergebases})
|
|
|
|
|
# Make the generated dummy source file depended on all static input
|
|
|
|
|
# libs. If input lib changes,the source file is touched
|
|
|
|
|
# which causes the desired effect (relink).
|
|
|
|
|
add_custom_command(OUTPUT ${target_SRCS}
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${target_SRCS}
|
|
|
|
|
DEPENDS ${libs} ${target_OBJS})
|
|
|
|
|
|
|
|
|
|
# Generate dummy staic lib
|
|
|
|
|
file(WRITE ${target_SRCS} "const char *dummy = \"${target_SRCS}\";")
|
|
|
|
|
add_library(${TARGET_NAME} STATIC ${target_SRCS})
|
|
|
|
|
target_link_libraries(${TARGET_NAME} ${libs_deps})
|
|
|
|
|
|
|
|
|
|
# Get the file name of the generated library
|
|
|
|
|
set(outlibfile "$<TARGET_FILE:${TARGET_NAME}>")
|
|
|
|
|
set(target_LIBNAME "$<TARGET_FILE:${TARGET_NAME}>")
|
|
|
|
|
|
|
|
|
|
foreach(lib ${libs})
|
|
|
|
|
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
|
|
|
|
COMMAND ${CMAKE_AR} cr ${outlibfile} *.o
|
|
|
|
|
COMMAND ${CMAKE_RANLIB} ${outlibfile}
|
|
|
|
|
WORKING_DIRECTORY ${lib}.objdir)
|
|
|
|
|
endforeach()
|
|
|
|
|
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
|
|
|
|
COMMAND ${CMAKE_AR} crs ${target_LIBNAME} `find ${target_DIR} -name '*.o'`
|
|
|
|
|
COMMAND ${CMAKE_RANLIB} ${target_LIBNAME}
|
|
|
|
|
WORKING_DIRECTORY ${target_DIR})
|
|
|
|
|
endif()
|
|
|
|
|
endfunction(merge_static_libs)
|
|
|
|
|
|
|
|
|
@ -196,7 +200,7 @@ function(cc_library TARGET_NAME)
|
|
|
|
|
add_style_check_target(${TARGET_NAME} ${cc_library_SRCS} ${cc_library_HEADERS})
|
|
|
|
|
|
|
|
|
|
else(cc_library_SRCS)
|
|
|
|
|
if (cc_library_DEPS)
|
|
|
|
|
if(cc_library_DEPS)
|
|
|
|
|
merge_static_libs(${TARGET_NAME} ${cc_library_DEPS})
|
|
|
|
|
else()
|
|
|
|
|
message(FATAL "Please specify source file or library in cc_library.")
|
|
|
|
|