diff options
author | Brad King <brad.king@kitware.com> | 2017-12-15 18:47:31 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2017-12-15 19:02:48 (GMT) |
commit | 90d4abc1b5035e669df9e82038ee252ff34a3a45 (patch) | |
tree | d8de02ff0ef1e60ae9f0b8c4b1616db3b0ef6180 | |
parent | 1263a3a1a83ac160db9cc3ed9a4947c31a7bc95f (diff) | |
download | CastXML-90d4abc1b5035e669df9e82038ee252ff34a3a45.zip CastXML-90d4abc1b5035e669df9e82038ee252ff34a3a45.tar.gz CastXML-90d4abc1b5035e669df9e82038ee252ff34a3a45.tar.bz2 |
Search for Clang CMake package in addition to LLVM
Since Clang 3.8 (r249935 Always generate and install cmake config files,
2015-10-10), Clang installs a `CMakeConfig.cmake` package configuration
file that provides imported targets for Clang libraries. Find and load
the Clang CMake package if possible. This improves our build system by
directly referencing Clang library files on link lines.
Since Clang 3.9 (r261290, Add call to find_package to load LLVM
dependencies, 2016-02-19), Clang's CMake package file automatically
searches for LLVM's CMake package. Since Clang 5.0 (r293632, Hint
find_package() to prefer LLVM installed alongside clang, 2017-01-31),
Clang's search for LLVM automatically hints at a location alongside
itself. Provide hints ourselves to help find matching pairs of older
LLVM/Clang versions.
Fixes: #100
-rw-r--r-- | CMakeLists.txt | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 4bf06b8..82152eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,45 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${std_cxx11}") endif() -find_package(LLVM REQUIRED) +macro(hint_clang_from_llvm) + if(LLVM_DIR AND NOT Clang_DIR) + if(LLVM_DIR MATCHES "share/llvm/cmake$") + # LLVM/Clang 3.8 installs in <prefix>/share/{llvm,clang}/cmake + get_filename_component(Clang_DIR "${LLVM_DIR}/../../clang/cmake" ABSOLUTE) + else() + # LLVM/Clang 3.9+ installs in <prefix>/lib/cmake/{llvm,clang} + get_filename_component(Clang_DIR "${LLVM_DIR}/../clang" ABSOLUTE) + endif() + endif() +endmacro() + +macro(hint_llvm_from_clang) + if(Clang_DIR AND NOT LLVM_DIR) + if(Clang_DIR MATCHES "share/clang/cmake$") + # LLVM/Clang 3.8 installs in <prefix>/share/{llvm,clang}/cmake + get_filename_component(LLVM_DIR "${Clang_DIR}/../../llvm/cmake" ABSOLUTE) + else() + # LLVM/Clang 3.9+ installs in <prefix>/lib/cmake/{llvm,clang} + get_filename_component(LLVM_DIR "${Clang_DIR}/../llvm" ABSOLUTE) + endif() + endif() +endmacro() + +# Build scripts may set either LLVM_DIR or Clang_DIR. +hint_llvm_from_clang() +hint_clang_from_llvm() + +# Clang 3.8+ installs its own CMake package. Try it first. +find_package(Clang QUIET) + +# If Clang did not find LLVM for us, give our search below a hint. +hint_llvm_from_clang() + +# Clang 3.9+ automatically searches for LLVM. For older versions we +# may need to search for LLVM directly. Either way we require LLVM. +if(NOT LLVM_FOUND) + find_package(LLVM REQUIRED) +endif() if(DEFINED LLVM_BUILD_BINARY_DIR) message(FATAL_ERROR |