CMake: Get rid of LLVMLibDeps.cmake and export the libraries normally.
[oota-llvm.git] / cmake / modules / AddLLVM.cmake
1 include(LLVMProcessSources)
2
3 function(get_system_libs return_var)
4   # Returns in `return_var' a list of system libraries used by LLVM.
5   if( NOT MSVC )
6     if( MINGW )
7       set(system_libs ${system_libs} imagehlp psapi)
8     elseif( CMAKE_HOST_UNIX )
9       if( HAVE_LIBDL )
10         set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
11       endif()
12       if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD )
13         set(system_libs ${system_libs} pthread)
14       endif()
15     endif( MINGW )
16   endif( NOT MSVC )
17   set(${return_var} ${system_libs} PARENT_SCOPE)
18 endfunction(get_system_libs)
19
20 macro(add_llvm_library name)
21   llvm_process_sources( ALL_FILES ${ARGN} )
22   add_library( ${name} ${ALL_FILES} )
23   set( llvm_libs ${llvm_libs} ${name} PARENT_SCOPE)
24   set( llvm_lib_targets ${llvm_lib_targets} ${name} PARENT_SCOPE )
25   if( LLVM_COMMON_DEPENDS )
26     add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
27   endif( LLVM_COMMON_DEPENDS )
28   if (LLVM_COMMON_LIBS)
29     target_link_libraries(${name} ${LLVM_COMMON_LIBS})
30   endif()
31   install(TARGETS ${name}
32     EXPORT LLVM
33     LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
34     ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
35   # The LLVM Target library shall be built before its sublibraries
36   # (asmprinter, etc) because those may use tablegenned files which
37   # generation is triggered by the main LLVM target library. Necessary
38   # for parallel builds:
39   if( CURRENT_LLVM_TARGET )
40     add_dependencies(${name} ${CURRENT_LLVM_TARGET})
41   endif()
42 endmacro(add_llvm_library name)
43
44
45 macro(add_llvm_loadable_module name)
46   if( NOT LLVM_ON_UNIX )
47     message(STATUS "Loadable modules not supported on this platform.
48 ${name} ignored.")
49   else()
50     llvm_process_sources( ALL_FILES ${ARGN} )
51     add_library( ${name} MODULE ${ALL_FILES} )
52     set_target_properties( ${name} PROPERTIES PREFIX "" )
53
54     if (APPLE)
55       # Darwin-specific linker flags for loadable modules.
56       set_target_properties(${name} PROPERTIES
57         LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
58     endif()
59
60     install(TARGETS ${name}
61       EXPORT LLVM
62       LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
63       ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
64   endif()
65 endmacro(add_llvm_loadable_module name)
66
67
68 macro(add_llvm_executable name)
69   llvm_process_sources( ALL_FILES ${ARGN} )
70   if( EXCLUDE_FROM_ALL )
71     add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
72   else()
73     add_executable(${name} ${ALL_FILES})
74   endif()
75   set(EXCLUDE_FROM_ALL OFF)
76   if( LLVM_USED_LIBS )
77     foreach(lib ${LLVM_USED_LIBS})
78       target_link_libraries( ${name} ${lib} )
79     endforeach(lib)
80   endif( LLVM_USED_LIBS )
81   get_system_libs(llvm_system_libs)
82   if( llvm_system_libs )
83     target_link_libraries(${name} ${llvm_system_libs})
84   endif()
85   if( LLVM_COMMON_DEPENDS )
86     add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
87   endif( LLVM_COMMON_DEPENDS )
88   if (LLVM_COMMON_LIBS)
89     target_link_libraries(${name} ${LLVM_COMMON_LIBS})
90   endif()
91 endmacro(add_llvm_executable name)
92
93
94 macro(add_llvm_tool name)
95   set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR})
96   if( NOT LLVM_BUILD_TOOLS )
97     set(EXCLUDE_FROM_ALL ON)
98   endif()
99   add_llvm_executable(${name} ${ARGN})
100   if( LLVM_BUILD_TOOLS )
101     install(TARGETS ${name} RUNTIME DESTINATION bin)
102   endif()
103 endmacro(add_llvm_tool name)
104
105
106 macro(add_llvm_example name)
107 #  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_EXAMPLES_BINARY_DIR})
108   if( NOT LLVM_BUILD_EXAMPLES )
109     set(EXCLUDE_FROM_ALL ON)
110   endif()
111   add_llvm_executable(${name} ${ARGN})
112   if( LLVM_BUILD_EXAMPLES )
113     install(TARGETS ${name} RUNTIME DESTINATION examples)
114   endif()
115 endmacro(add_llvm_example name)
116
117
118 macro(add_llvm_target target_name)
119   if( TABLEGEN_OUTPUT )
120     add_custom_target(${target_name}Table_gen
121       DEPENDS ${TABLEGEN_OUTPUT})
122     add_dependencies(${target_name}Table_gen ${LLVM_COMMON_DEPENDS})
123   endif( TABLEGEN_OUTPUT )
124   include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
125   add_llvm_library(LLVM${target_name} ${ARGN} ${TABLEGEN_OUTPUT})
126   if ( TABLEGEN_OUTPUT )
127     add_dependencies(LLVM${target_name} ${target_name}Table_gen)
128   endif (TABLEGEN_OUTPUT)
129   set(CURRENT_LLVM_TARGET LLVM${target_name} PARENT_SCOPE)
130 endmacro(add_llvm_target)
131
132 macro(llvm_get_target_libraries return_var)
133   set( link_components ${ARGN} )
134   foreach(c ${link_components})
135     # add codegen, asmprinter, asmparser, disassembler
136     list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
137     if( NOT idx LESS 0 )
138       list(FIND llvm_libs "LLVM${c}CodeGen" idx)
139       if( NOT idx LESS 0 )
140         list(APPEND expanded_components "LLVM${c}CodeGen")
141       else()
142         list(FIND llvm_libs "LLVM${c}" idx)
143         if( NOT idx LESS 0 )
144           list(APPEND expanded_components "LLVM${c}")
145         else()
146           message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
147         endif()
148       endif()
149       list(FIND llvm_libs "LLVM${c}AsmPrinter" asmidx)
150       if( NOT asmidx LESS 0 )
151         list(APPEND expanded_components "LLVM${c}AsmPrinter")
152       endif()
153       list(FIND llvm_libs "LLVM${c}AsmParser" asmidx)
154       if( NOT asmidx LESS 0 )
155         list(APPEND expanded_components "LLVM${c}AsmParser")
156       endif()
157       list(FIND llvm_libs "LLVM${c}Info" asmidx)
158       if( NOT asmidx LESS 0 )
159         list(APPEND expanded_components "LLVM${c}Info")
160       endif()
161       list(FIND llvm_libs "LLVM${c}Disassembler" asmidx)
162       if( NOT asmidx LESS 0 )
163         list(APPEND expanded_components "LLVM${c}Disassembler")
164       endif()
165     elseif( c STREQUAL "native" )
166       list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen")
167     elseif( c STREQUAL "nativecodegen" )
168       list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen")
169     elseif( c STREQUAL "backend" )
170       # same case as in `native'.
171     elseif( c STREQUAL "engine" OR c STREQUAL "jit")
172       # TODO: as we assume we are on X86, this is `jit'.
173       list(APPEND expanded_components "LLVMJIT")
174     elseif( c STREQUAL "interpreter" )
175       list(APPEND expanded_components "LLVMInterpreter")
176     elseif( c STREQUAL "all" )
177       list(APPEND expanded_components ${llvm_libs})
178     else( NOT idx LESS 0 )
179       list(APPEND expanded_components LLVM${c})
180     endif( NOT idx LESS 0 )
181   endforeach(c)
182   set(${return_var} ${expanded_components})
183 endmacro(llvm_get_target_libraries)
184
185 macro(add_llvm_link_components target_name)
186   llvm_get_target_libraries(target_libs ${ARGN})
187   target_link_libraries(${target_name} ${target_libs})
188 endmacro()