• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1function(get_system_libs return_var)
2  message(AUTHOR_WARNING "get_system_libs no longer needed")
3  set(${return_var} "" PARENT_SCOPE)
4endfunction()
5
6
7function(link_system_libs target)
8  message(AUTHOR_WARNING "link_system_libs no longer needed")
9endfunction()
10
11
12function(is_llvm_target_library library return_var)
13  # Sets variable `return_var' to ON if `library' corresponds to a
14  # LLVM supported target. To OFF if it doesn't.
15  set(${return_var} OFF PARENT_SCOPE)
16  string(TOUPPER "${library}" capitalized_lib)
17  string(TOUPPER "${LLVM_ALL_TARGETS}" targets)
18  foreach(t ${targets})
19    if( capitalized_lib STREQUAL t OR
20        capitalized_lib STREQUAL "LLVM${t}" OR
21        capitalized_lib STREQUAL "LLVM${t}CODEGEN" OR
22        capitalized_lib STREQUAL "LLVM${t}ASMPARSER" OR
23        capitalized_lib STREQUAL "LLVM${t}ASMPRINTER" OR
24        capitalized_lib STREQUAL "LLVM${t}DISASSEMBLER" OR
25        capitalized_lib STREQUAL "LLVM${t}INFO" )
26      set(${return_var} ON PARENT_SCOPE)
27      break()
28    endif()
29  endforeach()
30endfunction(is_llvm_target_library)
31
32
33macro(llvm_config executable)
34  cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN})
35  set(link_components ${ARG_UNPARSED_ARGUMENTS})
36
37  if(USE_SHARED)
38    # If USE_SHARED is specified, then we link against libLLVM,
39    # but also against the component libraries below. This is
40    # done in case libLLVM does not contain all of the components
41    # the target requires.
42    #
43    # Strip LLVM_DYLIB_COMPONENTS out of link_components.
44    # To do this, we need special handling for "all", since that
45    # may imply linking to libraries that are not included in
46    # libLLVM.
47
48    if (DEFINED link_components AND DEFINED LLVM_DYLIB_COMPONENTS)
49      if("${LLVM_DYLIB_COMPONENTS}" STREQUAL "all")
50        set(link_components "")
51      else()
52        list(REMOVE_ITEM link_components ${LLVM_DYLIB_COMPONENTS})
53      endif()
54    endif()
55
56    target_link_libraries(${executable} LLVM)
57  endif()
58
59  explicit_llvm_config(${executable} ${link_components})
60endmacro(llvm_config)
61
62
63function(explicit_llvm_config executable)
64  set( link_components ${ARGN} )
65
66  llvm_map_components_to_libnames(LIBRARIES ${link_components})
67  get_target_property(t ${executable} TYPE)
68  if("x${t}" STREQUAL "xSTATIC_LIBRARY")
69    target_link_libraries(${executable} INTERFACE ${LIBRARIES})
70  elseif("x${t}" STREQUAL "xSHARED_LIBRARY" OR "x${t}" STREQUAL "xMODULE_LIBRARY")
71    target_link_libraries(${executable} PRIVATE ${LIBRARIES})
72  else()
73    # Use plain form for legacy user.
74    target_link_libraries(${executable} ${LIBRARIES})
75  endif()
76endfunction(explicit_llvm_config)
77
78
79# This is Deprecated
80function(llvm_map_components_to_libraries OUT_VAR)
81  message(AUTHOR_WARNING "Using llvm_map_components_to_libraries() is deprecated. Use llvm_map_components_to_libnames() instead")
82  explicit_map_components_to_libraries(result ${ARGN})
83  set( ${OUT_VAR} ${result} ${sys_result} PARENT_SCOPE )
84endfunction(llvm_map_components_to_libraries)
85
86# This is a variant intended for the final user:
87# Map LINK_COMPONENTS to actual libnames.
88function(llvm_map_components_to_libnames out_libs)
89  set( link_components ${ARGN} )
90  if(NOT LLVM_AVAILABLE_LIBS)
91    # Inside LLVM itself available libs are in a global property.
92    get_property(LLVM_AVAILABLE_LIBS GLOBAL PROPERTY LLVM_LIBS)
93  endif()
94  string(TOUPPER "${LLVM_AVAILABLE_LIBS}" capitalized_libs)
95
96  # Expand some keywords:
97  list(FIND LLVM_TARGETS_TO_BUILD "${LLVM_NATIVE_ARCH}" have_native_backend)
98  list(FIND link_components "engine" engine_required)
99  if( NOT engine_required EQUAL -1 )
100    list(FIND LLVM_TARGETS_WITH_JIT "${LLVM_NATIVE_ARCH}" have_jit)
101    if( NOT have_native_backend EQUAL -1 AND NOT have_jit EQUAL -1 )
102      list(APPEND link_components "jit")
103      list(APPEND link_components "native")
104    else()
105      list(APPEND link_components "interpreter")
106    endif()
107  endif()
108  list(FIND link_components "native" native_required)
109  if( NOT native_required EQUAL -1 )
110    if( NOT have_native_backend EQUAL -1 )
111      list(APPEND link_components ${LLVM_NATIVE_ARCH})
112    endif()
113  endif()
114
115  # Translate symbolic component names to real libraries:
116  foreach(c ${link_components})
117    # add codegen, asmprinter, asmparser, disassembler
118    list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
119    if( NOT idx LESS 0 )
120      if( TARGET LLVM${c}CodeGen )
121        list(APPEND expanded_components "LLVM${c}CodeGen")
122      else()
123        if( TARGET LLVM${c} )
124          list(APPEND expanded_components "LLVM${c}")
125        else()
126          message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
127        endif()
128      endif()
129      if( TARGET LLVM${c}AsmPrinter )
130        list(APPEND expanded_components "LLVM${c}AsmPrinter")
131      endif()
132      if( TARGET LLVM${c}AsmParser )
133        list(APPEND expanded_components "LLVM${c}AsmParser")
134      endif()
135      if( TARGET LLVM${c}Desc )
136        list(APPEND expanded_components "LLVM${c}Desc")
137      endif()
138      if( TARGET LLVM${c}Info )
139        list(APPEND expanded_components "LLVM${c}Info")
140      endif()
141      if( TARGET LLVM${c}Disassembler )
142        list(APPEND expanded_components "LLVM${c}Disassembler")
143      endif()
144    elseif( c STREQUAL "native" )
145      # already processed
146    elseif( c STREQUAL "nativecodegen" )
147      list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen")
148      if( TARGET LLVM${LLVM_NATIVE_ARCH}Desc )
149        list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}Desc")
150      endif()
151      if( TARGET LLVM${LLVM_NATIVE_ARCH}Info )
152        list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}Info")
153      endif()
154    elseif( c STREQUAL "backend" )
155      # same case as in `native'.
156    elseif( c STREQUAL "engine" )
157      # already processed
158    elseif( c STREQUAL "all" )
159      list(APPEND expanded_components ${LLVM_AVAILABLE_LIBS})
160    elseif( c STREQUAL "AllTargetsAsmPrinters" )
161      # Link all the asm printers from all the targets
162      foreach(t ${LLVM_TARGETS_TO_BUILD})
163        if( TARGET LLVM${t}AsmPrinter )
164          list(APPEND expanded_components "LLVM${t}AsmPrinter")
165        endif()
166      endforeach(t)
167    elseif( c STREQUAL "AllTargetsAsmParsers" )
168      # Link all the asm parsers from all the targets
169      foreach(t ${LLVM_TARGETS_TO_BUILD})
170        if( TARGET LLVM${t}AsmParser )
171          list(APPEND expanded_components "LLVM${t}AsmParser")
172        endif()
173      endforeach(t)
174    elseif( c STREQUAL "AllTargetsDescs" )
175      # Link all the descs from all the targets
176      foreach(t ${LLVM_TARGETS_TO_BUILD})
177        if( TARGET LLVM${t}Desc )
178          list(APPEND expanded_components "LLVM${t}Desc")
179        endif()
180      endforeach(t)
181    elseif( c STREQUAL "AllTargetsDisassemblers" )
182      # Link all the disassemblers from all the targets
183      foreach(t ${LLVM_TARGETS_TO_BUILD})
184        if( TARGET LLVM${t}Disassembler )
185          list(APPEND expanded_components "LLVM${t}Disassembler")
186        endif()
187      endforeach(t)
188    elseif( c STREQUAL "AllTargetsInfos" )
189      # Link all the infos from all the targets
190      foreach(t ${LLVM_TARGETS_TO_BUILD})
191        if( TARGET LLVM${t}Info )
192          list(APPEND expanded_components "LLVM${t}Info")
193        endif()
194      endforeach(t)
195    else( NOT idx LESS 0 )
196      # Canonize the component name:
197      string(TOUPPER "${c}" capitalized)
198      list(FIND capitalized_libs LLVM${capitalized} lib_idx)
199      if( lib_idx LESS 0 )
200        # The component is unknown. Maybe is an omitted target?
201        is_llvm_target_library(${c} iltl_result)
202        if( NOT iltl_result )
203          message(FATAL_ERROR "Library `${c}' not found in list of llvm libraries.")
204        endif()
205      else( lib_idx LESS 0 )
206        list(GET LLVM_AVAILABLE_LIBS ${lib_idx} canonical_lib)
207        list(APPEND expanded_components ${canonical_lib})
208      endif( lib_idx LESS 0 )
209    endif( NOT idx LESS 0 )
210  endforeach(c)
211
212  set(${out_libs} ${expanded_components} PARENT_SCOPE)
213endfunction()
214
215# Perform a post-order traversal of the dependency graph.
216# This duplicates the algorithm used by llvm-config, originally
217# in tools/llvm-config/llvm-config.cpp, function ComputeLibsForComponents.
218function(expand_topologically name required_libs visited_libs)
219  list(FIND visited_libs ${name} found)
220  if( found LESS 0 )
221    list(APPEND visited_libs ${name})
222    set(visited_libs ${visited_libs} PARENT_SCOPE)
223
224    get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
225    foreach( lib_dep ${lib_deps} )
226      expand_topologically(${lib_dep} "${required_libs}" "${visited_libs}")
227      set(required_libs ${required_libs} PARENT_SCOPE)
228      set(visited_libs ${visited_libs} PARENT_SCOPE)
229    endforeach()
230
231    list(APPEND required_libs ${name})
232    set(required_libs ${required_libs} PARENT_SCOPE)
233  endif()
234endfunction()
235
236# Expand dependencies while topologically sorting the list of libraries:
237function(llvm_expand_dependencies out_libs)
238  set(expanded_components ${ARGN})
239
240  set(required_libs)
241  set(visited_libs)
242  foreach( lib ${expanded_components} )
243    expand_topologically(${lib} "${required_libs}" "${visited_libs}")
244  endforeach()
245
246  list(REVERSE required_libs)
247  set(${out_libs} ${required_libs} PARENT_SCOPE)
248endfunction()
249
250function(explicit_map_components_to_libraries out_libs)
251  llvm_map_components_to_libnames(link_libs ${ARGN})
252  llvm_expand_dependencies(expanded_components ${link_libs})
253  # Return just the libraries included in this build:
254  set(result)
255  foreach(c ${expanded_components})
256    if( TARGET ${c} )
257      set(result ${result} ${c})
258    endif()
259  endforeach(c)
260  set(${out_libs} ${result} PARENT_SCOPE)
261endfunction(explicit_map_components_to_libraries)
262