From ed8bca4f42435e2e0ac8ee63b273476a7183f696 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 5 Nov 2014 23:14:59 +0000 Subject: [PATCH] Make it easier to build against a pre-built Clang package with CMake Installing /share/clang/cmake/ClangConfig.cmake makes CMake's builtin find_package() utility work with Clang. This also allows downstream consumers of Clang to statically link against libraries like clangAST and have that pull in dependencies like clangBasic and LLVMSupport. See the CMake docs on packages: http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html llvm-svn: 221411 --- clang/CMakeLists.txt | 23 +++++++++++++++++++++++ clang/cmake/modules/ClangConfig.cmake | 8 ++++++++ 2 files changed, 31 insertions(+) create mode 100644 clang/cmake/modules/ClangConfig.cmake diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 02374e20f439..ba3db6c141e4 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -337,6 +337,7 @@ macro(add_clang_library name) ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} RUNTIME DESTINATION bin) endif() + set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) else() # Add empty "phony" target add_custom_target(${name}) @@ -478,3 +479,25 @@ endif() set(CLANG_ORDER_FILE "" CACHE FILEPATH "Order file to use when compiling clang in order to improve startup time.") + +# Generate a list of CMake library targets so that other CMake projects can +# link against them. LLVM calls its version of this file LLVMExports.cmake, but +# the usual CMake convention seems to be ${Project}Targets.cmake. +set(CLANG_INSTALL_PACKAGE_DIR share/clang/cmake) +set(clang_cmake_builddir "${CMAKE_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}") +get_property(CLANG_EXPORTS GLOBAL PROPERTY CLANG_EXPORTS) +export(TARGETS ${CLANG_EXPORTS} FILE ${clang_cmake_builddir}/ClangTargets.cmake) + +# Install a /share/clang/cmake/ClangConfig.cmake file so that +# find_package(Clang) works. Install the target list with it. +install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/ClangConfig.cmake + ${CLANG_BINARY_DIR}/share/clang/cmake/ClangTargets.cmake + DESTINATION share/clang/cmake) + +# Also copy ClangConfig.cmake to the build directory so that dependent projects +# can build against a build directory of Clang more easily. +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/ClangConfig.cmake + ${CLANG_BINARY_DIR}/share/clang/cmake/ClangConfig.cmake + COPYONLY) diff --git a/clang/cmake/modules/ClangConfig.cmake b/clang/cmake/modules/ClangConfig.cmake new file mode 100644 index 000000000000..f052bb9e8c8e --- /dev/null +++ b/clang/cmake/modules/ClangConfig.cmake @@ -0,0 +1,8 @@ +# This file allows users to call find_package(Clang) and pick up our targets. + +# Clang doesn't have any CMake configuration settings yet because it mostly +# uses LLVM's. When it does, we should move this file to ClangConfig.cmake.in +# and call configure_file() on it. + +# Provide all our library targets to users. +include("${CMAKE_CURRENT_LIST_DIR}/ClangTargets.cmake")