From b6fe25c47661a287224d09165b68ce76084294ca Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sat, 28 Dec 2013 23:31:44 +0000 Subject: EXPORTED_SYMBOL_FILE support for cmake The cmake build didn't support EXPORTED_SYMBOL_FILE. Instead, it had a Windows-only implementation in tools/lto/CMakeLists.txt, a linux-only implementation in tools/gold/CMakeLists.txt, and a darwin-only implementation in tools/clang/tools/libclang/CMakeLists.txt. This attempts to consolidate these one-offs into a single place. Clients can now just set LLVM_EXPORTED_SYMBOL_FILE and things (hopefully) Just Work, like in the make build. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198136 91177308-0d34-0410-b5e6-96231b3b80d8 --- cmake/modules/AddLLVM.cmake | 79 +++++++++++++++++++++++++++++++++++ cmake/modules/HandleLLVMOptions.cmake | 3 ++ tools/gold/CMakeLists.txt | 28 +------------ tools/lto/CMakeLists.txt | 22 ++-------- 4 files changed, 87 insertions(+), 45 deletions(-) diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index 2daa622ded..fdd79a0abb 100644 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -2,6 +2,72 @@ include(LLVMParseArguments) include(LLVMProcessSources) include(LLVM-Config) +function(add_llvm_symbol_exports target_name export_file) + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(native_export_file "symbol.exports") + add_custom_command(OUTPUT symbol.exports + COMMAND sed -e "s/^/_/" < ${export_file} > symbol.exports + DEPENDS ${export_file} + VERBATIM + COMMENT "Creating export file for ${target_name}") + set_property(TARGET ${target_name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/symbol.exports") + elseif(LLVM_HAVE_LINK_VERSION_SCRIPT) + # Gold and BFD ld require a version script rather than a plain list. + set(native_export_file "symbol.exports") + # FIXME: Don't write the "local:" line on OpenBSD. + add_custom_command(OUTPUT symbol.exports + COMMAND echo "{" > symbol.exports + COMMAND grep -q "[[:alnum:]]" ${export_file} && echo " global:" >> symbol.exports || : + COMMAND sed -e "s/$$/;/" -e "s/^/ /" < ${export_file} >> symbol.exports + COMMAND echo " local: *;" >> symbol.exports + COMMAND echo "};" >> symbol.exports + DEPENDS ${export_file} + VERBATIM + COMMENT "Creating export file for ${target_name}") + set_property(TARGET ${target_name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/symbol.exports") + else() + set(native_export_file "symbol.def") + + set(CAT "type") + if(CYGWIN) + set(CAT "cat") + endif() + + add_custom_command(OUTPUT symbol.def + COMMAND cmake -E echo "EXPORTS" > symbol.def + COMMAND ${CAT} < ${export_file} >> symbol.def + DEPENDS ${export_file} + VERBATIM + COMMENT "Creating export file for ${target_name}") + set_property(TARGET ${target_name} APPEND_STRING PROPERTY + LINK_FLAGS " ${CMAKE_CURRENT_BINARY_DIR}/symbol.def") + endif() + + add_custom_target(${target_name}_exports DEPENDS ${native_export_file}) + + get_property(srcs TARGET ${target_name} PROPERTY SOURCES) + foreach(src ${srcs}) + get_filename_component(extension ${src} EXT) + if(extension STREQUAL ".cpp") + set(first_source_file ${src}) + break() + endif() + endforeach() + + # Force re-linking when the exports file changes. Actually, it + # forces recompilation of the source file. The LINK_DEPENDS target + # property only works for makefile-based generators. + set_property(SOURCE ${first_source_file} APPEND PROPERTY + OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}) + + set_property(DIRECTORY APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file}) + + add_dependencies(${target_name} ${target_name}_exports) +endfunction(add_llvm_symbol_exports) + macro(add_llvm_library name) llvm_process_sources( ALL_FILES ${ARGN} ) add_library( ${name} ${ALL_FILES} ) @@ -19,6 +85,10 @@ macro(add_llvm_library name) endif () endif() + if (LLVM_EXPORTED_SYMBOL_FILE) + add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) + endif() + # Ensure that the system libraries always comes last on the # list. Without this, linking the unit tests on MinGW fails. link_system_libs( ${name} ) @@ -57,6 +127,10 @@ ${name} ignored.") set(libkind SHARED) endif() + if (LLVM_EXPORTED_SYMBOL_FILE) + add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) + endif(LLVM_EXPORTED_SYMBOL_FILE) + add_library( ${name} ${libkind} ${ALL_FILES} ) set_target_properties( ${name} PROPERTIES PREFIX "" ) @@ -91,6 +165,11 @@ macro(add_llvm_executable name) else() add_executable(${name} ${ALL_FILES}) endif() + + if (LLVM_EXPORTED_SYMBOL_FILE) + add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) + endif(LLVM_EXPORTED_SYMBOL_FILE) + set(EXCLUDE_FROM_ALL OFF) llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) if( LLVM_COMMON_DEPENDS ) diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake index facf2f97fd..38dacb7b88 100644 --- a/cmake/modules/HandleLLVMOptions.cmake +++ b/cmake/modules/HandleLLVMOptions.cmake @@ -41,6 +41,7 @@ else() endif() if(WIN32) + set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) if(CYGWIN) set(LLVM_ON_WIN32 0) set(LLVM_ON_UNIX 1) @@ -57,8 +58,10 @@ else(WIN32) set(LLVM_ON_WIN32 0) set(LLVM_ON_UNIX 1) if(APPLE) + set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) set(LTDL_SHLIB_EXT ".dylib") else(APPLE) + set(LLVM_HAVE_LINK_VERSION_SCRIPT 1) set(LTDL_SHLIB_EXT ".so") endif(APPLE) set(EXEEXT "") diff --git a/tools/gold/CMakeLists.txt b/tools/gold/CMakeLists.txt index 2cc132ff78..e0a3359018 100644 --- a/tools/gold/CMakeLists.txt +++ b/tools/gold/CMakeLists.txt @@ -1,6 +1,8 @@ set(LLVM_BINUTILS_INCDIR "" CACHE PATH "PATH to binutils/include containing plugin-api.h for gold plugin.") +set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/gold.exports) + if( NOT LLVM_BINUTILS_INCDIR ) # Nothing to say. elseif( NOT EXISTS "${LLVM_BINUTILS_INCDIR}/plugin-api.h" ) @@ -17,30 +19,4 @@ else() add_llvm_loadable_module(LLVMgold gold-plugin.cpp ) - - # Makefile.rules contains a special cases for OpenBSD, Darwin and - # Windows. We restrict ourselves to Linux for the time being. - set(srcexp ${CMAKE_CURRENT_SOURCE_DIR}/gold.exports) - add_custom_command(OUTPUT exportsfile - COMMAND echo "{" > exportsfile - COMMAND grep -q "\\<" ${srcexp} && echo " global:" >> exportsfile || : - COMMAND sed -e "s/$/;/" -e "s/^/ /" < ${srcexp} >> exportsfile - COMMAND echo " local: *;" >> exportsfile - COMMAND echo "};" >> exportsfile - DEPENDS ${srcexp} - VERBATIM - COMMENT "Creating export file for gold plugin") - add_custom_target(gold_exports DEPENDS exportsfile) - set_property(DIRECTORY APPEND - PROPERTY ADDITIONAL_MAKE_CLEAN_FILES exportsfile) - - # Force re-linking when the exports file changes. Actually, it - # forces recompilation of gold-plugin.cpp. The LINK_DEPENDS target - # property only works for makefile-based generators. - set_property(SOURCE gold-plugin.cpp APPEND PROPERTY - OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/exportsfile) - - target_link_libraries(LLVMgold LTO - -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/exportsfile) - add_dependencies(LLVMgold gold_exports) endif() diff --git a/tools/lto/CMakeLists.txt b/tools/lto/CMakeLists.txt index 1874052062..c54c8efee8 100644 --- a/tools/lto/CMakeLists.txt +++ b/tools/lto/CMakeLists.txt @@ -14,26 +14,10 @@ set(SOURCES lto.cpp ) -if( NOT CYGWIN AND LLVM_ENABLE_PIC ) - if ( WIN32 ) - # Create .def file containing a list of exports preceeded by - # 'EXPORTS'. The file "lto.exports" already contains the list, so we - # massage it into the correct format here to create "lto.exports.def". - set(LTO_EXPORTS_DEF ${CMAKE_CURRENT_BINARY_DIR}/lto.exports.def) - set(LTO_EXPORTS_DEF_TEMP ${LTO_EXPORTS_DEF}.txt) - file(READ "lto.exports" exports_list) - file(WRITE ${LTO_EXPORTS_DEF_TEMP} "LIBRARY LTO\n") - file(APPEND ${LTO_EXPORTS_DEF_TEMP} "EXPORTS\n") - file(APPEND ${LTO_EXPORTS_DEF_TEMP} ${exports_list}) - - # Copy the file only if it has changed. - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${LTO_EXPORTS_DEF_TEMP} ${LTO_EXPORTS_DEF}) +set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/lto.exports) - set(SHARED_LIB_SOURCES ${SOURCES} ${LTO_EXPORTS_DEF}) - else() - set(SHARED_LIB_SOURCES ${SOURCES}) - endif() +if( NOT CYGWIN AND LLVM_ENABLE_PIC ) + set(SHARED_LIB_SOURCES ${SOURCES}) set(bsl ${BUILD_SHARED_LIBS}) set(BUILD_SHARED_LIBS ON) -- cgit v1.2.3