1 function(get_system_libs return_var)
2 # Returns in `return_var' a list of system libraries used by LLVM.
5 set(system_libs ${system_libs} imagehlp psapi)
6 elseif( CMAKE_HOST_UNIX )
8 set(system_libs ${system_libs} rt)
11 set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
13 if(LLVM_ENABLE_CURSES)
15 set(system_libs ${system_libs} ncursesw)
17 set(system_libs ${system_libs} ncurses)
19 set(system_libs ${system_libs} curses)
22 if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD )
23 set(system_libs ${system_libs} pthread)
25 if ( LLVM_ENABLE_ZLIB AND HAVE_LIBZ )
26 set(system_libs ${system_libs} z)
30 set(${return_var} ${system_libs} PARENT_SCOPE)
31 endfunction(get_system_libs)
34 function(link_system_libs target)
35 get_system_libs(llvm_system_libs)
36 target_link_libraries(${target} ${llvm_system_libs})
37 endfunction(link_system_libs)
40 function(is_llvm_target_library library return_var)
41 # Sets variable `return_var' to ON if `library' corresponds to a
42 # LLVM supported target. To OFF if it doesn't.
43 set(${return_var} OFF PARENT_SCOPE)
44 string(TOUPPER "${library}" capitalized_lib)
45 string(TOUPPER "${LLVM_ALL_TARGETS}" targets)
47 if( capitalized_lib STREQUAL t OR
48 capitalized_lib STREQUAL "LLVM${t}" OR
49 capitalized_lib STREQUAL "LLVM${t}CODEGEN" OR
50 capitalized_lib STREQUAL "LLVM${t}ASMPARSER" OR
51 capitalized_lib STREQUAL "LLVM${t}ASMPRINTER" OR
52 capitalized_lib STREQUAL "LLVM${t}DISASSEMBLER" OR
53 capitalized_lib STREQUAL "LLVM${t}INFO" )
54 set(${return_var} ON PARENT_SCOPE)
58 endfunction(is_llvm_target_library)
61 macro(llvm_config executable)
62 explicit_llvm_config(${executable} ${ARGN})
66 function(explicit_llvm_config executable)
67 set( link_components ${ARGN} )
69 explicit_map_components_to_libraries(LIBRARIES ${link_components})
70 target_link_libraries(${executable} ${LIBRARIES})
71 endfunction(explicit_llvm_config)
74 # This is a variant intended for the final user:
75 function(llvm_map_components_to_libraries OUT_VAR)
76 explicit_map_components_to_libraries(result ${ARGN})
77 get_system_libs(sys_result)
78 set( ${OUT_VAR} ${result} ${sys_result} PARENT_SCOPE )
79 endfunction(llvm_map_components_to_libraries)
82 function(explicit_map_components_to_libraries out_libs)
83 set( link_components ${ARGN} )
84 get_property(llvm_libs GLOBAL PROPERTY LLVM_LIBS)
85 string(TOUPPER "${llvm_libs}" capitalized_libs)
87 # Expand some keywords:
88 list(FIND LLVM_TARGETS_TO_BUILD "${LLVM_NATIVE_ARCH}" have_native_backend)
89 list(FIND link_components "engine" engine_required)
90 if( NOT engine_required EQUAL -1 )
91 list(FIND LLVM_TARGETS_WITH_JIT "${LLVM_NATIVE_ARCH}" have_jit)
92 if( NOT have_native_backend EQUAL -1 AND NOT have_jit EQUAL -1 )
93 list(APPEND link_components "jit")
94 list(APPEND link_components "native")
96 list(APPEND link_components "interpreter")
99 list(FIND link_components "native" native_required)
100 if( NOT native_required EQUAL -1 )
101 if( NOT have_native_backend EQUAL -1 )
102 list(APPEND link_components ${LLVM_NATIVE_ARCH})
106 # Translate symbolic component names to real libraries:
107 foreach(c ${link_components})
108 # add codegen, asmprinter, asmparser, disassembler
109 list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
111 list(FIND llvm_libs "LLVM${c}CodeGen" idx)
113 list(APPEND expanded_components "LLVM${c}CodeGen")
115 list(FIND llvm_libs "LLVM${c}" idx)
117 list(APPEND expanded_components "LLVM${c}")
119 message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
122 list(FIND llvm_libs "LLVM${c}AsmPrinter" asmidx)
123 if( NOT asmidx LESS 0 )
124 list(APPEND expanded_components "LLVM${c}AsmPrinter")
126 list(FIND llvm_libs "LLVM${c}AsmParser" asmidx)
127 if( NOT asmidx LESS 0 )
128 list(APPEND expanded_components "LLVM${c}AsmParser")
130 list(FIND llvm_libs "LLVM${c}Info" asmidx)
131 if( NOT asmidx LESS 0 )
132 list(APPEND expanded_components "LLVM${c}Info")
134 list(FIND llvm_libs "LLVM${c}Disassembler" asmidx)
135 if( NOT asmidx LESS 0 )
136 list(APPEND expanded_components "LLVM${c}Disassembler")
138 elseif( c STREQUAL "native" )
140 elseif( c STREQUAL "nativecodegen" )
141 list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen")
142 elseif( c STREQUAL "backend" )
143 # same case as in `native'.
144 elseif( c STREQUAL "engine" )
146 elseif( c STREQUAL "all" )
147 list(APPEND expanded_components ${llvm_libs})
148 else( NOT idx LESS 0 )
149 # Canonize the component name:
150 string(TOUPPER "${c}" capitalized)
151 list(FIND capitalized_libs LLVM${capitalized} lib_idx)
153 # The component is unknown. Maybe is an omitted target?
154 is_llvm_target_library(${c} iltl_result)
155 if( NOT iltl_result )
156 message(FATAL_ERROR "Library `${c}' not found in list of llvm libraries.")
158 else( lib_idx LESS 0 )
159 list(GET llvm_libs ${lib_idx} canonical_lib)
160 list(APPEND expanded_components ${canonical_lib})
161 endif( lib_idx LESS 0 )
162 endif( NOT idx LESS 0 )
164 # Expand dependencies while topologically sorting the list of libraries:
165 list(LENGTH expanded_components lst_size)
168 while( cursor LESS lst_size )
169 list(GET expanded_components ${cursor} lib)
170 get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib})
171 list(APPEND expanded_components ${lib_deps})
172 # Remove duplicates at the front:
173 list(REVERSE expanded_components)
174 list(REMOVE_DUPLICATES expanded_components)
175 list(REVERSE expanded_components)
176 list(APPEND processed ${lib})
177 # Find the maximum index that doesn't have to be re-processed:
178 while(NOT "${expanded_components}" MATCHES "^${processed}.*" )
179 list(REMOVE_AT processed -1)
181 list(LENGTH processed cursor)
182 list(LENGTH expanded_components lst_size)
183 endwhile( cursor LESS lst_size )
184 # Return just the libraries included in this build:
186 foreach(c ${expanded_components})
187 list(FIND llvm_libs ${c} lib_idx)
188 if( NOT lib_idx LESS 0 )
189 set(result ${result} ${c})
192 set(${out_libs} ${result} PARENT_SCOPE)
193 endfunction(explicit_map_components_to_libraries)