2021-07-22 11:41:51 -07:00
2021-07-27 12:38:38 -07:00
# - 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.
2021-07-22 11:41:51 -07:00
# LLVM_ENABLE_ASSERTIONS - Whether LLVM was built with enabled assertions (ON/OFF).
2021-07-27 12:38:38 -07:00
# LLVM_INCLUDE_DIRS - Directory containing LLVM include files.
2021-07-22 11:41:51 -07:00
# LLVM_IS_SHARED - Whether LLVM is going to be linked dynamically (ON) or statically (OFF).
2021-07-27 12:38:38 -07:00
# 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.
2021-07-22 11:41:51 -07:00
# LLVM_NATIVE_ARCH - Backend corresponding to LLVM_HOST_TARGET, e.g.,
# X86 for x86_64 and i686 hosts.
2021-07-27 12:38:38 -07:00
# LLVM_ROOT_DIR - The root directory of the LLVM installation.
# llvm-config is searched for in ${LLVM_ROOT_DIR}/bin.
2021-07-22 11:41:51 -07:00
# LLVM_TARGETS_TO_BUILD - List of built LLVM targets.
2021-07-27 12:38:38 -07:00
# 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).
#
2022-09-16 12:26:40 -07:00
# Note: The variable names were chosen in conformance with the official CMake
2021-07-27 12:38:38 -07:00
# guidelines, see ${CMAKE_ROOT}/Modules/readme.txt.
# 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.
2021-07-22 18:03:51 -07:00
set ( llvm_config_names llvm-config-12.0 llvm-config120 llvm-config-12 llvm-config-12-64
l l v m - c o n f i g - 1 1 . 0 l l v m - c o n f i g 1 1 0 l l v m - c o n f i g - 1 1 l l v m - c o n f i g - 1 1 - 6 4
l l v m - c o n f i g - 1 0 . 0 l l v m - c o n f i g 1 0 0 l l v m - c o n f i g - 1 0 l l v m - c o n f i g - 1 0 - 6 4
l l v m - c o n f i g - 9 . 0 l l v m - c o n f i g 9 0 l l v m - c o n f i g - 9 l l v m - c o n f i g - 9 - 6 4
l l v m - c o n f i g - 8 . 0 l l v m - c o n f i g 8 0 l l v m - c o n f i g - 8 l l v m - c o n f i g - 8 - 6 4
l l v m - c o n f i g - 7 . 0 l l v m - c o n f i g 7 0 l l v m - c o n f i g - 7 l l v m - c o n f i g - 7 - 6 4
2021-07-22 11:41:51 -07:00
l l v m - c o n f i g - 6 . 0 l l v m - c o n f i g 6 0
2021-07-27 12:38:38 -07:00
l l v m - c o n f i g )
find_program ( LLVM_CONFIG
N A M E S $ { l l v m _ c o n f i g _ n a m e s }
P A T H S $ { L L V M _ R O O T _ D I R } / b i n N O _ D E F A U L T _ P A T H
D O C " P a t h t o l l v m - c o n f i g t o o l . " )
find_program ( LLVM_CONFIG NAMES ${ llvm_config_names } )
2021-07-22 11:41:51 -07:00
if ( APPLE )
# extra fallbacks for MacPorts & Homebrew
find_program ( LLVM_CONFIG
N A M E S $ { l l v m _ c o n f i g _ n a m e s }
P A T H S / o p t / l o c a l / l i b e x e c / l l v m - 1 1 / b i n / o p t / l o c a l / l i b e x e c / l l v m - 1 0 / b i n / o p t / l o c a l / l i b e x e c / l l v m - 9 . 0 / b i n
/ o p t / l o c a l / l i b e x e c / l l v m - 8 . 0 / b i n / o p t / l o c a l / l i b e x e c / l l v m - 7 . 0 / b i n / o p t / l o c a l / l i b e x e c / l l v m - 6 . 0 / b i n
/ o p t / l o c a l / l i b e x e c / l l v m / b i n
/ u s r / l o c a l / o p t / l l v m @ 1 1 / b i n / u s r / l o c a l / o p t / l l v m @ 1 0 / b i n / u s r / l o c a l / o p t / l l v m @ 9 / b i n
/ u s r / l o c a l / o p t / l l v m @ 8 / b i n / u s r / l o c a l / o p t / l l v m @ 7 / b i n / u s r / l o c a l / o p t / l l v m @ 6 / b i n
/ u s r / l o c a l / o p t / l l v m / b i n
N O _ D E F A U L T _ P A T H )
endif ( )
2021-07-27 12:38:38 -07:00
# 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 )
2021-07-22 11:41:51 -07:00
message ( WARNING "${_msg}" )
2021-07-27 12:38:38 -07:00
endif ( )
endif ( )
endmacro ( )
if ( NOT LLVM_CONFIG )
if ( NOT LLVM_FIND_QUIETLY )
2021-07-22 11:41:51 -07:00
_LLVM_FAIL ( "No LLVM installation (>= ${LLVM_FIND_VERSION}) found. Try manually setting the 'LLVM_ROOT_DIR' or 'LLVM_CONFIG' variables." )
2021-07-27 12:38:38 -07:00
endif ( )
else ( )
macro ( llvm_set var flag )
if ( LLVM_FIND_QUIETLY )
set ( _quiet_arg ERROR_QUIET )
endif ( )
set ( result_code )
execute_process (
2021-07-22 11:41:51 -07:00
C O M M A N D $ { L L V M _ C O N F I G } - - l i n k - s t a t i c - - $ { f l a g }
2021-07-27 12:38:38 -07:00
R E S U L T _ V A R I A B L E r e s u l t _ c o d e
O U T P U T _ V A R I A B L E L L V M _ $ { v a r }
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
$ { _ q u i e t _ a r g }
)
if ( result_code )
_LLVM_FAIL ( "Failed to execute llvm-config ('${LLVM_CONFIG}', result code: '${result_code})'" )
else ( )
if ( ${ ARGV2 } )
file ( TO_CMAKE_PATH "${LLVM_${var}}" LLVM_ ${ var } )
endif ( )
endif ( )
endmacro ( )
2021-07-22 11:41:51 -07:00
macro ( llvm_set_libs var flag components )
2021-07-27 12:38:38 -07:00
if ( LLVM_FIND_QUIETLY )
set ( _quiet_arg ERROR_QUIET )
endif ( )
set ( result_code )
execute_process (
2021-07-22 11:41:51 -07:00
C O M M A N D $ { L L V M _ C O N F I G } - - l i n k - s t a t i c - - $ { f l a g } $ { c o m p o n e n t s }
2021-07-27 12:38:38 -07:00
R E S U L T _ V A R I A B L E r e s u l t _ c o d e
O U T P U T _ V A R I A B L E t m p l i b s
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
$ { _ q u i e t _ a r g }
)
if ( result_code )
_LLVM_FAIL ( "Failed to execute llvm-config ('${LLVM_CONFIG}', result code: '${result_code})'" )
2021-07-22 11:41:51 -07:00
else ( )
2021-07-27 12:38:38 -07:00
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 )
2021-07-22 11:41:51 -07:00
# 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}" )
2021-07-27 12:38:38 -07:00
2021-07-22 11:41:51 -07:00
llvm_set ( SHARED_MODE shared-mode )
if ( LLVM_SHARED_MODE STREQUAL "shared" )
set ( LLVM_IS_SHARED ON )
else ( )
set ( LLVM_IS_SHARED OFF )
2021-07-27 12:38:38 -07:00
endif ( )
llvm_set ( LDFLAGS ldflags )
llvm_set ( SYSTEM_LIBS system-libs )
string ( REPLACE "\n" " " LLVM_LDFLAGS "${LLVM_LDFLAGS} ${LLVM_SYSTEM_LIBS}" )
2021-07-22 11:41:51 -07:00
if ( APPLE ) # unclear why/how this happens
string ( REPLACE "-llibxml2.tbd" "-lxml2" LLVM_LDFLAGS ${ LLVM_LDFLAGS } )
endif ( )
2021-07-27 12:38:38 -07:00
llvm_set ( LIBRARY_DIRS libdir true )
2021-07-22 11:41:51 -07:00
llvm_set_libs ( LIBRARIES libfiles "${LLVM_FIND_COMPONENTS}" )
2021-07-27 12:38:38 -07:00
# 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 ( )
2021-07-22 11:41:51 -07:00
llvm_set ( CMAKEDIR cmakedir )
2021-07-27 12:38:38 -07:00
llvm_set ( TARGETS_TO_BUILD targets-built )
string ( REGEX MATCHALL "${pattern}[^ ]+" LLVM_TARGETS_TO_BUILD ${ LLVM_TARGETS_TO_BUILD } )
2021-07-22 11:41:51 -07:00
# 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}" )
# 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 ( )
2021-07-27 12:38:38 -07:00
2021-07-22 11:41:51 -07:00
# 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 ( )
# Remove gcc-specific flags for clang.
if ( ${ CMAKE_CXX_COMPILER_ID } MATCHES "Clang" )
string ( REPLACE "-Wno-maybe-uninitialized " "" LLVM_CXXFLAGS ${ LLVM_CXXFLAGS } )
endif ( )
2021-07-27 12:38:38 -07:00
2021-07-22 11:41:51 -07:00
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}" )
2021-07-27 12:38:38 -07:00
2021-07-22 11:41:51 -07:00
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 ( )
endif ( )
2021-07-27 12:38:38 -07:00
# Use the default CMake facilities for handling QUIET/REQUIRED.
include ( FindPackageHandleStandardArgs )
find_package_handle_standard_args ( LLVM
2021-07-22 11:41:51 -07:00
R E Q U I R E D _ V A R S L L V M _ R O O T _ D I R
2022-09-16 12:26:40 -07:00
V E R S I O N _ V A R L L V M _ V E R S I O N _ S T R I N G )