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