X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cmake%2Fmodules%2FLLVM-Config.cmake;h=22ac71451917a21d0703b4b828ba7a5900cf216d;hb=ce0f2eda634b7d4495af6b962d56df81c1c66dff;hp=451fc56c6bfafb14a4d75c454e2f14a187b4b20c;hpb=043cc54d6c9dedaa6e5316fe5be02f97f16d5d2b;p=oota-llvm.git diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake index 451fc56c6bf..22ac7145191 100644 --- a/cmake/modules/LLVM-Config.cmake +++ b/cmake/modules/LLVM-Config.cmake @@ -39,16 +39,26 @@ function(explicit_llvm_config executable) set( link_components ${ARGN} ) llvm_map_components_to_libnames(LIBRARIES ${link_components}) - target_link_libraries(${executable} ${LIBRARIES}) + get_target_property(t ${executable} TYPE) + if("x${t}" STREQUAL "xSTATIC_LIBRARY") + target_link_libraries(${executable} INTERFACE ${LIBRARIES}) + elseif("x${t}" STREQUAL "xSHARED_LIBRARY" OR "x${t}" STREQUAL "xMODULE_LIBRARY") + target_link_libraries(${executable} PRIVATE ${LIBRARIES}) + else() + # Use plain form for legacy user. + target_link_libraries(${executable} ${LIBRARIES}) + endif() endfunction(explicit_llvm_config) -# This is a variant intended for the final user: +# This is Deprecated function(llvm_map_components_to_libraries OUT_VAR) + message(AUTHOR_WARNING "Using llvm_map_components_to_libraries() is deprecated. Use llvm_map_components_to_libnames() instead") explicit_map_components_to_libraries(result ${ARGN}) set( ${OUT_VAR} ${result} ${sys_result} PARENT_SCOPE ) endfunction(llvm_map_components_to_libraries) +# This is a variant intended for the final user: # Map LINK_COMPONENTS to actual libnames. function(llvm_map_components_to_libnames out_libs) set( link_components ${ARGN} ) @@ -97,6 +107,9 @@ function(llvm_map_components_to_libnames out_libs) if( TARGET LLVM${c}AsmParser ) list(APPEND expanded_components "LLVM${c}AsmParser") endif() + if( TARGET LLVM${c}Desc ) + list(APPEND expanded_components "LLVM${c}Desc") + endif() if( TARGET LLVM${c}Info ) list(APPEND expanded_components "LLVM${c}Info") endif() @@ -107,12 +120,53 @@ function(llvm_map_components_to_libnames out_libs) # already processed elseif( c STREQUAL "nativecodegen" ) list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen") + if( TARGET LLVM${LLVM_NATIVE_ARCH}Desc ) + list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}Desc") + endif() + if( TARGET LLVM${LLVM_NATIVE_ARCH}Info ) + list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}Info") + endif() elseif( c STREQUAL "backend" ) # same case as in `native'. elseif( c STREQUAL "engine" ) # already processed elseif( c STREQUAL "all" ) list(APPEND expanded_components ${LLVM_AVAILABLE_LIBS}) + elseif( c STREQUAL "AllTargetsAsmPrinters" ) + # Link all the asm printers from all the targets + foreach(t ${LLVM_TARGETS_TO_BUILD}) + if( TARGET LLVM${t}AsmPrinter ) + list(APPEND expanded_components "LLVM${t}AsmPrinter") + endif() + endforeach(t) + elseif( c STREQUAL "AllTargetsAsmParsers" ) + # Link all the asm parsers from all the targets + foreach(t ${LLVM_TARGETS_TO_BUILD}) + if( TARGET LLVM${t}AsmParser ) + list(APPEND expanded_components "LLVM${t}AsmParser") + endif() + endforeach(t) + elseif( c STREQUAL "AllTargetsDescs" ) + # Link all the descs from all the targets + foreach(t ${LLVM_TARGETS_TO_BUILD}) + if( TARGET LLVM${t}Desc ) + list(APPEND expanded_components "LLVM${t}Desc") + endif() + endforeach(t) + elseif( c STREQUAL "AllTargetsDisassemblers" ) + # Link all the disassemblers from all the targets + foreach(t ${LLVM_TARGETS_TO_BUILD}) + if( TARGET LLVM${t}Disassembler ) + list(APPEND expanded_components "LLVM${t}Disassembler") + endif() + endforeach(t) + elseif( c STREQUAL "AllTargetsInfos" ) + # Link all the infos from all the targets + foreach(t ${LLVM_TARGETS_TO_BUILD}) + if( TARGET LLVM${t}Info ) + list(APPEND expanded_components "LLVM${t}Info") + endif() + endforeach(t) else( NOT idx LESS 0 ) # Canonize the component name: string(TOUPPER "${c}" capitalized) @@ -133,29 +187,39 @@ function(llvm_map_components_to_libnames out_libs) set(${out_libs} ${expanded_components} PARENT_SCOPE) endfunction() +# Perform a post-order traversal of the dependency graph. +# This duplicates the algorithm used by llvm-config, originally +# in tools/llvm-config/llvm-config.cpp, function ComputeLibsForComponents. +function(expand_topologically name required_libs visited_libs) + list(FIND visited_libs ${name} found) + if( found LESS 0 ) + list(APPEND visited_libs ${name}) + set(visited_libs ${visited_libs} PARENT_SCOPE) + + get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) + foreach( lib_dep ${lib_deps} ) + expand_topologically(${lib_dep} "${required_libs}" "${visited_libs}") + set(required_libs ${required_libs} PARENT_SCOPE) + set(visited_libs ${visited_libs} PARENT_SCOPE) + endforeach() + + list(APPEND required_libs ${name}) + set(required_libs ${required_libs} PARENT_SCOPE) + endif() +endfunction() + # Expand dependencies while topologically sorting the list of libraries: function(llvm_expand_dependencies out_libs) set(expanded_components ${ARGN}) - list(LENGTH expanded_components lst_size) - set(cursor 0) - set(processed) - while( cursor LESS lst_size ) - list(GET expanded_components ${cursor} lib) - get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib}) - list(APPEND expanded_components ${lib_deps}) - # Remove duplicates at the front: - list(REVERSE expanded_components) - list(REMOVE_DUPLICATES expanded_components) - list(REVERSE expanded_components) - list(APPEND processed ${lib}) - # Find the maximum index that doesn't have to be re-processed: - while(NOT "${expanded_components}" MATCHES "^${processed}.*" ) - list(REMOVE_AT processed -1) - endwhile() - list(LENGTH processed cursor) - list(LENGTH expanded_components lst_size) - endwhile( cursor LESS lst_size ) - set(${out_libs} ${expanded_components} PARENT_SCOPE) + + set(required_libs) + set(visited_libs) + foreach( lib ${expanded_components} ) + expand_topologically(${lib} "${required_libs}" "${visited_libs}") + endforeach() + + list(REVERSE required_libs) + set(${out_libs} ${required_libs} PARENT_SCOPE) endfunction() function(explicit_map_components_to_libraries out_libs)