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 # TODO 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 target_link_libraries(${executable} LLVM) 48 endif() 49 50 explicit_llvm_config(${executable} ${link_components}) 51endmacro(llvm_config) 52 53 54function(explicit_llvm_config executable) 55 set( link_components ${ARGN} ) 56 57 llvm_map_components_to_libnames(LIBRARIES ${link_components}) 58 get_target_property(t ${executable} TYPE) 59 if("x${t}" STREQUAL "xSTATIC_LIBRARY") 60 target_link_libraries(${executable} INTERFACE ${LIBRARIES}) 61 elseif("x${t}" STREQUAL "xSHARED_LIBRARY" OR "x${t}" STREQUAL "xMODULE_LIBRARY") 62 target_link_libraries(${executable} PRIVATE ${LIBRARIES}) 63 else() 64 # Use plain form for legacy user. 65 target_link_libraries(${executable} ${LIBRARIES}) 66 endif() 67endfunction(explicit_llvm_config) 68 69 70# This is Deprecated 71function(llvm_map_components_to_libraries OUT_VAR) 72 message(AUTHOR_WARNING "Using llvm_map_components_to_libraries() is deprecated. Use llvm_map_components_to_libnames() instead") 73 explicit_map_components_to_libraries(result ${ARGN}) 74 set( ${OUT_VAR} ${result} ${sys_result} PARENT_SCOPE ) 75endfunction(llvm_map_components_to_libraries) 76 77# This is a variant intended for the final user: 78# Map LINK_COMPONENTS to actual libnames. 79function(llvm_map_components_to_libnames out_libs) 80 set( link_components ${ARGN} ) 81 if(NOT LLVM_AVAILABLE_LIBS) 82 # Inside LLVM itself available libs are in a global property. 83 get_property(LLVM_AVAILABLE_LIBS GLOBAL PROPERTY LLVM_LIBS) 84 endif() 85 string(TOUPPER "${LLVM_AVAILABLE_LIBS}" capitalized_libs) 86 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") 95 else() 96 list(APPEND link_components "interpreter") 97 endif() 98 endif() 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}) 103 endif() 104 endif() 105 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) 110 if( NOT idx LESS 0 ) 111 if( TARGET LLVM${c}CodeGen ) 112 list(APPEND expanded_components "LLVM${c}CodeGen") 113 else() 114 if( TARGET LLVM${c} ) 115 list(APPEND expanded_components "LLVM${c}") 116 else() 117 message(FATAL_ERROR "Target ${c} is not in the set of libraries.") 118 endif() 119 endif() 120 if( TARGET LLVM${c}AsmPrinter ) 121 list(APPEND expanded_components "LLVM${c}AsmPrinter") 122 endif() 123 if( TARGET LLVM${c}AsmParser ) 124 list(APPEND expanded_components "LLVM${c}AsmParser") 125 endif() 126 if( TARGET LLVM${c}Desc ) 127 list(APPEND expanded_components "LLVM${c}Desc") 128 endif() 129 if( TARGET LLVM${c}Info ) 130 list(APPEND expanded_components "LLVM${c}Info") 131 endif() 132 if( TARGET LLVM${c}Disassembler ) 133 list(APPEND expanded_components "LLVM${c}Disassembler") 134 endif() 135 elseif( c STREQUAL "native" ) 136 # already processed 137 elseif( c STREQUAL "nativecodegen" ) 138 list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen") 139 if( TARGET LLVM${LLVM_NATIVE_ARCH}Desc ) 140 list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}Desc") 141 endif() 142 if( TARGET LLVM${LLVM_NATIVE_ARCH}Info ) 143 list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}Info") 144 endif() 145 elseif( c STREQUAL "backend" ) 146 # same case as in `native'. 147 elseif( c STREQUAL "engine" ) 148 # already processed 149 elseif( c STREQUAL "all" ) 150 list(APPEND expanded_components ${LLVM_AVAILABLE_LIBS}) 151 elseif( c STREQUAL "AllTargetsAsmPrinters" ) 152 # Link all the asm printers from all the targets 153 foreach(t ${LLVM_TARGETS_TO_BUILD}) 154 if( TARGET LLVM${t}AsmPrinter ) 155 list(APPEND expanded_components "LLVM${t}AsmPrinter") 156 endif() 157 endforeach(t) 158 elseif( c STREQUAL "AllTargetsAsmParsers" ) 159 # Link all the asm parsers from all the targets 160 foreach(t ${LLVM_TARGETS_TO_BUILD}) 161 if( TARGET LLVM${t}AsmParser ) 162 list(APPEND expanded_components "LLVM${t}AsmParser") 163 endif() 164 endforeach(t) 165 elseif( c STREQUAL "AllTargetsDescs" ) 166 # Link all the descs from all the targets 167 foreach(t ${LLVM_TARGETS_TO_BUILD}) 168 if( TARGET LLVM${t}Desc ) 169 list(APPEND expanded_components "LLVM${t}Desc") 170 endif() 171 endforeach(t) 172 elseif( c STREQUAL "AllTargetsDisassemblers" ) 173 # Link all the disassemblers from all the targets 174 foreach(t ${LLVM_TARGETS_TO_BUILD}) 175 if( TARGET LLVM${t}Disassembler ) 176 list(APPEND expanded_components "LLVM${t}Disassembler") 177 endif() 178 endforeach(t) 179 elseif( c STREQUAL "AllTargetsInfos" ) 180 # Link all the infos from all the targets 181 foreach(t ${LLVM_TARGETS_TO_BUILD}) 182 if( TARGET LLVM${t}Info ) 183 list(APPEND expanded_components "LLVM${t}Info") 184 endif() 185 endforeach(t) 186 else( NOT idx LESS 0 ) 187 # Canonize the component name: 188 string(TOUPPER "${c}" capitalized) 189 list(FIND capitalized_libs LLVM${capitalized} lib_idx) 190 if( lib_idx LESS 0 ) 191 # The component is unknown. Maybe is an omitted target? 192 is_llvm_target_library(${c} iltl_result) 193 if( NOT iltl_result ) 194 message(FATAL_ERROR "Library `${c}' not found in list of llvm libraries.") 195 endif() 196 else( lib_idx LESS 0 ) 197 list(GET LLVM_AVAILABLE_LIBS ${lib_idx} canonical_lib) 198 list(APPEND expanded_components ${canonical_lib}) 199 endif( lib_idx LESS 0 ) 200 endif( NOT idx LESS 0 ) 201 endforeach(c) 202 203 set(${out_libs} ${expanded_components} PARENT_SCOPE) 204endfunction() 205 206# Perform a post-order traversal of the dependency graph. 207# This duplicates the algorithm used by llvm-config, originally 208# in tools/llvm-config/llvm-config.cpp, function ComputeLibsForComponents. 209function(expand_topologically name required_libs visited_libs) 210 list(FIND visited_libs ${name} found) 211 if( found LESS 0 ) 212 list(APPEND visited_libs ${name}) 213 set(visited_libs ${visited_libs} PARENT_SCOPE) 214 215 get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) 216 foreach( lib_dep ${lib_deps} ) 217 expand_topologically(${lib_dep} "${required_libs}" "${visited_libs}") 218 set(required_libs ${required_libs} PARENT_SCOPE) 219 set(visited_libs ${visited_libs} PARENT_SCOPE) 220 endforeach() 221 222 list(APPEND required_libs ${name}) 223 set(required_libs ${required_libs} PARENT_SCOPE) 224 endif() 225endfunction() 226 227# Expand dependencies while topologically sorting the list of libraries: 228function(llvm_expand_dependencies out_libs) 229 set(expanded_components ${ARGN}) 230 231 set(required_libs) 232 set(visited_libs) 233 foreach( lib ${expanded_components} ) 234 expand_topologically(${lib} "${required_libs}" "${visited_libs}") 235 endforeach() 236 237 list(REVERSE required_libs) 238 set(${out_libs} ${required_libs} PARENT_SCOPE) 239endfunction() 240 241function(explicit_map_components_to_libraries out_libs) 242 llvm_map_components_to_libnames(link_libs ${ARGN}) 243 llvm_expand_dependencies(expanded_components ${link_libs}) 244 # Return just the libraries included in this build: 245 set(result) 246 foreach(c ${expanded_components}) 247 if( TARGET ${c} ) 248 set(result ${result} ${c}) 249 endif() 250 endforeach(c) 251 set(${out_libs} ${result} PARENT_SCOPE) 252endfunction(explicit_map_components_to_libraries) 253