9be8b436fe57476f245f5db164e104f014b003eb
[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     BitReader
15     BitWriter
16     CodeGen
17     Core
18     DebugInfoDWARF
19     DebugInfoPDB
20     ExecutionEngine
21     IPO
22     IRReader
23     InstCombine
24     Instrumentation
25     Interpreter
26     Linker
27     MCDisassembler
28     MCJIT
29     ObjCARCOpts
30     Object
31     ScalarOpts
32     Support
33     Target
34     TransformUtils
35     Vectorize
36     native
37     )
38 endif()
39
40 add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" )
41
42 set(SOURCES
43   libllvm.cpp
44   )
45
46 llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
47
48 if(NOT DEFINED LLVM_DYLIB_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   if (NOT LLVM_DYLIB_EXPORT_ALL)
60     foreach (lib ${LIB_NAMES})
61       set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
62       set(LIB_NAME ${LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib})
63       set(LIB_PATH ${LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
64       set(LIB_EXPORTS_PATH ${LIB_NAME}.exports)
65       list(APPEND LLVM_DYLIB_REQUIRED_EXPORTS ${LIB_EXPORTS_PATH})
66
67       
68       add_custom_command(OUTPUT ${LIB_EXPORTS_PATH}
69         COMMAND nm ${LIB_PATH} | awk "/T _LLVM/ || /T LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_EXPORTS_PATH}
70         WORKING_DIRECTORY ${LIB_DIR}
71         DEPENDS ${lib}
72         COMMENT "Generating Export list for ${lib}..."
73         VERBATIM )
74     endforeach ()
75   endif()
76
77   if (LLVM_DYLIB_EXPORT_ALL)
78     add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
79       COMMAND echo \"LLVM*\" > ${LLVM_EXPORTED_SYMBOL_FILE} && echo \"_Z*llvm*\" >> ${LLVM_EXPORTED_SYMBOL_FILE}
80       WORKING_DIRECTORY ${LIB_DIR}
81       DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS}
82       COMMENT "Generating combined export list...")
83   else()
84     add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
85       COMMAND cat ${LLVM_DYLIB_REQUIRED_EXPORTS} > ${LLVM_EXPORTED_SYMBOL_FILE}
86       WORKING_DIRECTORY ${LIB_DIR}
87       DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS}
88       COMMENT "Generating combined export list...")
89   endif()
90
91   add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
92 else()
93   set(LLVM_EXPORTED_SYMBOL_FILE ${LLVM_DYLIB_EXPORTED_SYMBOL_FILE})
94   add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
95 endif()
96
97 add_llvm_library(LLVM SHARED ${SOURCES})
98
99 list(REMOVE_DUPLICATES LIB_NAMES)
100 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
101   # GNU ld doesn't resolve symbols in the version script.
102   set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
103 elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
104   set(LIB_NAMES -Wl,-all_load ${LIB_NAMES})
105 endif()
106
107 target_link_libraries(LLVM PRIVATE ${LIB_NAMES})
108
109 add_dependencies(LLVM libLLVMExports)
110
111 if (APPLE)
112   set_property(TARGET LLVM APPEND_STRING PROPERTY
113               LINK_FLAGS
114               " -compatibility_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
115 endif()
116