]> git.proxmox.com Git - rustc.git/blob - src/llvm/tools/llvm-shlib/CMakeLists.txt
Imported Upstream version 1.0.0+dfsg1
[rustc.git] / src / llvm / tools / llvm-shlib / CMakeLists.txt
1 # This tool creates a shared library from the LLVM libraries. Generating this
2 # library is enabled by setting LLVM_BUILD_LLVM_DYLIB=yes on the CMake
3 # commandline. By default the shared library only exports the LLVM C API.
4
5
6 # You can configure which libraries from LLVM you want to include in the shared
7 # library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited list of
8 # LLVM components. All compoenent names handled by llvm-config are valid.
9
10 if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
11 set(LLVM_DYLIB_COMPONENTS
12 ${LLVM_TARGETS_TO_BUILD}
13 Analysis
14 BitReader
15 BitWriter
16 CodeGen
17 Core
18 ExecutionEngine
19 IPA
20 IPO
21 IRReader
22 InstCombine
23 Instrumentation
24 Interpreter
25 Linker
26 MCDisassembler
27 MCJIT
28 ObjCARCOpts
29 Object
30 ScalarOpts
31 Support
32 Target
33 TransformUtils
34 Vectorize
35 native
36 )
37 endif()
38
39 add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" )
40
41 set(SOURCES
42 libllvm.cpp
43 )
44
45 if(NOT DEFINED LLVM_EXPORTED_SYMBOL_FILE)
46
47 if( WIN32 AND NOT CYGWIN )
48 message(FATAL_ERROR "Auto-generation not implemented for Win32 without GNU utils. Please specify LLVM_EXPORTED_SYMBOL_FILE.")
49 endif()
50
51 # To get the export list for a single llvm library:
52 # nm ${LIB_PATH} | awk "/T _LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_PATH}.exports
53
54 set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm.exports)
55
56 llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
57
58 foreach (lib ${LIB_NAMES})
59
60 set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
61 set(LIB_NAME ${LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib})
62 set(LIB_PATH ${LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
63 set(LIB_EXPORTS_PATH ${LIB_NAME}.exports)
64
65 list(APPEND LLVM_DYLIB_REQUIRED_EXPORTS ${LIB_EXPORTS_PATH})
66
67 add_custom_command(OUTPUT ${LIB_EXPORTS_PATH}
68 COMMAND nm ${LIB_PATH} | awk "/T _LLVM/ || /T LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_EXPORTS_PATH}
69 WORKING_DIRECTORY ${LIB_DIR}
70 DEPENDS ${lib}
71 COMMENT "Generating Export list for ${lib}..."
72 VERBATIM )
73 endforeach ()
74
75 add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
76 COMMAND cat ${LLVM_DYLIB_REQUIRED_EXPORTS} > ${LLVM_EXPORTED_SYMBOL_FILE}
77 WORKING_DIRECTORY ${LIB_DIR}
78 DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS}
79 COMMENT "Generating combined export list...")
80
81 endif()
82
83 add_llvm_library(LLVM SHARED ${SOURCES})
84
85 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
86 # GNU ld doesn't resolve symbols in the version script.
87 list(REMOVE_DUPLICATES LIB_NAMES)
88 set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
89 endif()
90
91 target_link_libraries(LLVM ${cmake_2_8_12_PRIVATE} ${LIB_NAMES})
92
93 add_dependencies(LLVM ${LLVM_EXPORTED_SYMBOL_FILE})
94
95 if (APPLE)
96 set_property(TARGET LLVM APPEND_STRING PROPERTY
97 LINK_FLAGS
98 " -compatibility_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
99 endif()
100