1# Generate C code in the file provided as OUTPUT that describes the properties 2# of all components. This C code is suitable for inclusion in `llvm-config` 3function(LLVMBuildGenerateCFragment) 4 cmake_parse_arguments(ARG "" "OUTPUT" "" ${ARGN}) 5 6 # Write C header 7 ################# 8 get_property(llvmbuild_components GLOBAL PROPERTY LLVM_COMPONENT_LIBS) 9 foreach(llvmbuild_component ${llvmbuild_components}) 10 string(REGEX REPLACE "^LLVM" "" component_name ${llvmbuild_component}) 11 list(APPEND all_component_libdeps ${component_name}) 12 endforeach() 13 list(APPEND llvmbuild_components all) 14 foreach(llvm_component all-targets Engine Native NativeCodeGen ${LLVM_TARGETS_TO_BUILD}) 15 list(APPEND llvmbuild_components ${llvm_component}) 16 list(APPEND all_component_libdeps ${llvm_component}) 17 endforeach() 18 19 list(LENGTH llvmbuild_components llvmbuild_components_size) 20 file(WRITE ${ARG_OUTPUT} 21 " 22 struct AvailableComponent { 23 /// The name of the component. 24 const char *Name; 25 26 /// The name of the library for this component (or NULL). 27 const char *Library; 28 29 /// Whether the component is installed. 30 bool IsInstalled; 31 32 /// The list of libraries required when linking this component. 33 const char *RequiredLibraries[${llvmbuild_components_size}]; 34 } AvailableComponents[${llvmbuild_components_size}] = { 35 ") 36 37 foreach(llvmbuild_component ${llvmbuild_components}) 38 if(llvmbuild_component STREQUAL "all") 39 unset(llvmbuild_libname) 40 set(llvmbuild_libdeps ${all_component_libdeps}) 41 else() 42 get_property(llvmbuild_libname TARGET ${llvmbuild_component} PROPERTY LLVM_COMPONENT_NAME) 43 get_property(llvmbuild_libdeps TARGET ${llvmbuild_component} PROPERTY LLVM_LINK_COMPONENTS) 44 endif() 45 string(TOLOWER ${llvmbuild_component} llvmbuild_componentname) 46 47 if(NOT llvmbuild_libname) 48 set(llvmbuild_llvmlibname nullptr) 49 string(TOLOWER ${llvmbuild_component} llvmbuild_libname) 50 else() 51 set(llvmbuild_llvmlibname "\"LLVM${llvmbuild_libname}\"") 52 string(TOLOWER ${llvmbuild_libname} llvmbuild_libname) 53 endif() 54 55 set(llvmbuild_clibdeps "") 56 foreach(llvmbuild_libdep ${llvmbuild_libdeps}) 57 get_property(llvmbuild_libdepname GLOBAL PROPERTY LLVM_COMPONENT_NAME_${llvmbuild_libdep}) 58 if(NOT llvmbuild_libdepname) 59 string(TOLOWER ${llvmbuild_libdep} llvmbuild_clibdep) 60 else() 61 string(TOLOWER ${llvmbuild_libdepname} llvmbuild_clibdep) 62 endif() 63 list(APPEND llvmbuild_clibdeps ${llvmbuild_clibdep}) 64 endforeach() 65 66 list(TRANSFORM llvmbuild_clibdeps PREPEND "\"") 67 list(TRANSFORM llvmbuild_clibdeps APPEND "\"") 68 list(JOIN llvmbuild_clibdeps ", " llvmbuild_clibdeps_joint) 69 list(APPEND llvmbuild_centries "{ \"${llvmbuild_libname}\", ${llvmbuild_llvmlibname}, true, {${llvmbuild_clibdeps_joint}} },\n") 70 endforeach() 71 72 list(SORT llvmbuild_centries) 73 foreach(llvmbuild_centry ${llvmbuild_centries}) 74 file(APPEND ${ARG_OUTPUT} "${llvmbuild_centry}") 75 endforeach() 76 file(APPEND ${ARG_OUTPUT} "};") 77endfunction() 78 79# Resolve cross-component dependencies, for each available component. 80function(LLVMBuildResolveComponentsLink) 81 82 # the native target may not be enabled when cross compiling 83 if(TARGET ${LLVM_NATIVE_ARCH}) 84 get_property(llvm_has_jit_native TARGET ${LLVM_NATIVE_ARCH} PROPERTY LLVM_HAS_JIT) 85 else() 86 set(llvm_has_jit_native OFF) 87 endif() 88 89 if(llvm_has_jit_native) 90 set_property(TARGET Engine APPEND PROPERTY LLVM_LINK_COMPONENTS "MCJIT" "Native") 91 else() 92 set_property(TARGET Engine APPEND PROPERTY LLVM_LINK_COMPONENTS "Interpreter") 93 endif() 94 95 get_property(llvm_components GLOBAL PROPERTY LLVM_COMPONENT_LIBS) 96 foreach(llvm_component ${llvm_components}) 97 get_property(link_components TARGET ${llvm_component} PROPERTY LLVM_LINK_COMPONENTS) 98 llvm_map_components_to_libnames(llvm_libs ${link_components}) 99 if(llvm_libs) 100 get_property(libtype TARGET ${llvm_component} PROPERTY LLVM_LIBTYPE) 101 target_link_libraries(${llvm_component} ${libtype} ${llvm_libs}) 102 endif() 103 endforeach() 104endfunction() 105