aboutsummaryrefslogtreecommitdiff
path: root/cmake/MergeStaticLibs.cmake
diff options
context:
space:
mode:
authorredfish <redfish@galactica.pw>2016-08-29 09:34:58 -0400
committerredfish <redfish@galactica.pw>2016-08-30 23:01:43 -0400
commita7498adc03b5a8d0e4c120de039aa97fe32efc7a (patch)
tree250852394e91eada45f01189c27054efbe59ae2c /cmake/MergeStaticLibs.cmake
parentMerge pull request #1004 (diff)
downloadmonero-a7498adc03b5a8d0e4c120de039aa97fe32efc7a.tar.xz
cmake: comply with the new policy CMP0026
Access to LOCATION property at config time was disallowed by this policy. This patch updates the offending code to comply with the policy and thereby gets rid of the warning printed by cmake. The fix is to use generator expressions instead of that property. NOTE: Had to remove support for multiconfig (only affects MSVC which is not supported anyway; and mutliconf is an IDE thing in any case), because could not see how to support it with generator expressions.
Diffstat (limited to '')
-rw-r--r--cmake/MergeStaticLibs.cmake147
1 files changed, 46 insertions, 101 deletions
diff --git a/cmake/MergeStaticLibs.cmake b/cmake/MergeStaticLibs.cmake
index 858a026a3..1f0cee11a 100644
--- a/cmake/MergeStaticLibs.cmake
+++ b/cmake/MergeStaticLibs.cmake
@@ -16,114 +16,59 @@
function(merge_static_libs outlib )
set(libs ${ARGV})
list(REMOVE_AT libs 0)
-# Create a dummy file that the target will depend on
- set(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/${outlib}_dummy.c)
- file(WRITE ${dummyfile} "const char * dummy = \"${dummyfile}\";")
-
- add_library(${outlib} STATIC ${dummyfile})
+ list(REMOVE_DUPLICATES libs) # just in case
- if("${CMAKE_CFG_INTDIR}" STREQUAL ".")
- set(multiconfig FALSE)
- else()
- set(multiconfig TRUE)
- endif()
-
-# First get the file names of the libraries to be merged
+ # First get the file names of the libraries to be merged
foreach(lib ${libs})
get_target_property(libtype ${lib} TYPE)
if(NOT libtype STREQUAL "STATIC_LIBRARY")
- message(FATAL_ERROR "Merge_static_libs can only process static libraries")
+ message(FATAL_ERROR "merge_static_libs can only process static libraries")
endif()
- if(multiconfig)
- foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
- get_target_property("libfile_${CONFIG_TYPE}" ${lib} "LOCATION_${CONFIG_TYPE}")
- list(APPEND libfiles_${CONFIG_TYPE} ${libfile_${CONFIG_TYPE}})
- endforeach()
- else()
- get_target_property(libfile ${lib} LOCATION)
- list(APPEND libfiles "${libfile}")
- endif(multiconfig)
+ set(libfiles "${libfiles} $<TARGET_FILE:${lib}>")
endforeach()
- message(STATUS "will be merging ${libfiles}")
-# Just to be sure: cleanup from duplicates
- if(multiconfig)
- foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
- list(REMOVE_DUPLICATES libfiles_${CONFIG_TYPE})
- set(libfiles ${libfiles} ${libfiles_${CONFIG_TYPE}})
+
+ if(MSVC) # lib.exe does the merging of given a list
+ set_target_properties(${outlib} PROPERTIES STATIC_LIBRARY_FLAGS "${libfiles}")
+
+ elseif(APPLE) # Use OSX's libtool to merge archives
+ add_custom_command(TARGET ${outlib} POST_BUILD
+ COMMAND rm "$<TARGET_FILE:${outlib}>"
+ COMMAND /usr/bin/libtool -static -o "$<TARGET_FILE:${outlib}>" ${libfiles})
+
+ else() # general UNIX: use "ar" to extract objects and re-add to a common lib
+ foreach(lib ${libs})
+ set(objlistfile ${lib}.objlist) # list of objects in the input library
+ set(objdir ${lib}.objdir)
+
+ add_custom_command(OUTPUT ${objdir}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${objdir})
+
+ add_custom_command(OUTPUT ${objlistfile}
+ COMMAND ${CMAKE_AR} -x "$<TARGET_FILE:${lib}>"
+ 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}")
endforeach()
- endif()
- list(REMOVE_DUPLICATES libfiles)
-# Now the easy part for MSVC and for MAC
- if(MSVC)
- # lib.exe does the merging of libraries just need to conver the list into string
- foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
- set(flags "")
- foreach(lib ${libfiles_${CONFIG_TYPE}})
- set(flags "${flags} ${lib}")
+ # We need a target for the output merged library
+ add_library(${outlib} STATIC ${mergebases})
+ set(outlibfile "$<TARGET_FILE:${outlib}>")
+
+ foreach(lib ${libs})
+ add_custom_command(TARGET ${outlib} POST_BUILD
+ COMMAND ${CMAKE_AR} ru ${outlibfile} @"../${objlistfile}"
+ WORKING_DIRECTORY ${objdir})
endforeach()
- string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME)
- set_target_properties(${outlib} PROPERTIES ${PROPNAME} "${flags}")
- endforeach()
-
- elseif(APPLE)
- # Use OSX's libtool to merge archives
- if(multiconfig)
- message(FATAL_ERROR "Multiple configurations are not supported")
- endif()
- get_target_property(outfile ${outlib} LOCATION)
- add_custom_command(TARGET ${outlib} POST_BUILD
- COMMAND rm ${outfile}
- COMMAND /usr/bin/libtool -static -o ${outfile}
- ${libfiles}
- )
- else()
- # general UNIX - need to "ar -x" and then "ar -ru"
- if(multiconfig)
- message(FATAL_ERROR "Multiple configurations are not supported")
- endif()
- get_target_property(outfile ${outlib} LOCATION)
- message(STATUS "outfile location is ${outfile}")
- foreach(lib ${libfiles})
-# objlistfile will contain the list of object files for the library
- set(objlistfile ${lib}.objlist)
- set(objdir ${lib}.objdir)
- set(objlistcmake ${objlistfile}.cmake)
-# we only need to extract files once
- if(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake.check_cache IS_NEWER_THAN ${objlistcmake})
-#---------------------------------
- FILE(WRITE ${objlistcmake}
-"# Extract object files from the library
-message(STATUS \"Extracting object files from ${lib}\")
-EXECUTE_PROCESS(COMMAND ${CMAKE_AR} -x ${lib}
- WORKING_DIRECTORY ${objdir})
-# save the list of object files
-EXECUTE_PROCESS(COMMAND ls .
- OUTPUT_FILE ${objlistfile}
- WORKING_DIRECTORY ${objdir})")
-#---------------------------------
- file(MAKE_DIRECTORY ${objdir})
- add_custom_command(
- OUTPUT ${objlistfile}
- COMMAND ${CMAKE_COMMAND} -P ${objlistcmake}
- DEPENDS ${lib})
- endif()
- list(APPEND extrafiles "${objlistfile}")
- # relative path is needed by ar under MSYS
- file(RELATIVE_PATH objlistfilerpath ${objdir} ${objlistfile})
- add_custom_command(TARGET ${outlib} POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E echo "Running: ${CMAKE_AR} ru ${outfile} @${objlistfilerpath}"
- COMMAND ${CMAKE_AR} ru "${outfile}" @"${objlistfilerpath}"
- WORKING_DIRECTORY ${objdir})
- endforeach()
- add_custom_command(TARGET ${outlib} POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E echo "Running: ${CMAKE_RANLIB} ${outfile}"
- COMMAND ${CMAKE_RANLIB} ${outfile})
- endif()
- file(WRITE ${dummyfile}.base "const char* ${outlib}_sublibs=\"${libs}\";")
- add_custom_command(
- OUTPUT ${dummyfile}
- COMMAND ${CMAKE_COMMAND} -E copy ${dummyfile}.base ${dummyfile}
- DEPENDS ${libs} ${extrafiles})
- endfunction() \ No newline at end of file
+ add_custom_command(TARGET ${outlib} POST_BUILD
+ COMMAND ${CMAKE_RANLIB} ${outlibfile})
+ endif()
+endfunction()