diff options
Diffstat (limited to 'lib/cmake/llvm/LLVM-Build.cmake')
| -rw-r--r-- | lib/cmake/llvm/LLVM-Build.cmake | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/lib/cmake/llvm/LLVM-Build.cmake b/lib/cmake/llvm/LLVM-Build.cmake new file mode 100644 index 0000000..525186c --- /dev/null +++ b/lib/cmake/llvm/LLVM-Build.cmake @@ -0,0 +1,104 @@ +# Generate C code in the file provided as OUTPUT that describes the properties +# of all components. This C code is suitable for inclusion in `llvm-config` +function(LLVMBuildGenerateCFragment) + cmake_parse_arguments(ARG "" "OUTPUT" "" ${ARGN}) + + # Write C header + ################# + get_property(llvmbuild_components GLOBAL PROPERTY LLVM_COMPONENT_LIBS) + foreach(llvmbuild_component ${llvmbuild_components}) + string(REGEX REPLACE "^LLVM" "" component_name ${llvmbuild_component}) + list(APPEND all_component_libdeps ${component_name}) + endforeach() + list(APPEND llvmbuild_components all) + foreach(llvm_component all-targets Engine Native NativeCodeGen ${LLVM_TARGETS_TO_BUILD}) + list(APPEND llvmbuild_components ${llvm_component}) + list(APPEND all_component_libdeps ${llvm_component}) + endforeach() + + list(LENGTH llvmbuild_components llvmbuild_components_size) + file(WRITE ${ARG_OUTPUT} + " + struct AvailableComponent { + /// The name of the component. + const char *Name; + + /// The name of the library for this component (or NULL). + const char *Library; + + /// Whether the component is installed. + bool IsInstalled; + + /// The list of libraries required when linking this component. + const char *RequiredLibraries[${llvmbuild_components_size}]; + } AvailableComponents[${llvmbuild_components_size}] = { + ") + + foreach(llvmbuild_component ${llvmbuild_components}) + if(llvmbuild_component STREQUAL "all") + unset(llvmbuild_libname) + set(llvmbuild_libdeps ${all_component_libdeps}) + else() + get_property(llvmbuild_libname TARGET ${llvmbuild_component} PROPERTY LLVM_COMPONENT_NAME) + get_property(llvmbuild_libdeps TARGET ${llvmbuild_component} PROPERTY LLVM_LINK_COMPONENTS) + endif() + string(TOLOWER ${llvmbuild_component} llvmbuild_componentname) + + if(NOT llvmbuild_libname) + set(llvmbuild_llvmlibname nullptr) + string(TOLOWER ${llvmbuild_component} llvmbuild_libname) + else() + set(llvmbuild_llvmlibname "\"LLVM${llvmbuild_libname}\"") + string(TOLOWER ${llvmbuild_libname} llvmbuild_libname) + endif() + + set(llvmbuild_clibdeps "") + foreach(llvmbuild_libdep ${llvmbuild_libdeps}) + get_property(llvmbuild_libdepname GLOBAL PROPERTY LLVM_COMPONENT_NAME_${llvmbuild_libdep}) + if(NOT llvmbuild_libdepname) + string(TOLOWER ${llvmbuild_libdep} llvmbuild_clibdep) + else() + string(TOLOWER ${llvmbuild_libdepname} llvmbuild_clibdep) + endif() + list(APPEND llvmbuild_clibdeps ${llvmbuild_clibdep}) + endforeach() + + list(TRANSFORM llvmbuild_clibdeps PREPEND "\"") + list(TRANSFORM llvmbuild_clibdeps APPEND "\"") + list(JOIN llvmbuild_clibdeps ", " llvmbuild_clibdeps_joint) + list(APPEND llvmbuild_centries "{ \"${llvmbuild_libname}\", ${llvmbuild_llvmlibname}, true, {${llvmbuild_clibdeps_joint}} },\n") + endforeach() + + list(SORT llvmbuild_centries) + foreach(llvmbuild_centry ${llvmbuild_centries}) + file(APPEND ${ARG_OUTPUT} "${llvmbuild_centry}") + endforeach() + file(APPEND ${ARG_OUTPUT} "};") +endfunction() + +# Resolve cross-component dependencies, for each available component. +function(LLVMBuildResolveComponentsLink) + + # the native target may not be enabled when cross compiling + if(TARGET ${LLVM_NATIVE_ARCH}) + get_property(llvm_has_jit_native TARGET ${LLVM_NATIVE_ARCH} PROPERTY LLVM_HAS_JIT) + else() + set(llvm_has_jit_native OFF) + endif() + + if(llvm_has_jit_native) + set_property(TARGET Engine APPEND PROPERTY LLVM_LINK_COMPONENTS "MCJIT" "Native") + else() + set_property(TARGET Engine APPEND PROPERTY LLVM_LINK_COMPONENTS "Interpreter") + endif() + + get_property(llvm_components GLOBAL PROPERTY LLVM_COMPONENT_LIBS) + foreach(llvm_component ${llvm_components}) + get_property(link_components TARGET ${llvm_component} PROPERTY LLVM_LINK_COMPONENTS) + llvm_map_components_to_libnames(llvm_libs ${link_components}) + if(llvm_libs) + get_property(libtype TARGET ${llvm_component} PROPERTY LLVM_LIBTYPE) + target_link_libraries(${llvm_component} ${libtype} ${llvm_libs}) + endif() + endforeach() +endfunction() |
