• 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  explicit_llvm_config(${executable} ${ARGN})
35endmacro(llvm_config)
36
37
38function(explicit_llvm_config executable)
39  set( link_components ${ARGN} )
40
41  llvm_map_components_to_libnames(LIBRARIES ${link_components})
42  get_target_property(t ${executable} TYPE)
43  if("${t}" STREQUAL "STATIC_LIBRARY")
44    target_link_libraries(${executable} ${cmake_2_8_12_INTERFACE} ${LIBRARIES})
45  elseif("${t}" STREQUAL "SHARED_LIBRARY" OR "${t}" STREQUAL "MODULE_LIBRARY")
46    target_link_libraries(${executable} ${cmake_2_8_12_PRIVATE} ${LIBRARIES})
47  else()
48    # Use plain form for legacy user.
49    target_link_libraries(${executable} ${LIBRARIES})
50  endif()
51endfunction(explicit_llvm_config)
52
53
54# This is a variant intended for the final user:
55function(llvm_map_components_to_libraries OUT_VAR)
56  explicit_map_components_to_libraries(result ${ARGN})
57  set( ${OUT_VAR} ${result} ${sys_result} PARENT_SCOPE )
58endfunction(llvm_map_components_to_libraries)
59
60# Map LINK_COMPONENTS to actual libnames.
61function(llvm_map_components_to_libnames out_libs)
62  set( link_components ${ARGN} )
63  if(NOT LLVM_AVAILABLE_LIBS)
64    # Inside LLVM itself available libs are in a global property.
65    get_property(LLVM_AVAILABLE_LIBS GLOBAL PROPERTY LLVM_LIBS)
66  endif()
67  string(TOUPPER "${LLVM_AVAILABLE_LIBS}" capitalized_libs)
68
69  # Expand some keywords:
70  list(FIND LLVM_TARGETS_TO_BUILD "${LLVM_NATIVE_ARCH}" have_native_backend)
71  list(FIND link_components "engine" engine_required)
72  if( NOT engine_required EQUAL -1 )
73    list(FIND LLVM_TARGETS_WITH_JIT "${LLVM_NATIVE_ARCH}" have_jit)
74    if( NOT have_native_backend EQUAL -1 AND NOT have_jit EQUAL -1 )
75      list(APPEND link_components "jit")
76      list(APPEND link_components "native")
77    else()
78      list(APPEND link_components "interpreter")
79    endif()
80  endif()
81  list(FIND link_components "native" native_required)
82  if( NOT native_required EQUAL -1 )
83    if( NOT have_native_backend EQUAL -1 )
84      list(APPEND link_components ${LLVM_NATIVE_ARCH})
85    endif()
86  endif()
87
88  # Translate symbolic component names to real libraries:
89  foreach(c ${link_components})
90    # add codegen, asmprinter, asmparser, disassembler
91    list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
92    if( NOT idx LESS 0 )
93      if( TARGET LLVM${c}CodeGen )
94        list(APPEND expanded_components "LLVM${c}CodeGen")
95      else()
96        if( TARGET LLVM${c} )
97          list(APPEND expanded_components "LLVM${c}")
98        else()
99          message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
100        endif()
101      endif()
102      if( TARGET LLVM${c}AsmPrinter )
103        list(APPEND expanded_components "LLVM${c}AsmPrinter")
104      endif()
105      if( TARGET LLVM${c}AsmParser )
106        list(APPEND expanded_components "LLVM${c}AsmParser")
107      endif()
108      if( TARGET LLVM${c}Info )
109        list(APPEND expanded_components "LLVM${c}Info")
110      endif()
111      if( TARGET LLVM${c}Disassembler )
112        list(APPEND expanded_components "LLVM${c}Disassembler")
113      endif()
114    elseif( c STREQUAL "native" )
115      # already processed
116    elseif( c STREQUAL "nativecodegen" )
117      list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen")
118    elseif( c STREQUAL "backend" )
119      # same case as in `native'.
120    elseif( c STREQUAL "engine" )
121      # already processed
122    elseif( c STREQUAL "all" )
123      list(APPEND expanded_components ${LLVM_AVAILABLE_LIBS})
124    else( NOT idx LESS 0 )
125      # Canonize the component name:
126      string(TOUPPER "${c}" capitalized)
127      list(FIND capitalized_libs LLVM${capitalized} lib_idx)
128      if( lib_idx LESS 0 )
129        # The component is unknown. Maybe is an omitted target?
130        is_llvm_target_library(${c} iltl_result)
131        if( NOT iltl_result )
132          message(FATAL_ERROR "Library `${c}' not found in list of llvm libraries.")
133        endif()
134      else( lib_idx LESS 0 )
135        list(GET LLVM_AVAILABLE_LIBS ${lib_idx} canonical_lib)
136        list(APPEND expanded_components ${canonical_lib})
137      endif( lib_idx LESS 0 )
138    endif( NOT idx LESS 0 )
139  endforeach(c)
140
141  set(${out_libs} ${expanded_components} PARENT_SCOPE)
142endfunction()
143
144# Expand dependencies while topologically sorting the list of libraries:
145function(llvm_expand_dependencies out_libs)
146  set(expanded_components ${ARGN})
147  list(LENGTH expanded_components lst_size)
148  set(cursor 0)
149  set(processed)
150  while( cursor LESS lst_size )
151    list(GET expanded_components ${cursor} lib)
152    get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib})
153    list(APPEND expanded_components ${lib_deps})
154    # Remove duplicates at the front:
155    list(REVERSE expanded_components)
156    list(REMOVE_DUPLICATES expanded_components)
157    list(REVERSE expanded_components)
158    list(APPEND processed ${lib})
159    # Find the maximum index that doesn't have to be re-processed:
160    while(NOT "${expanded_components}" MATCHES "^${processed}.*" )
161      list(REMOVE_AT processed -1)
162    endwhile()
163    list(LENGTH processed cursor)
164    list(LENGTH expanded_components lst_size)
165  endwhile( cursor LESS lst_size )
166  set(${out_libs} ${expanded_components} PARENT_SCOPE)
167endfunction()
168
169function(explicit_map_components_to_libraries out_libs)
170  llvm_map_components_to_libnames(link_libs ${ARGN})
171  llvm_expand_dependencies(expanded_components ${link_libs})
172  # Return just the libraries included in this build:
173  set(result)
174  foreach(c ${expanded_components})
175    if( TARGET ${c} )
176      set(result ${result} ${c})
177    endif()
178  endforeach(c)
179  set(${out_libs} ${result} PARENT_SCOPE)
180endfunction(explicit_map_components_to_libraries)
181