Fixing a mis-use of the CMake install command.
[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     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 llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
46
47 if(NOT DEFINED LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
48
49   if( WIN32 AND NOT CYGWIN )
50     message(FATAL_ERROR "Auto-generation not implemented for Win32 without GNU utils. Please specify LLVM_EXPORTED_SYMBOL_FILE.")
51   endif()
52
53   # To get the export list for a single llvm library:
54   # nm ${LIB_PATH} | awk "/T _LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_PATH}.exports
55
56   set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm.exports)
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     if (LLVM_DYLIB_EXPORT_ALL)
68       add_custom_command(OUTPUT ${LIB_EXPORTS_PATH}
69         COMMAND nm ${LIB_PATH} | awk "/T / { 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     else()
75       add_custom_command(OUTPUT ${LIB_EXPORTS_PATH}
76         COMMAND nm ${LIB_PATH} | awk "/T _LLVM/ || /T LLVM/ { print $3 }" | sort -u | sed -e "s/^_//g" > ${LIB_EXPORTS_PATH}
77         WORKING_DIRECTORY ${LIB_DIR}
78         DEPENDS ${lib}
79         COMMENT "Generating Export list for ${lib}..."
80         VERBATIM )
81     endif()
82   endforeach ()
83
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
90   add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
91 else()
92   set(LLVM_EXPORTED_SYMBOL_FILE ${LLVM_DYLIB_EXPORTED_SYMBOL_FILE})
93   add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
94 endif()
95
96 add_llvm_library(LLVM SHARED ${SOURCES})
97
98 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
99   # GNU ld doesn't resolve symbols in the version script.
100   list(REMOVE_DUPLICATES LIB_NAMES)
101   set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
102 endif()
103
104 target_link_libraries(LLVM PRIVATE ${LIB_NAMES})
105
106 add_dependencies(LLVM libLLVMExports)
107
108 if (APPLE)
109   set_property(TARGET LLVM APPEND_STRING PROPERTY
110               LINK_FLAGS
111               " -compatibility_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
112 endif()
113