diff --git a/cmake/Modules/FindClang.cmake b/cmake/Modules/FindClang.cmake new file mode 100644 index 000000000..a95a8c903 --- /dev/null +++ b/cmake/Modules/FindClang.cmake @@ -0,0 +1,82 @@ +# Copyright (c) 2016 Andrew Kelley +# This file is MIT licensed. +# See http://opensource.org/licenses/MIT + +# CLANG_FOUND +# CLANG_INCLUDE_DIRS +# CLANG_LIBRARIES +# CLANG_LIBDIRS + +find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h + HINTS ${LLVM_INCLUDE_DIRS} + # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH } + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH +) + +if(${LLVM_LINK_MODE} STREQUAL "shared") + find_library(CLANG_LIBRARIES + NAMES + libclang-cpp.so.19 + libclang-cpp.so.19.1 + clang-cpp-19.0 + clang-cpp190 + clang-cpp + NAMES_PER_DIR + HINTS "${LLVM_LIBDIRS}" + # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH } + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH + ) +else() + macro(FIND_AND_ADD_CLANG_LIB _libname_) + string(TOUPPER ${_libname_} _prettylibname_) + find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} NAMES_PER_DIR + HINTS "${LLVM_LIBDIRS}" + # Only look for Clang next to LLVM or in { CMAKE_PREFIX_PATH, CMAKE_LIBRARY_PATH, CMAKE_FRAMEWORK_PATH } + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH + ) + if(CLANG_${_prettylibname_}_LIB) + set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB}) + endif() + endmacro(FIND_AND_ADD_CLANG_LIB) + + FIND_AND_ADD_CLANG_LIB(clangFrontendTool) + FIND_AND_ADD_CLANG_LIB(clangCodeGen) + FIND_AND_ADD_CLANG_LIB(clangFrontend) + FIND_AND_ADD_CLANG_LIB(clangDriver) + FIND_AND_ADD_CLANG_LIB(clangSerialization) + FIND_AND_ADD_CLANG_LIB(clangSema) + FIND_AND_ADD_CLANG_LIB(clangStaticAnalyzerFrontend) + FIND_AND_ADD_CLANG_LIB(clangStaticAnalyzerCheckers) + FIND_AND_ADD_CLANG_LIB(clangStaticAnalyzerCore) + FIND_AND_ADD_CLANG_LIB(clangAnalysis) + FIND_AND_ADD_CLANG_LIB(clangASTMatchers) + FIND_AND_ADD_CLANG_LIB(clangAST) + FIND_AND_ADD_CLANG_LIB(clangParse) + FIND_AND_ADD_CLANG_LIB(clangSema) + FIND_AND_ADD_CLANG_LIB(clangAPINotes) + FIND_AND_ADD_CLANG_LIB(clangBasic) + FIND_AND_ADD_CLANG_LIB(clangEdit) + FIND_AND_ADD_CLANG_LIB(clangLex) + FIND_AND_ADD_CLANG_LIB(clangARCMigrate) + FIND_AND_ADD_CLANG_LIB(clangRewriteFrontend) + FIND_AND_ADD_CLANG_LIB(clangRewrite) + FIND_AND_ADD_CLANG_LIB(clangCrossTU) + FIND_AND_ADD_CLANG_LIB(clangIndex) + FIND_AND_ADD_CLANG_LIB(clangToolingCore) + FIND_AND_ADD_CLANG_LIB(clangExtractAPI) + FIND_AND_ADD_CLANG_LIB(clangSupport) + FIND_AND_ADD_CLANG_LIB(clangInstallAPI) + FIND_AND_ADD_CLANG_LIB(clangAST) +endif() + +if (MSVC) + set(CLANG_LIBRARIES ${CLANG_LIBRARIES} "version.lib") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(clang DEFAULT_MSG CLANG_LIBRARIES CLANG_INCLUDE_DIRS) + +mark_as_advanced(CLANG_INCLUDE_DIRS CLANG_LIBRARIES CLANG_LIBDIRS) diff --git a/cmake/Modules/FindLLVM.cmake b/cmake/Modules/FindLLVM.cmake index baebcd3ec..5bc874ec4 100644 --- a/cmake/Modules/FindLLVM.cmake +++ b/cmake/Modules/FindLLVM.cmake @@ -1,202 +1,388 @@ -# Code taken from LDC – the LLVM-based D Compiler -# https://github.com/ldc-developers/ldc -# -# - Find LLVM headers and libraries. -# This module locates LLVM and adapts the llvm-config output for use with -# CMake. -# -# A given list of COMPONENTS is passed to llvm-config. -# -# The following variables are defined: -# LLVM_FOUND - true if LLVM was found -# LLVM_CXXFLAGS - C++ compiler flags for files that include LLVM headers. -# LLVM_ENABLE_ASSERTIONS - Whether LLVM was built with enabled assertions (ON/OFF). -# LLVM_INCLUDE_DIRS - Directory containing LLVM include files. -# LLVM_IS_SHARED - Whether LLVM is going to be linked dynamically (ON) or statically (OFF). -# LLVM_LDFLAGS - Linker flags to add when linking against LLVM -# (includes -LLLVM_LIBRARY_DIRS). -# LLVM_LIBRARIES - Full paths to the library files to link against. -# LLVM_LIBRARY_DIRS - Directory containing LLVM libraries. -# LLVM_NATIVE_ARCH - Backend corresponding to LLVM_HOST_TARGET, e.g., -# X86 for x86_64 and i686 hosts. -# LLVM_ROOT_DIR - The root directory of the LLVM installation. -# llvm-config is searched for in ${LLVM_ROOT_DIR}/bin. -# LLVM_TARGETS_TO_BUILD - List of built LLVM targets. -# LLVM_VERSION_MAJOR - Major version of LLVM. -# LLVM_VERSION_MINOR - Minor version of LLVM. -# LLVM_VERSION_STRING - Full LLVM version string (e.g. 6.0.0svn). -# LLVM_VERSION_BASE_STRING - Base LLVM version string without git/svn suffix (e.g. 6.0.0). -# -# Note: The variable names were chosen in conformance with the offical CMake -# guidelines, see ${CMAKE_ROOT}/Modules/readme.txt. +# Copyright (c) 2014 Andrew Kelley +# This file is MIT licensed. +# See http://opensource.org/licenses/MIT -# Try suffixed versions to pick up the newest LLVM install available on Debian -# derivatives. -# We also want an user-specified LLVM_ROOT_DIR to take precedence over the -# system default locations such as /usr/local/bin. Executing find_program() -# multiples times is the approach recommended in the docs. -set(llvm_config_names llvm-config-18.1 llvm-config181 llvm-config-18 - llvm-config-17.0 llvm-config170 llvm-config-17 - llvm-config-16.0 llvm-config160 llvm-config-16 - llvm-config-15.0 llvm-config150 llvm-config-15 - llvm-config) -find_program(LLVM_CONFIG - NAMES ${llvm_config_names} - PATHS ${LLVM_ROOT_DIR}/bin NO_DEFAULT_PATH - DOC "Path to llvm-config tool.") -find_program(LLVM_CONFIG NAMES ${llvm_config_names}) -if(APPLE) - # extra fallbacks for MacPorts & Homebrew - find_program(LLVM_CONFIG - NAMES ${llvm_config_names} - PATHS /opt/local/libexec/llvm-18/bin /opt/local/libexec/llvm-17/bin - /opt/local/libexec/llvm-16/bin /opt/local/libexec/llvm-15/bin - /opt/local/libexec/llvm/bin - /usr/local/opt/llvm@18/bin /usr/local/opt/llvm@17/bin - /usr/local/opt/llvm@16/bin /usr/local/opt/llvm@15/bin - /usr/local/opt/llvm/bin - NO_DEFAULT_PATH) -endif() +# LLVM_FOUND +# LLVM_INCLUDE_DIRS +# LLVM_LIBRARIES +# LLVM_LIBDIRS +# LLVM_LINK_MODE -# Prints a warning/failure message depending on the required/quiet flags. Copied -# from FindPackageHandleStandardArgs.cmake because it doesn't seem to be exposed. -macro(_LLVM_FAIL _msg) - if(LLVM_FIND_REQUIRED) - message(FATAL_ERROR "${_msg}") - else() - if(NOT LLVM_FIND_QUIETLY) - message(WARNING "${_msg}") + +if(ZIG_USE_LLVM_CONFIG) + set(LLVM_CONFIG_ERROR_MESSAGES "") + while(1) + # If this variable is not unset, the same result is returned even though + # the ignore list has changed, causing the configure process to not + # terminate when the right LLVM version is not found. + unset(LLVM_CONFIG_EXE CACHE) + find_program(LLVM_CONFIG_EXE + NAMES llvm-config-19 llvm-config-19.0 llvm-config190 llvm-config19 llvm-config NAMES_PER_DIR + PATHS + "/mingw64/bin" + "/c/msys64/mingw64/bin" + "c:/msys64/mingw64/bin" + "C:/Libraries/llvm-19.0.0/bin") + + if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND") + if (NOT LLVM_CONFIG_ERROR_MESSAGES STREQUAL "") + list(JOIN LLVM_CONFIG_ERROR_MESSAGES "\n" LLVM_CONFIG_ERROR_MESSAGE) + message(FATAL_ERROR ${LLVM_CONFIG_ERROR_MESSAGE}) + else() + message(FATAL_ERROR "unable to find llvm-config") + endif() endif() - endif() -endmacro() + # Check that this LLVM is the right version + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --version + OUTPUT_VARIABLE LLVM_CONFIG_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) -if(NOT LLVM_CONFIG) - if(NOT LLVM_FIND_QUIETLY) - _LLVM_FAIL("No LLVM installation (>= ${LLVM_FIND_VERSION}) found. Try manually setting the 'LLVM_ROOT_DIR' or 'LLVM_CONFIG' variables.") + get_filename_component(LLVM_CONFIG_DIR "${LLVM_CONFIG_EXE}" DIRECTORY) + if("${LLVM_CONFIG_VERSION}" VERSION_LESS 19 OR "${LLVM_CONFIG_VERSION}" VERSION_EQUAL 20 OR "${LLVM_CONFIG_VERSION}" VERSION_GREATER 20) + # Save the error message, in case this is the last llvm-config we find + list(APPEND LLVM_CONFIG_ERROR_MESSAGES "expected LLVM 19.x but found ${LLVM_CONFIG_VERSION} using ${LLVM_CONFIG_EXE}") + + # Ignore this directory and try the search again + list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}") + continue() endif() -else() - macro(llvm_set var flag) - if(LLVM_FIND_QUIETLY) - set(_quiet_arg ERROR_QUIET) - endif() - set(result_code) - execute_process( - COMMAND ${LLVM_CONFIG} --${flag} - RESULT_VARIABLE result_code - OUTPUT_VARIABLE LLVM_${var} - OUTPUT_STRIP_TRAILING_WHITESPACE - ${_quiet_arg} - ) - if(result_code) - _LLVM_FAIL("Failed to execute llvm-config ('${LLVM_CONFIG}', result code: '${result_code})'") + + # Check that this LLVM supports linking as a shared/static library, if requested + if (ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM) + if (ZIG_SHARED_LLVM) + set(STATIC_OR_SHARED_LINK "--link-shared") + elseif (ZIG_STATIC_LLVM) + set(STATIC_OR_SHARED_LINK "--link-static") + endif() + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libs ${STATIC_OR_SHARED_LINK} + OUTPUT_QUIET + ERROR_VARIABLE LLVM_CONFIG_ERROR + ERROR_STRIP_TRAILING_WHITESPACE) + + if (LLVM_CONFIG_ERROR) + # Save the error message, in case this is the last llvm-config we find + if (ZIG_SHARED_LLVM) + list(APPEND LLVM_CONFIG_ERROR_MESSAGES "LLVM 19.x found at ${LLVM_CONFIG_EXE} does not support linking as a shared library") else() - if(${ARGV2}) - file(TO_CMAKE_PATH "${LLVM_${var}}" LLVM_${var}) - endif() + list(APPEND LLVM_CONFIG_ERROR_MESSAGES "LLVM 19.x found at ${LLVM_CONFIG_EXE} does not support linking as a static library") endif() - endmacro() - macro(llvm_set_libs var flag components) - if(LLVM_FIND_QUIETLY) - set(_quiet_arg ERROR_QUIET) - endif() - set(result_code) - execute_process( - COMMAND ${LLVM_CONFIG} --${flag} ${components} - RESULT_VARIABLE result_code - OUTPUT_VARIABLE tmplibs - OUTPUT_STRIP_TRAILING_WHITESPACE - ${_quiet_arg} - ) - if(result_code) - _LLVM_FAIL("Failed to execute llvm-config ('${LLVM_CONFIG}', result code: '${result_code})'") - else() - file(TO_CMAKE_PATH "${tmplibs}" tmplibs) - string(REGEX MATCHALL "${pattern}[^ ]+" LLVM_${var} ${tmplibs}) - endif() - endmacro() - llvm_set(VERSION_STRING version) - llvm_set(CXXFLAGS cxxflags) - llvm_set(INCLUDE_DIRS includedir true) - llvm_set(ROOT_DIR prefix true) - llvm_set(ENABLE_ASSERTIONS assertion-mode) - - # The LLVM version string _may_ contain a git/svn suffix, so match only the x.y.z part - string(REGEX MATCH "^[0-9]+[.][0-9]+[.][0-9]+" LLVM_VERSION_BASE_STRING "${LLVM_VERSION_STRING}") - string(REGEX REPLACE "([0-9]+).*" "\\1" LLVM_VERSION_MAJOR "${LLVM_VERSION_STRING}" ) - string(REGEX REPLACE "[0-9]+\\.([0-9]+).*[A-Za-z]*" "\\1" LLVM_VERSION_MINOR "${LLVM_VERSION_STRING}" ) - - llvm_set(SHARED_MODE shared-mode) - if(LLVM_SHARED_MODE STREQUAL "shared") - set(LLVM_IS_SHARED ON) - else() - set(LLVM_IS_SHARED OFF) + # Ignore this directory and try the search again + list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}") + continue() + endif() endif() - llvm_set(LDFLAGS ldflags) - llvm_set(SYSTEM_LIBS system-libs) - string(REPLACE "\n" " " LLVM_LDFLAGS "${LLVM_LDFLAGS} ${LLVM_SYSTEM_LIBS}") - if(APPLE) # unclear why/how this happens - string(REPLACE "-llibxml2.tbd" "-lxml2" LLVM_LDFLAGS ${LLVM_LDFLAGS}) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --targets-built + OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}") + + set(ZIG_LLVM_REQUIRED_TARGETS "AArch64;AMDGPU;ARM;AVR;BPF;Hexagon;Lanai;Mips;MSP430;NVPTX;PowerPC;RISCV;Sparc;SystemZ;VE;WebAssembly;X86;XCore") + + set(ZIG_LLVM_REQUIRED_TARGETS_ENABLED TRUE) + foreach(TARGET_NAME IN LISTS ZIG_LLVM_REQUIRED_TARGETS) + list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index) + if (${_index} EQUAL -1) + # Save the error message, in case this is the last llvm-config we find + list(APPEND LLVM_CONFIG_ERROR_MESSAGES "LLVM (according to ${LLVM_CONFIG_EXE}) is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.") + + # Ignore this directory and try the search again + list(APPEND CMAKE_IGNORE_PATH "${LLVM_CONFIG_DIR}") + set(ZIG_LLVM_REQUIRED_TARGETS_ENABLED FALSE) + break() + endif() + endforeach() + if (NOT ZIG_LLVM_REQUIRED_TARGETS_ENABLED) + continue() endif() - if(${LLVM_VERSION_MAJOR} LESS "15") - # Versions below 15.0 do not support component windowsdriver - list(REMOVE_ITEM LLVM_FIND_COMPONENTS "windowsdriver") - endif() + # Got it! + break() + endwhile() - llvm_set(LIBRARY_DIRS libdir true) - llvm_set_libs(LIBRARIES libs "${LLVM_FIND_COMPONENTS}") - # LLVM bug: llvm-config --libs tablegen returns -lLLVM-3.8.0 - # but code for it is not in shared library - if("${LLVM_FIND_COMPONENTS}" MATCHES "tablegen") - if (NOT "${LLVM_LIBRARIES}" MATCHES "LLVMTableGen") - set(LLVM_LIBRARIES "${LLVM_LIBRARIES};-lLLVMTableGen") - endif() - endif() + if(ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libfiles ${STATIC_OR_SHARED_LINK} + OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") - llvm_set(CMAKEDIR cmakedir) - llvm_set(TARGETS_TO_BUILD targets-built) - string(REGEX MATCHALL "${pattern}[^ ]+" LLVM_TARGETS_TO_BUILD ${LLVM_TARGETS_TO_BUILD}) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libdir ${STATIC_OR_SHARED_LINK} + OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") - # Parse LLVM_NATIVE_ARCH manually from LLVMConfig.cmake; including it leads to issues like - # https://github.com/ldc-developers/ldc/issues/3079. - file(STRINGS "${LLVM_CMAKEDIR}/LLVMConfig.cmake" LLVM_NATIVE_ARCH LIMIT_COUNT 1 REGEX "^set\\(LLVM_NATIVE_ARCH (.+)\\)$") - string(REGEX MATCH "set\\(LLVM_NATIVE_ARCH (.+)\\)" LLVM_NATIVE_ARCH "${LLVM_NATIVE_ARCH}") - set(LLVM_NATIVE_ARCH ${CMAKE_MATCH_1}) - message(STATUS "LLVM_NATIVE_ARCH: ${LLVM_NATIVE_ARCH}") + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs ${STATIC_OR_SHARED_LINK} + OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") - # On CMake builds of LLVM, the output of llvm-config --cxxflags does not - # include -fno-rtti, leading to linker errors. Be sure to add it. - if(NOT MSVC AND (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"))) - if(NOT ${LLVM_CXXFLAGS} MATCHES "-fno-rtti") - set(LLVM_CXXFLAGS "${LLVM_CXXFLAGS} -fno-rtti") - endif() - endif() + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK} + OUTPUT_VARIABLE LLVM_LINK_MODE + OUTPUT_STRIP_TRAILING_WHITESPACE) + else() + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libs + OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") - # Remove some clang-specific flags for gcc. - if(CMAKE_COMPILER_IS_GNUCXX) - string(REPLACE "-Wcovered-switch-default " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS}) - string(REPLACE "-Wstring-conversion " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS}) - string(REPLACE "-fcolor-diagnostics " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS}) - # this requires more recent gcc versions (not supported by 4.9) - string(REPLACE "-Werror=unguarded-availability-new " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS}) - endif() + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libdir + OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") - # Remove gcc-specific flags for clang. - if(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") - string(REPLACE "-Wno-maybe-uninitialized " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS}) - endif() + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs + OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") - if (${LLVM_VERSION_STRING} VERSION_LESS ${LLVM_FIND_VERSION}) - _LLVM_FAIL("Unsupported LLVM version ${LLVM_VERSION_STRING} found (${LLVM_CONFIG}). At least version ${LLVM_FIND_VERSION} is required. You can also set variables 'LLVM_ROOT_DIR' or 'LLVM_CONFIG' to use a different LLVM installation.") - endif() + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --shared-mode + OUTPUT_VARIABLE LLVM_LINK_MODE + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + if (${LLVM_LINK_MODE} STREQUAL "shared") + # We always ask for the system libs corresponding to static linking, + # since on some distros LLD is only available as a static library + # and we need these libraries to link it successfully + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static + OUTPUT_VARIABLE LLVM_STATIC_SYSTEM_LIBS_SPACES + ERROR_QUIET # Some installations have no static libs, we just ignore the failure + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_STATIC_SYSTEM_LIBS "${LLVM_STATIC_SYSTEM_LIBS_SPACES}") + + set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS} ${LLVM_STATIC_SYSTEM_LIBS}) + else() + set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS}) + endif() + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --includedir + OUTPUT_VARIABLE LLVM_INCLUDE_DIRS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_INCLUDE_DIRS "${LLVM_INCLUDE_DIRS_SPACES}") + + link_directories("${LLVM_LIBDIRS}") +else() + # Here we assume that we're cross compiling with Zig, of course. No reason + # to support more complicated setups. + + macro(FIND_AND_ADD_LLVM_LIB _libname_) + string(TOUPPER ${_libname_} _prettylibname_) + find_library(LLVM_${_prettylibname_}_LIB + NAMES ${_libname_} NAMES_PER_DIR) + set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB}) + endmacro(FIND_AND_ADD_LLVM_LIB) + + set(LLVM_LINK_MODE "static") + + # This list can be re-generated with `llvm-config --libfiles` and then + # reformatting using your favorite text editor. Note we do not execute + # `llvm-config` here because we are cross compiling. + FIND_AND_ADD_LLVM_LIB(LLVMWindowsManifest) + FIND_AND_ADD_LLVM_LIB(LLVMXRay) + FIND_AND_ADD_LLVM_LIB(LLVMLibDriver) + FIND_AND_ADD_LLVM_LIB(LLVMDlltoolDriver) + FIND_AND_ADD_LLVM_LIB(LLVMTextAPIBinaryReader) + FIND_AND_ADD_LLVM_LIB(LLVMCoverage) + FIND_AND_ADD_LLVM_LIB(LLVMLineEditor) + FIND_AND_ADD_LLVM_LIB(LLVMSandboxIR) + FIND_AND_ADD_LLVM_LIB(LLVMXCoreDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMXCoreCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMXCoreDesc) + FIND_AND_ADD_LLVM_LIB(LLVMXCoreInfo) + FIND_AND_ADD_LLVM_LIB(LLVMX86TargetMCA) + FIND_AND_ADD_LLVM_LIB(LLVMX86Disassembler) + FIND_AND_ADD_LLVM_LIB(LLVMX86AsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMX86CodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMX86Desc) + FIND_AND_ADD_LLVM_LIB(LLVMX86Info) + FIND_AND_ADD_LLVM_LIB(LLVMWebAssemblyDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMWebAssemblyAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMWebAssemblyCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMWebAssemblyUtils) + FIND_AND_ADD_LLVM_LIB(LLVMWebAssemblyDesc) + FIND_AND_ADD_LLVM_LIB(LLVMWebAssemblyInfo) + FIND_AND_ADD_LLVM_LIB(LLVMVEDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMVEAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMVECodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMVEDesc) + FIND_AND_ADD_LLVM_LIB(LLVMVEInfo) + FIND_AND_ADD_LLVM_LIB(LLVMSystemZDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMSystemZAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMSystemZCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMSystemZDesc) + FIND_AND_ADD_LLVM_LIB(LLVMSystemZInfo) + FIND_AND_ADD_LLVM_LIB(LLVMSparcDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMSparcAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMSparcCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMSparcDesc) + FIND_AND_ADD_LLVM_LIB(LLVMSparcInfo) + FIND_AND_ADD_LLVM_LIB(LLVMRISCVTargetMCA) + FIND_AND_ADD_LLVM_LIB(LLVMRISCVDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMRISCVAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMRISCVCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMRISCVDesc) + FIND_AND_ADD_LLVM_LIB(LLVMRISCVInfo) + FIND_AND_ADD_LLVM_LIB(LLVMPowerPCDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMPowerPCAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMPowerPCCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMPowerPCDesc) + FIND_AND_ADD_LLVM_LIB(LLVMPowerPCInfo) + FIND_AND_ADD_LLVM_LIB(LLVMNVPTXCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMNVPTXDesc) + FIND_AND_ADD_LLVM_LIB(LLVMNVPTXInfo) + FIND_AND_ADD_LLVM_LIB(LLVMMSP430Disassembler) + FIND_AND_ADD_LLVM_LIB(LLVMMSP430AsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMMSP430CodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMMSP430Desc) + FIND_AND_ADD_LLVM_LIB(LLVMMSP430Info) + FIND_AND_ADD_LLVM_LIB(LLVMMipsDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMMipsAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMMipsCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMMipsDesc) + FIND_AND_ADD_LLVM_LIB(LLVMMipsInfo) + FIND_AND_ADD_LLVM_LIB(LLVMLoongArchDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMLoongArchAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMLoongArchCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMLoongArchDesc) + FIND_AND_ADD_LLVM_LIB(LLVMLoongArchInfo) + FIND_AND_ADD_LLVM_LIB(LLVMLanaiDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMLanaiCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMLanaiAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMLanaiDesc) + FIND_AND_ADD_LLVM_LIB(LLVMLanaiInfo) + FIND_AND_ADD_LLVM_LIB(LLVMHexagonDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMHexagonCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMHexagonAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMHexagonDesc) + FIND_AND_ADD_LLVM_LIB(LLVMHexagonInfo) + FIND_AND_ADD_LLVM_LIB(LLVMBPFDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMBPFAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMBPFCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMBPFDesc) + FIND_AND_ADD_LLVM_LIB(LLVMBPFInfo) + FIND_AND_ADD_LLVM_LIB(LLVMAVRDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMAVRAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMAVRCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMAVRDesc) + FIND_AND_ADD_LLVM_LIB(LLVMAVRInfo) + FIND_AND_ADD_LLVM_LIB(LLVMARMDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMARMAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMARMCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMARMDesc) + FIND_AND_ADD_LLVM_LIB(LLVMARMUtils) + FIND_AND_ADD_LLVM_LIB(LLVMARMInfo) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUTargetMCA) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUDesc) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUUtils) + FIND_AND_ADD_LLVM_LIB(LLVMAMDGPUInfo) + FIND_AND_ADD_LLVM_LIB(LLVMAArch64Disassembler) + FIND_AND_ADD_LLVM_LIB(LLVMAArch64AsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMAArch64CodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMAArch64Desc) + FIND_AND_ADD_LLVM_LIB(LLVMAArch64Utils) + FIND_AND_ADD_LLVM_LIB(LLVMAArch64Info) + FIND_AND_ADD_LLVM_LIB(LLVMOrcDebugging) + FIND_AND_ADD_LLVM_LIB(LLVMOrcJIT) + FIND_AND_ADD_LLVM_LIB(LLVMWindowsDriver) + FIND_AND_ADD_LLVM_LIB(LLVMMCJIT) + FIND_AND_ADD_LLVM_LIB(LLVMJITLink) + FIND_AND_ADD_LLVM_LIB(LLVMInterpreter) + FIND_AND_ADD_LLVM_LIB(LLVMExecutionEngine) + FIND_AND_ADD_LLVM_LIB(LLVMRuntimeDyld) + FIND_AND_ADD_LLVM_LIB(LLVMOrcTargetProcess) + FIND_AND_ADD_LLVM_LIB(LLVMOrcShared) + FIND_AND_ADD_LLVM_LIB(LLVMDWP) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoLogicalView) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoGSYM) + FIND_AND_ADD_LLVM_LIB(LLVMOption) + FIND_AND_ADD_LLVM_LIB(LLVMObjectYAML) + FIND_AND_ADD_LLVM_LIB(LLVMObjCopy) + FIND_AND_ADD_LLVM_LIB(LLVMMCA) + FIND_AND_ADD_LLVM_LIB(LLVMMCDisassembler) + FIND_AND_ADD_LLVM_LIB(LLVMLTO) + FIND_AND_ADD_LLVM_LIB(LLVMPasses) + FIND_AND_ADD_LLVM_LIB(LLVMHipStdPar) + FIND_AND_ADD_LLVM_LIB(LLVMCFGuard) + FIND_AND_ADD_LLVM_LIB(LLVMCoroutines) + FIND_AND_ADD_LLVM_LIB(LLVMipo) + FIND_AND_ADD_LLVM_LIB(LLVMVectorize) + FIND_AND_ADD_LLVM_LIB(LLVMLinker) + FIND_AND_ADD_LLVM_LIB(LLVMInstrumentation) + FIND_AND_ADD_LLVM_LIB(LLVMFrontendOpenMP) + FIND_AND_ADD_LLVM_LIB(LLVMFrontendOffloading) + FIND_AND_ADD_LLVM_LIB(LLVMFrontendOpenACC) + FIND_AND_ADD_LLVM_LIB(LLVMFrontendHLSL) + FIND_AND_ADD_LLVM_LIB(LLVMFrontendDriver) + FIND_AND_ADD_LLVM_LIB(LLVMExtensions) + FIND_AND_ADD_LLVM_LIB(LLVMDWARFLinkerParallel) + FIND_AND_ADD_LLVM_LIB(LLVMDWARFLinkerClassic) + FIND_AND_ADD_LLVM_LIB(LLVMDWARFLinker) + FIND_AND_ADD_LLVM_LIB(LLVMCodeGenData) + FIND_AND_ADD_LLVM_LIB(LLVMGlobalISel) + FIND_AND_ADD_LLVM_LIB(LLVMMIRParser) + FIND_AND_ADD_LLVM_LIB(LLVMAsmPrinter) + FIND_AND_ADD_LLVM_LIB(LLVMSelectionDAG) + FIND_AND_ADD_LLVM_LIB(LLVMCodeGen) + FIND_AND_ADD_LLVM_LIB(LLVMTarget) + FIND_AND_ADD_LLVM_LIB(LLVMObjCARCOpts) + FIND_AND_ADD_LLVM_LIB(LLVMCodeGenTypes) + FIND_AND_ADD_LLVM_LIB(LLVMIRPrinter) + FIND_AND_ADD_LLVM_LIB(LLVMInterfaceStub) + FIND_AND_ADD_LLVM_LIB(LLVMFileCheck) + FIND_AND_ADD_LLVM_LIB(LLVMFuzzMutate) + FIND_AND_ADD_LLVM_LIB(LLVMScalarOpts) + FIND_AND_ADD_LLVM_LIB(LLVMInstCombine) + FIND_AND_ADD_LLVM_LIB(LLVMAggressiveInstCombine) + FIND_AND_ADD_LLVM_LIB(LLVMTransformUtils) + FIND_AND_ADD_LLVM_LIB(LLVMBitWriter) + FIND_AND_ADD_LLVM_LIB(LLVMAnalysis) + FIND_AND_ADD_LLVM_LIB(LLVMProfileData) + FIND_AND_ADD_LLVM_LIB(LLVMSymbolize) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoBTF) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoPDB) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoMSF) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoDWARF) + FIND_AND_ADD_LLVM_LIB(LLVMObject) + FIND_AND_ADD_LLVM_LIB(LLVMTextAPI) + FIND_AND_ADD_LLVM_LIB(LLVMMCParser) + FIND_AND_ADD_LLVM_LIB(LLVMIRReader) + FIND_AND_ADD_LLVM_LIB(LLVMAsmParser) + FIND_AND_ADD_LLVM_LIB(LLVMMC) + FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoCodeView) + FIND_AND_ADD_LLVM_LIB(LLVMBitReader) + FIND_AND_ADD_LLVM_LIB(LLVMFuzzerCLI) + FIND_AND_ADD_LLVM_LIB(LLVMCore) + FIND_AND_ADD_LLVM_LIB(LLVMRemarks) + FIND_AND_ADD_LLVM_LIB(LLVMBitstreamReader) + FIND_AND_ADD_LLVM_LIB(LLVMBinaryFormat) + FIND_AND_ADD_LLVM_LIB(LLVMTargetParser) + FIND_AND_ADD_LLVM_LIB(LLVMSupport) + FIND_AND_ADD_LLVM_LIB(LLVMDemangle) + + get_filename_component(LLVM_LIBDIRS "${LLVM_LLVMCORE_LIB}" DIRECTORY) + find_path(LLVM_INCLUDE_DIRS NAMES llvm/IR/IRBuilder.h) endif() -# Use the default CMake facilities for handling QUIET/REQUIRED. include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(llvm DEFAULT_MSG LLVM_LIBRARIES LLVM_INCLUDE_DIRS) -find_package_handle_standard_args(LLVM - REQUIRED_VARS LLVM_ROOT_DIR - VERSION_VAR LLVM_VERSION_STRING) +mark_as_advanced(LLVM_INCLUDE_DIRS LLVM_LIBRARIES LLVM_LIBDIRS)