From 683ae1c827dae7240ff7575d4de136056de4ba28 Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 20:22:44 +0000 Subject: [PATCH 1/9] Move creation of ClangTargets and installation of ClangConfig.cmake from ./CMakeLists.txt -> ./cmake/modules/CMakeLists.txt. This matches LLVM. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274157 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit 8c3317aacc986e8b5b624097b178a14eddecd9b6) Conflicts: CMakeLists.txt --- CMakeLists.txt | 23 +---------------------- cmake/modules/CMakeLists.txt | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 cmake/modules/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index c6a90e4ac80..bb6b3de8812 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -606,28 +606,7 @@ endif() if (CLANG_BUILT_STANDALONE OR CMAKE_VERSION VERSION_EQUAL 3 OR CMAKE_VERSION VERSION_GREATER 3) - # 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(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) - - install(FILES - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/ClangConfig.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) + add_subdirectory(cmake/modules) endif () if (CLANG_ENABLE_BOOTSTRAP) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt new file mode 100644 index 00000000000..7906e4f4d2d --- /dev/null +++ b/cmake/modules/CMakeLists.txt @@ -0,0 +1,22 @@ +# 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 lib${LLVM_LIBDIR_SUFFIX}/cmake/clang) +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 /lib/cmake/clang/ClangConfig.cmake file so that +# find_package(Clang) works. Install the target list with it. +install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) + +install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake + DESTINATION lib${LLVM_LIBDIR_SUFFIX}/cmake/clang) + +# 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}/ClangConfig.cmake + ${CLANG_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/clang/ClangConfig.cmake + COPYONLY) From bb9debc9cbe8d955571a69babfb15d97f920fc94 Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 20:22:46 +0000 Subject: [PATCH 2/9] Replace paths with the same value as CLANG_INSTALL_PACKAGE_DIR with a deref of the variable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274158 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit f195b05e23957a8703b8e3bef29f16034d976540) --- cmake/modules/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 7906e4f4d2d..8eb84cd1ada 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -12,11 +12,11 @@ install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake - DESTINATION lib${LLVM_LIBDIR_SUFFIX}/cmake/clang) + DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) # 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}/ClangConfig.cmake - ${CLANG_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/clang/ClangConfig.cmake + ${CLANG_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}/ClangConfig.cmake COPYONLY) From 42346e9103ffabd20a44451317e8e80c1e1999ed Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 21:12:38 +0000 Subject: [PATCH 3/9] Copy ClangConfig.cmake to ${CMAKE_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR} instead of to ${CLANG_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}. This is an obvious bug since ClangConfig.cmake looks for ClangTargets.cmake in ${CMAKE_CURRENT_LIST_DIR}. But ClangTargets.cmake is in ${CMAKE_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}, so it will always fail with an in tree build. In the case where clang is built out of tree, this is still correct since CMAKE_BINARY_DIR and CLANG_BINARY_DIR will be the same. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274168 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit 21ae2c7c2e7179fa49c06843d22a8392845f3983) --- cmake/modules/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 8eb84cd1ada..f0af3e9da71 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -18,5 +18,5 @@ install(FILES # can build against a build directory of Clang more easily. configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake - ${CLANG_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}/ClangConfig.cmake + ${clang_cmake_builddir}/ClangConfig.cmake COPYONLY) From 77fa0a9cbcf48e146ecc5db42abc0a453188e0df Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 21:59:14 +0000 Subject: [PATCH 4/9] Instead of just copying ClangConfig.cmake, configure it using ClangConfig.cmake.in. This will allow for cmake to expand variables in ClangConfig.cmake for downstream users. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274176 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit 4e19e514672a6a94019fde624a35d9653dd957d2) --- cmake/modules/CMakeLists.txt | 24 +++++++++++-------- ...ClangConfig.cmake => ClangConfig.cmake.in} | 0 2 files changed, 14 insertions(+), 10 deletions(-) rename cmake/modules/{ClangConfig.cmake => ClangConfig.cmake.in} (100%) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index f0af3e9da71..0bd630ffceb 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -3,20 +3,24 @@ # the usual CMake convention seems to be ${Project}Targets.cmake. set(CLANG_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/clang) 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 /lib/cmake/clang/ClangConfig.cmake file so that -# find_package(Clang) works. Install the target list with it. +# Generate ClangConfig.cmake for the build tree. +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in + ${clang_cmake_builddir}/ClangConfig.cmake + @ONLY) + +# Generate ClangConfig.cmake for the install tree. +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake + @ONLY) + install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) install(FILES - ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) - -# 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}/ClangConfig.cmake - ${clang_cmake_builddir}/ClangConfig.cmake - COPYONLY) diff --git a/cmake/modules/ClangConfig.cmake b/cmake/modules/ClangConfig.cmake.in similarity index 100% rename from cmake/modules/ClangConfig.cmake rename to cmake/modules/ClangConfig.cmake.in From d93d81ec6b9e20e4c91ed4695519f1dd19423899 Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 21:59:15 +0000 Subject: [PATCH 5/9] Follow LLVM's example and only install Clang{Config,Target}.cmake when LLVM_INSTALL_TOOLCHAIN_ONLY is disabled. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274177 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit f6b8f1c48fe7bcf2116ed56a9ec74e0fa40b2621) --- cmake/modules/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 0bd630ffceb..86ab001d2c3 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -19,8 +19,10 @@ configure_file( ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake @ONLY) -install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) +if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake - DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake + DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) +endif() From 6df55221d1e804a9c48efbcd0f1f40bc5c1312f4 Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 21:59:19 +0000 Subject: [PATCH 6/9] Instead of hard coding the ClangTargets location to /ClangTargets.cmake, follow LLVM's example and use a pre-computed cmake variable @CLANG_CONFIG_EXPORTS_FILE@. This just makes ClangConfig more consistent with LLVMConfig. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274178 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit fc0ee61d45c6e960d2e352ceab582512e06005a6) Conflicts: cmake/modules/ClangConfig.cmake.in --- cmake/modules/CMakeLists.txt | 14 ++++++++++++++ cmake/modules/ClangConfig.cmake.in | 8 +++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 86ab001d2c3..6b655b07969 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -8,12 +8,26 @@ get_property(CLANG_EXPORTS GLOBAL PROPERTY CLANG_EXPORTS) export(TARGETS ${CLANG_EXPORTS} FILE ${clang_cmake_builddir}/ClangTargets.cmake) # Generate ClangConfig.cmake for the build tree. +set(CLANG_CONFIG_CMAKE_DIR "${clang_cmake_builddir}") +set(CLANG_CONFIG_EXPORTS_FILE "${clang_cmake_builddir}/ClangTargets.cmake") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in ${clang_cmake_builddir}/ClangConfig.cmake @ONLY) # Generate ClangConfig.cmake for the install tree. +set(CLANG_CONFIG_CODE " +# Compute the installation prefix from this LLVMConfig.cmake file location. +get_filename_component(CLANG_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)") +# Construct the proper number of get_filename_component(... PATH) +# calls to compute the installation prefix. +string(REGEX REPLACE "/" ";" _count "${CLANG_INSTALL_PACKAGE_DIR}") +foreach(p ${_count}) + set(CLANG_CONFIG_CODE "${CLANG_CONFIG_CODE} +get_filename_component(CLANG_INSTALL_PREFIX \"\${CLANG_INSTALL_PREFIX}\" PATH)") +endforeach(p) +set(CLANG_CONFIG_CMAKE_DIR "\${CLANG_INSTALL_PREFIX}/\${CLANG_INSTALL_PACKAGE_DIR}") +set(CLANG_CONFIG_EXPORTS_FILE "\${CLANG_CMAKE_DIR}/ClangTargets.cmake") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake diff --git a/cmake/modules/ClangConfig.cmake.in b/cmake/modules/ClangConfig.cmake.in index f052bb9e8c8..2095e5d282b 100644 --- a/cmake/modules/ClangConfig.cmake.in +++ b/cmake/modules/ClangConfig.cmake.in @@ -4,5 +4,11 @@ # uses LLVM's. When it does, we should move this file to ClangConfig.cmake.in # and call configure_file() on it. +find_package(LLVM REQUIRED CONFIG) + +@CLANG_CONFIG_CODE@ + +set(CLANG_CMAKE_DIR "@CLANG_CONFIG_CMAKE_DIR@") + # Provide all our library targets to users. -include("${CMAKE_CURRENT_LIST_DIR}/ClangTargets.cmake") +include("@CLANG_CONFIG_EXPORTS_FILE@") From f57f53ad95fe6fdbcf353b883e38a64440e8b5d4 Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 21:59:20 +0000 Subject: [PATCH 7/9] Unset some variables after we are done using them to configure ClangConfig.cmake.in files. This ensures that the values do not bleed over in between computations. It may make sense in the future to just refactor this code into functions to provide "true scoping". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274179 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit c07f1963bcc44e0c227b29d7c1dc2c1673d5f056) --- cmake/modules/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 6b655b07969..9c4b4bff72a 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -14,6 +14,8 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in ${clang_cmake_builddir}/ClangConfig.cmake @ONLY) +set(CLANG_CONFIG_CMAKE_DIR) +set(CLANG_CONFIG_EXPORTS_FILE) # Generate ClangConfig.cmake for the install tree. set(CLANG_CONFIG_CODE " @@ -32,6 +34,9 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake @ONLY) +set(CLANG_CONFIG_CODE) +set(CLANG_CONFIG_CMAKE_DIR) +set(CLANG_CONFIG_EXPORTS_FILE) if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) From 5a887dc28852c59c711dbda7635e3170cce770ea Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 29 Jun 2016 21:59:23 +0000 Subject: [PATCH 8/9] Store all of the targets exported in the variable CLANG_EXPORTED_TARGETS. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274180 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit 5a588f187eea527417e687b40eba7d6d2abc50ba) --- cmake/modules/CMakeLists.txt | 2 +- cmake/modules/ClangConfig.cmake.in | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 9c4b4bff72a..3cc808a46b9 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -28,7 +28,7 @@ foreach(p ${_count}) set(CLANG_CONFIG_CODE "${CLANG_CONFIG_CODE} get_filename_component(CLANG_INSTALL_PREFIX \"\${CLANG_INSTALL_PREFIX}\" PATH)") endforeach(p) -set(CLANG_CONFIG_CMAKE_DIR "\${CLANG_INSTALL_PREFIX}/\${CLANG_INSTALL_PACKAGE_DIR}") +set(CLANG_CONFIG_CMAKE_DIR "\${CLANG_INSTALL_PREFIX}/${CLANG_INSTALL_PACKAGE_DIR}") set(CLANG_CONFIG_EXPORTS_FILE "\${CLANG_CMAKE_DIR}/ClangTargets.cmake") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in diff --git a/cmake/modules/ClangConfig.cmake.in b/cmake/modules/ClangConfig.cmake.in index 2095e5d282b..38c6c03a1c9 100644 --- a/cmake/modules/ClangConfig.cmake.in +++ b/cmake/modules/ClangConfig.cmake.in @@ -8,6 +8,7 @@ find_package(LLVM REQUIRED CONFIG) @CLANG_CONFIG_CODE@ +set(CLANG_EXPORTED_TARGETS "@CLANG_EXPORTS@") set(CLANG_CMAKE_DIR "@CLANG_CONFIG_CMAKE_DIR@") # Provide all our library targets to users. From c06140049697e07b0f84d6d4283006c54c7599fc Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Thu, 30 Jun 2016 05:51:18 +0000 Subject: [PATCH 9/9] [cmake] Remove stale comment. NFC. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274212 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit ce1f307b91f539c75b14cdbcd48ea0cc3218e8fb) --- cmake/modules/ClangConfig.cmake.in | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cmake/modules/ClangConfig.cmake.in b/cmake/modules/ClangConfig.cmake.in index 38c6c03a1c9..a946944dd99 100644 --- a/cmake/modules/ClangConfig.cmake.in +++ b/cmake/modules/ClangConfig.cmake.in @@ -1,9 +1,5 @@ # 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. - find_package(LLVM REQUIRED CONFIG) @CLANG_CONFIG_CODE@