[CMake] Let llvm-shlib work on Linux with --whole-archive.
[oota-llvm.git] / 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     AsmPrinter
15     BitReader
16     BitWriter
17     CodeGen
18     Core
19     ExecutionEngine
20     IPA
21     IPO
22     IRReader
23     InstCombine
24     Instrumentation
25     Interpreter
26     Linker
27     MC
28     MCDisassembler
29     MCJIT
30     ObjCARCOpts
31     Object
32     ScalarOpts
33     SelectionDAG
34     Support
35     Target
36     TransformUtils
37     Vectorize
38     native
39     )
40 endif()
41
42 add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" )
43
44 set(SOURCES
45   libllvm.cpp
46   )
47
48 if(NOT DEFINED LLVM_EXPORTED_SYMBOL_FILE)
49
50   if( WIN32 AND NOT CYGWIN )
51     message(FATAL_ERROR "Auto-generation not implemented for Win32 without GNU utils. Please specify LLVM_EXPORTED_SYMBOL_FILE.")
52   endif()
53
54   # To get the export list for a single llvm library:
55   # nm ${LIB_PATH} | awk "/T _LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_PATH}.exports
56
57   set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm.exports)
58
59   llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
60
61   foreach (lib ${LIB_NAMES})
62     
63     set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib)
64     set(LIB_NAME ${LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib})
65     set(LIB_PATH ${LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
66     set(LIB_EXPORTS_PATH ${LIB_NAME}.exports)
67
68     list(APPEND LLVM_DYLIB_REQUIRED_EXPORTS ${LIB_EXPORTS_PATH})
69
70     add_custom_command(OUTPUT ${LIB_EXPORTS_PATH}
71       COMMAND nm ${LIB_PATH} | awk "/T _LLVM/ || /T LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_EXPORTS_PATH}
72       WORKING_DIRECTORY ${LIB_DIR}
73       DEPENDS ${lib}
74       COMMENT "Generating Export list for ${lib}..."
75       VERBATIM )
76   endforeach ()
77
78   add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
79     COMMAND cat ${LLVM_DYLIB_REQUIRED_EXPORTS} > ${LLVM_EXPORTED_SYMBOL_FILE}
80     WORKING_DIRECTORY ${LIB_DIR}
81     DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS}
82     COMMENT "Generating combined export list...")
83
84 endif()
85
86 add_llvm_library(LLVM SHARED ${SOURCES})
87
88 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
89   # GNU ld doesn't resolve symbols in the version script.
90   list(REMOVE_DUPLICATES LIB_NAMES)
91   set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
92 endif()
93
94 target_link_libraries(LLVM ${cmake_2_8_12_PRIVATE} ${LIB_NAMES})
95
96 add_dependencies(LLVM ${LLVM_EXPORTED_SYMBOL_FILE})
97
98 if (APPLE)
99   set_property(TARGET LLVM APPEND_STRING PROPERTY
100               LINK_FLAGS
101               " -compatibility_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
102 endif()
103