From: NAKAMURA Takumi Date: Mon, 10 Nov 2014 15:04:02 +0000 (+0000) Subject: [CMake] Let llvm-shlib work on Linux with --whole-archive. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=5f3f254ed1d601c60d03e4437f75783774b03583 [CMake] Let llvm-shlib work on Linux with --whole-archive. FIXME: It should work on not only Linux but elf-targeting gnu ld. For example if LLVM_DYLIB_COMPONENTS is "BitWriter Support", CMake emits the command line like; -Wl,--whole-archive lib/libLLVMBitWriter.a lib/libLLVMSupport.a *1 -Wl,--no-whole-archive lib/libLLVMCore.a lib/libLLVMSupport.a *2 -lrt -ldl -ltinfo -lpthread -lm It works since symbols in LLVMCore is resolved with not *2 but *1. Unfortunately, --gc-sections is not powerful in this case to prune unused "visibility(default)" entries. I am still experimenting other way not to rely on --whole-archive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221591 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvm-shlib/CMakeLists.txt b/tools/llvm-shlib/CMakeLists.txt index 71a35f8d280..e808b1241d2 100644 --- a/tools/llvm-shlib/CMakeLists.txt +++ b/tools/llvm-shlib/CMakeLists.txt @@ -8,7 +8,7 @@ # LLVM components. All compoenent names handled by llvm-config are valid. if(NOT DEFINED LLVM_DYLIB_COMPONENTS) - set(LLVM_LINK_COMPONENTS + set(LLVM_DYLIB_COMPONENTS ${LLVM_TARGETS_TO_BUILD} Analysis AsmPrinter @@ -37,8 +37,6 @@ if(NOT DEFINED LLVM_DYLIB_COMPONENTS) Vectorize native ) -else() - set(LLVM_LINK_COMPONENTS ${LLVM_DYLIB_COMPONENTS}) endif() add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" ) @@ -58,7 +56,7 @@ if(NOT DEFINED LLVM_EXPORTED_SYMBOL_FILE) set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm.exports) - llvm_map_components_to_libnames(LIB_NAMES ${LLVM_LINK_COMPONENTS}) + llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS}) foreach (lib ${LIB_NAMES}) @@ -87,6 +85,14 @@ endif() add_llvm_library(LLVM SHARED ${SOURCES}) +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf" + # GNU ld doesn't resolve symbols in the version script. + list(REMOVE_DUPLICATES LIB_NAMES) + set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive) +endif() + +target_link_libraries(LLVM ${cmake_2_8_12_PRIVATE} ${LIB_NAMES}) + add_dependencies(LLVM ${LLVM_EXPORTED_SYMBOL_FILE}) if (APPLE)