summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-12-15 18:47:31 (GMT)
committerBrad King <brad.king@kitware.com>2017-12-15 19:02:48 (GMT)
commit90d4abc1b5035e669df9e82038ee252ff34a3a45 (patch)
treed8de02ff0ef1e60ae9f0b8c4b1616db3b0ef6180
parent1263a3a1a83ac160db9cc3ed9a4947c31a7bc95f (diff)
downloadCastXML-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.txt40
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