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