105 lines · plain
1# Generate C code in the file provided as OUTPUT that describes the properties2# 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 header7 #################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 compiling83 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