# Find the native LLVM includes and libraries # # Defines the following variables # LLVM_INCLUDE_DIRS - where to find llvm include files # LLVM_LIBRARY_DIRS - where to find llvm libs # LLVM_CFLAGS - llvm compiler flags # LLVM_LFLAGS - llvm linker flags # LLVM_MODULE_LIBS - list of llvm libs for working with modules. # LLVM_INSTALL_PREFIX - LLVM installation prefix # LLVM_FOUND - True if llvm found. # LLVM_VERSION - Version string ("llvm-config --version") # # This module reads hints about search locations from variables # LLVM_ROOT - Preferred LLVM installation prefix (containing bin/, lib/, ...) # # Note: One may specify these as environment variables if they are not specified as # CMake variables or cache entries. #============================================================================= # Copyright 2014 Kevin Funk # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #============================================================================= if (NOT LLVM_ROOT AND DEFINED ENV{LLVM_ROOT}) file(TO_CMAKE_PATH "$ENV{LLVM_ROOT}" LLVM_ROOT) endif() # if the user specified LLVM_ROOT, use that and fail otherwise if (LLVM_ROOT) find_program(LLVM_CONFIG_EXECUTABLE NAMES llvm-config HINTS ${LLVM_ROOT}/bin DOC "llvm-config executable" NO_DEFAULT_PATH) else() # find llvm-config, prefer the one with a version suffix, e.g. llvm-config-3.5 # note: FreeBSD installs llvm-config as llvm-config35 and so on # note: on some distributions, only 'llvm-config' is shipped, so let's always try to fallback on that string(REPLACE "." "" LLVM_FIND_VERSION_CONCAT ${LLVM_FIND_VERSION}) find_program(LLVM_CONFIG_EXECUTABLE NAMES llvm-config-${LLVM_FIND_VERSION} llvm-config${LLVM_FIND_VERSION_CONCAT} llvm-config DOC "llvm-config executable") # other distributions don't ship llvm-config, but only some llvm-config-VERSION binary # try to deduce installed LLVM version by looking up llvm-nm in PATH and *then* find llvm-config-VERSION via that if (NOT LLVM_CONFIG_EXECUTABLE) find_program(_llvmNmExecutable llvm-nm) if (_llvmNmExecutable) execute_process(COMMAND ${_llvmNmExecutable} --version OUTPUT_VARIABLE _out) string(REGEX REPLACE ".*LLVM version ([^ \n]+).*" "\\1" _versionString "${_out}") find_program(LLVM_CONFIG_EXECUTABLE NAMES llvm-config-${_versionString} DOC "llvm-config executable") endif() endif() endif() set(LLVM_FOUND FALSE) if (LLVM_CONFIG_EXECUTABLE) # verify that we've found the correct version of llvm-config execute_process(COMMAND ${LLVM_CONFIG_EXECUTABLE} --version OUTPUT_VARIABLE LLVM_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) if (NOT LLVM_VERSION) set(_LLVM_ERROR_MESSAGE "Failed to parse version from llvm-config") elseif (LLVM_FIND_VERSION VERSION_GREATER LLVM_VERSION) set(_LLVM_ERROR_MESSAGE "LLVM version too old: ${LLVM_VERSION}") else() set(LLVM_FOUND TRUE) endif() else() set(_LLVM_ERROR_MESSAGE "Could NOT find 'llvm-config' executable") endif() if (LLVM_FOUND) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --includedir OUTPUT_VARIABLE LLVM_INCLUDE_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --libdir OUTPUT_VARIABLE LLVM_LIBRARY_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --cppflags OUTPUT_VARIABLE LLVM_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --ldflags OUTPUT_VARIABLE LLVM_LFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --libs core bitreader asmparser analysis OUTPUT_VARIABLE LLVM_MODULE_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --libfiles OUTPUT_VARIABLE LLVM_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE ) string(REPLACE " " ";" LLVM_LIBS ${LLVM_LIBS}) # Make it consistent with --libs execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --system-libs OUTPUT_VARIABLE LLVM_SYSTEM_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --prefix OUTPUT_VARIABLE LLVM_INSTALL_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE ) # potentially add include dir from binary dir for non-installed LLVM execute_process( COMMAND ${LLVM_CONFIG_EXECUTABLE} --src-root OUTPUT_VARIABLE _llvmSourceRoot OUTPUT_STRIP_TRAILING_WHITESPACE ) string(FIND "${LLVM_INCLUDE_DIRS}" "${_llvmSourceRoot}" _llvmIsInstalled) if (NOT _llvmIsInstalled) list(APPEND LLVM_INCLUDE_DIRS "${LLVM_INSTALL_PREFIX}/include") endif() endif() if (LLVM_FIND_REQUIRED AND NOT LLVM_FOUND) message(FATAL_ERROR "Could not find LLVM: ${_LLVM_ERROR_MESSAGE}") elseif(_LLVM_ERROR_MESSAGE) message(STATUS "Could not find LLVM: ${_LLVM_ERROR_MESSAGE}") endif() if (LLVM_FOUND) message(STATUS "Found LLVM (version: ${LLVM_VERSION}): (using ${LLVM_CONFIG_EXECUTABLE})") message(STATUS " Include dirs: ${LLVM_INCLUDE_DIRS}") message(STATUS " LLVM libraries: ${LLVM_LIBS}") message(STATUS " LLVM System libraries: ${LLVM_SYSTEM_LIBS}") endif()