comparison tools/llvm-shlib/CMakeLists.txt @ 100:7d135dc70f03 LLVM 3.9

LLVM 3.9
author Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
date Tue, 26 Jan 2016 22:53:40 +0900
parents afa8332a0e37
children 1172e4bd9c6f
comparison
equal deleted inserted replaced
96:6418606d0ead 100:7d135dc70f03
9 ) 9 )
10 10
11 llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS}) 11 llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
12 12
13 if(LLVM_LINK_LLVM_DYLIB) 13 if(LLVM_LINK_LLVM_DYLIB)
14 if(NOT LLVM_DYLIB_EXPORT_ALL) 14 if(LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
15 message(FATAL_ERROR "LLVM_DYLIB_EXPORT_ALL must be ON when LLVM_LINK_LLVM_DYLIB is ON") 15 message(WARNING "Using LLVM_LINK_LLVM_DYLIB with LLVM_DYLIB_EXPORTED_SYMBOL_FILE may not work. Use at your own risk.")
16 endif() 16 endif()
17 17
18 # libLLVM.so should not have any dependencies on any other LLVM 18 # libLLVM.so should not have any dependencies on any other LLVM
19 # shared libraries. When using the "all" pseudo-component, 19 # shared libraries. When using the "all" pseudo-component,
20 # LLVM_AVAILABLE_LIBS is added to the dependencies, which may 20 # LLVM_AVAILABLE_LIBS is added to the dependencies, which may
31 endif() 31 endif()
32 endforeach() 32 endforeach()
33 set(LIB_NAMES ${FILTERED_LIB_NAMES}) 33 set(LIB_NAMES ${FILTERED_LIB_NAMES})
34 endif() 34 endif()
35 35
36 if(NOT DEFINED LLVM_DYLIB_EXPORTED_SYMBOL_FILE) 36 if(LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
37 # To get the export list for a single llvm library:
38 # nm ${LIB_PATH} | awk "/T _LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_PATH}.exports
39
40 if (NOT LLVM_DYLIB_EXPORT_ALL)
41 if( WIN32 AND NOT CYGWIN )
42 message(FATAL_ERROR "Auto-generation not implemented for Win32 without GNU utils. Please specify LLVM_EXPORTED_SYMBOL_FILE.")
43 endif()
44
45 set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm.exports)
46
47 foreach (lib ${LIB_NAMES})
48 set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
49 set(LIB_NAME ${LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib})
50 set(LIB_PATH ${LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
51 set(LIB_EXPORTS_PATH ${LIB_NAME}.exports)
52 list(APPEND LLVM_DYLIB_REQUIRED_EXPORTS ${LIB_EXPORTS_PATH})
53
54
55 add_custom_command(OUTPUT ${LIB_EXPORTS_PATH}
56 COMMAND nm ${LIB_PATH} | awk "/T _LLVM/ || /T LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_EXPORTS_PATH}
57 WORKING_DIRECTORY ${LIB_DIR}
58 DEPENDS ${lib}
59 COMMENT "Generating Export list for ${lib}..."
60 VERBATIM )
61 endforeach ()
62
63 add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
64 COMMAND cat ${LLVM_DYLIB_REQUIRED_EXPORTS} > ${LLVM_EXPORTED_SYMBOL_FILE}
65 WORKING_DIRECTORY ${LIB_DIR}
66 DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS}
67 COMMENT "Generating combined export list...")
68 add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
69 endif()
70 else()
71 set(LLVM_EXPORTED_SYMBOL_FILE ${LLVM_DYLIB_EXPORTED_SYMBOL_FILE}) 37 set(LLVM_EXPORTED_SYMBOL_FILE ${LLVM_DYLIB_EXPORTED_SYMBOL_FILE})
72 add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE}) 38 add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
73 endif() 39 endif()
74 40
75 add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB ${SOURCES}) 41 add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES})
76 42
77 list(REMOVE_DUPLICATES LIB_NAMES) 43 list(REMOVE_DUPLICATES LIB_NAMES)
78 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf" 44 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
79 # GNU ld doesn't resolve symbols in the version script. 45 # GNU ld doesn't resolve symbols in the version script.
80 set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive) 46 set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
82 set(LIB_NAMES -Wl,-all_load ${LIB_NAMES}) 48 set(LIB_NAMES -Wl,-all_load ${LIB_NAMES})
83 endif() 49 endif()
84 50
85 target_link_libraries(LLVM PRIVATE ${LIB_NAMES}) 51 target_link_libraries(LLVM PRIVATE ${LIB_NAMES})
86 52
53 if (APPLE)
54 set_property(TARGET LLVM APPEND_STRING PROPERTY
55 LINK_FLAGS
56 " -compatibility_version 1 -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
57 endif()
58
87 if(TARGET libLLVMExports) 59 if(TARGET libLLVMExports)
88 add_dependencies(LLVM libLLVMExports) 60 add_dependencies(LLVM libLLVMExports)
89 endif() 61 endif()
90 62
91 if (APPLE) 63 if(LLVM_BUILD_LLVM_C_DYLIB)
92 set_property(TARGET LLVM APPEND_STRING PROPERTY 64 # To get the export list for a single llvm library:
65 # nm ${LIB_PATH} | awk "/T _LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_PATH}.exports
66
67 if(NOT APPLE)
68 message(FATAL_ERROR "Generating libLLVM-c is only supported on Darwin")
69 endif()
70
71 set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm-c.exports)
72
73 set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
74 set(LIB_NAME ${LIB_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}LLVM)
75 set(LIB_PATH ${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
76 set(LIB_EXPORTS_PATH ${LIB_NAME}.exports)
77 list(APPEND LLVM_DYLIB_REQUIRED_EXPORTS ${LIB_EXPORTS_PATH})
78
79 add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
80 COMMAND nm ${LIB_PATH} | awk "/T _LLVM/ || /T LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LLVM_EXPORTED_SYMBOL_FILE}
81 WORKING_DIRECTORY ${LIB_DIR}
82 DEPENDS LLVM
83 COMMENT "Generating Export list for LLVM..."
84 VERBATIM )
85
86 add_custom_target(libLLVMCExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
87
88 add_llvm_library(LLVM-C SHARED ${SOURCES})
89
90 target_link_libraries(LLVM-C PUBLIC LLVM)
91 add_dependencies(LLVM-C libLLVMCExports)
92
93 set_property(TARGET LLVM-C APPEND_STRING PROPERTY
93 LINK_FLAGS 94 LINK_FLAGS
94 " -compatibility_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}") 95 " -compatibility_version 1 -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} -Wl,-reexport_library ${LIB_PATH}")
95 endif() 96 endif()
96 97