alexreinking created this revision. alexreinking added reviewers: chandlerc, gottesmm, pmccormick. Herald added subscribers: cota, teijeong, rdzhabarov, tatianashp, msifontes, jurahul, Kayjukh, grosul1, Joonsoo, liufengdb, aartbik, lucyrfox, mgester, arpith-jacob, antiagainst, shauheen, rriddle, mehdi_amini, mgorny. Herald added a reviewer: bollu. Herald added a reviewer: sscalpone. alexreinking requested review of this revision. Herald added subscribers: cfe-commits, stephenneuendorffer, nicolasvasilache. Herald added projects: clang, MLIR.
When supplying a package with `<Project>Config.cmake` files, it is required to also supply a `<Project>ConfigVersion.cmake` file which defines compatibility with version numbers. If these files aren't distributed then supplying a version number will fail. But on the other hand, //not// supplying a version number can result in the wrong package being selected. For example, because the base LLVM package //does// supply `LLVMConfigVersion.cmake`, the following can occur: find_package(LLVM 11.0 REQUIRED) # Succeeds find_package(LLD 11.0) # Fails because there's no version config find_package(LLD) # Succeeds, finds version 10. This patch would not affect any existing uses of the CMake build/packages because the `ConfigVersion.cmake` file is ignored when no version is given and the status quo is that supplying a version fails. This patch also fixes a bug I opened a year ago here: https://bugs.llvm.org/show_bug.cgi?id=45027 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D97513 Files: clang/cmake/modules/CMakeLists.txt clang/cmake/modules/ClangConfigVersion.cmake.in flang/cmake/modules/CMakeLists.txt flang/cmake/modules/FlangConfigVersion.cmake.in lld/CMakeLists.txt lld/cmake/modules/CMakeLists.txt lld/cmake/modules/LLDConfigVersion.cmake.in mlir/CMakeLists.txt mlir/cmake/modules/CMakeLists.txt mlir/cmake/modules/MLIRConfigVersion.cmake.in polly/CMakeLists.txt polly/cmake/CMakeLists.txt polly/cmake/PollyConfigVersion.cmake.in
Index: polly/cmake/PollyConfigVersion.cmake.in =================================================================== --- /dev/null +++ polly/cmake/PollyConfigVersion.cmake.in @@ -0,0 +1,13 @@ +set(PACKAGE_VERSION "@PACKAGE_VERSION@") + +# Polly is API-compatible only with matching major.minor versions +# and patch versions not less than that requested. +if("@POLLY_VERSION_MAJOR@.@POLLY_VERSION_MINOR@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" + AND NOT "@POLLY_VERSION_PATCH@" VERSION_LESS "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_COMPATIBLE 1) + if("@POLLY_VERSION_PATCH@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_EXACT 1) + endif() +endif() Index: polly/cmake/CMakeLists.txt =================================================================== --- polly/cmake/CMakeLists.txt +++ polly/cmake/CMakeLists.txt @@ -71,6 +71,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfig.cmake.in ${POLLY_CONFIG_CMAKE_DIR}/PollyConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfigVersion.cmake.in + ${POLLY_CONFIG_CMAKE_DIR}/PollyConfigVersion.cmake + @ONLY) file(GENERATE OUTPUT ${POLLY_CONFIG_CMAKE_DIR}/${POLLY_EXPORTS_FILE_NAME} @@ -120,6 +124,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfigVersion.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfigVersion.cmake + @ONLY) file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${POLLY_EXPORTS_FILE_NAME} CONTENT "${POLLY_EXPORTS}") @@ -128,6 +136,7 @@ install( FILES "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfigVersion.cmake" "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${POLLY_EXPORTS_FILE_NAME}" DESTINATION "${POLLY_INSTALL_PACKAGE_DIR}") endif () Index: polly/CMakeLists.txt =================================================================== --- polly/CMakeLists.txt +++ polly/CMakeLists.txt @@ -5,6 +5,7 @@ # Where is LLVM installed? find_package(LLVM CONFIG REQUIRED) + set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LLVM_CMAKE_DIR}) include(HandleLLVMOptions) include(AddLLVM) @@ -48,6 +49,14 @@ set(POLLY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(POLLY_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) +# Compute the Polly version from the LLVM version. +string(REGEX MATCH "([0-9]+)\\.([0-9]+)(\\.([0-9]+))?" POLLY_VERSION ${PACKAGE_VERSION}) +message(STATUS "Polly version: ${POLLY_VERSION}") + +set(POLLY_VERSION_MAJOR "${CMAKE_MATCH_1}") +set(POLLY_VERSION_MINOR "${CMAKE_MATCH_2}") +set(POLLY_VERSION_PATCH "${CMAKE_MATCH_4}") # Using 4 instead of 3 skips the dot before the patch number. + # Add path for custom modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} Index: mlir/cmake/modules/MLIRConfigVersion.cmake.in =================================================================== --- /dev/null +++ mlir/cmake/modules/MLIRConfigVersion.cmake.in @@ -0,0 +1,13 @@ +set(PACKAGE_VERSION "@PACKAGE_VERSION@") + +# MLIR is API-compatible only with matching major.minor versions +# and patch versions not less than that requested. +if("@MLIR_VERSION_MAJOR@.@MLIR_VERSION_MINOR@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" + AND NOT "@MLIR_VERSION_PATCH@" VERSION_LESS "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_COMPATIBLE 1) + if("@MLIR_VERSION_PATCH@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_EXACT 1) + endif() +endif() Index: mlir/cmake/modules/CMakeLists.txt =================================================================== --- mlir/cmake/modules/CMakeLists.txt +++ mlir/cmake/modules/CMakeLists.txt @@ -28,6 +28,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/MLIRConfig.cmake.in ${mlir_cmake_builddir}/MLIRConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/MLIRConfigVersion.cmake.in + ${mlir_cmake_builddir}/MLIRConfigVersion.cmake + @ONLY) set(MLIR_CONFIG_CMAKE_DIR) set(MLIR_CONFIG_LLVM_CMAKE_DIR) set(MLIR_CONFIG_EXPORTS_FILE) @@ -63,6 +67,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/MLIRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MLIRConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/MLIRConfigVersion.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MLIRConfigVersion.cmake + @ONLY) set(MLIR_CONFIG_CODE) set(MLIR_CONFIG_CMAKE_DIR) set(MLIR_CONFIG_LLVM_CMAKE_DIR) @@ -80,6 +88,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MLIRConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MLIRConfigVersion.cmake ${CMAKE_CURRENT_SOURCE_DIR}/AddMLIR.cmake DESTINATION ${MLIR_INSTALL_PACKAGE_DIR} COMPONENT mlir-cmake-exports) Index: mlir/CMakeLists.txt =================================================================== --- mlir/CMakeLists.txt +++ mlir/CMakeLists.txt @@ -23,6 +23,8 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") + + set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") endif() set(MLIR_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) @@ -33,6 +35,14 @@ set(MLIR_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) set(MLIR_TOOLS_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) +# Compute the MLIR version from the LLVM version. +string(REGEX MATCH "([0-9]+)\\.([0-9]+)(\\.([0-9]+))?" MLIR_VERSION ${PACKAGE_VERSION}) +message(STATUS "MLIR version: ${MLIR_VERSION}") + +set(MLIR_VERSION_MAJOR "${CMAKE_MATCH_1}") +set(MLIR_VERSION_MINOR "${CMAKE_MATCH_2}") +set(MLIR_VERSION_PATCH "${CMAKE_MATCH_4}") # Using 4 instead of 3 skips the dot before the patch number. + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") include(AddMLIR) Index: lld/cmake/modules/LLDConfigVersion.cmake.in =================================================================== --- /dev/null +++ lld/cmake/modules/LLDConfigVersion.cmake.in @@ -0,0 +1,13 @@ +set(PACKAGE_VERSION "@PACKAGE_VERSION@") + +# LLD is API-compatible only with matching major.minor versions +# and patch versions not less than that requested. +if("@LLD_VERSION_MAJOR@.@LLD_VERSION_MINOR@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" + AND NOT "@LLD_VERSION_PATCH@" VERSION_LESS "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_COMPATIBLE 1) + if("@LLD_VERSION_PATCH@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_EXACT 1) + endif() +endif() Index: lld/cmake/modules/CMakeLists.txt =================================================================== --- lld/cmake/modules/CMakeLists.txt +++ lld/cmake/modules/CMakeLists.txt @@ -23,6 +23,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/LLDConfig.cmake.in ${lld_cmake_builddir}/LLDConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/LLDConfigVersion.cmake.in + ${lld_cmake_builddir}/LLDConfigVersion.cmake + @ONLY) set(LLD_CONFIG_CMAKE_DIR) set(LLD_CONFIG_LLVM_CMAKE_DIR) set(LLD_CONFIG_EXPORTS_FILE) @@ -46,6 +50,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/LLDConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/LLDConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/LLDConfigVersion.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/LLDConfigVersion.cmake + @ONLY) set(LLD_CONFIG_CODE) set(LLD_CONFIG_CMAKE_DIR) set(LLD_CONFIG_EXPORTS_FILE) @@ -59,6 +67,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/LLDConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/LLDConfigVersion.cmake DESTINATION ${LLD_INSTALL_PACKAGE_DIR} COMPONENT lld-cmake-exports) Index: lld/CMakeLists.txt =================================================================== --- lld/CMakeLists.txt +++ lld/CMakeLists.txt @@ -119,14 +119,13 @@ endif() # Compute the LLD version from the LLVM version. -string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLD_VERSION +string(REGEX MATCH "([0-9]+)\\.([0-9]+)(\\.([0-9]+))?" LLD_VERSION ${PACKAGE_VERSION}) message(STATUS "LLD version: ${LLD_VERSION}") -string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" LLD_VERSION_MAJOR - ${LLD_VERSION}) -string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" LLD_VERSION_MINOR - ${LLD_VERSION}) +set(LLD_VERSION_MAJOR "${CMAKE_MATCH_1}") +set(LLD_VERSION_MINOR "${CMAKE_MATCH_2}") +set(LLD_VERSION_PATCH "${CMAKE_MATCH_4}") # Using 4 instead of 3 skips the dot before the patch number. # Configure the Version.inc file. configure_file( Index: flang/cmake/modules/FlangConfigVersion.cmake.in =================================================================== --- /dev/null +++ flang/cmake/modules/FlangConfigVersion.cmake.in @@ -0,0 +1,13 @@ +set(PACKAGE_VERSION "@PACKAGE_VERSION@") + +# Flang is API-compatible only with matching major.minor versions +# and patch versions not less than that requested. +if("@FLANG_VERSION_MAJOR@.@FLANG_VERSION_MINOR@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" + AND NOT "@FLANG_VERSION_PATCHLEVEL@" VERSION_LESS "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_COMPATIBLE 1) + if("@FLANG_VERSION_PATCHLEVEL@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_EXACT 1) + endif() +endif() Index: flang/cmake/modules/CMakeLists.txt =================================================================== --- flang/cmake/modules/CMakeLists.txt +++ flang/cmake/modules/CMakeLists.txt @@ -23,6 +23,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/FlangConfig.cmake.in ${flang_cmake_builddir}/FlangConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/FlangConfigVersion.cmake.in + ${flang_cmake_builddir}/FlangConfigVersion.cmake + @ONLY) set(FLANG_CONFIG_CMAKE_DIR) set(FLANG_CONFIG_LLVM_CMAKE_DIR) set(FLANG_CONFIG_EXPORTS_FILE) @@ -49,6 +53,11 @@ ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/FlangConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/FlangConfigVersion.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/FlangConfigVersion.cmake + @ONLY) + set(FLANG_CONFIG_CODE) set(FLANG_CONFIG_CMAKE_DIR) set(FLANG_CONFIG_EXPORTS_FILE) @@ -62,6 +71,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/FlangConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/FlangConfigVersion.cmake DESTINATION ${FLANG_INSTALL_PACKAGE_DIR} COMPONENT flang-cmake-exports) Index: clang/cmake/modules/ClangConfigVersion.cmake.in =================================================================== --- /dev/null +++ clang/cmake/modules/ClangConfigVersion.cmake.in @@ -0,0 +1,13 @@ +set(PACKAGE_VERSION "@PACKAGE_VERSION@") + +# Clang is API-compatible only with matching major.minor versions +# and patch versions not less than that requested. +if("@CLANG_VERSION_MAJOR@.@CLANG_VERSION_MINOR@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" + AND NOT "@CLANG_VERSION_PATCHLEVEL@" VERSION_LESS "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_COMPATIBLE 1) + if("@CLANG_VERSION_PATCHLEVEL@" VERSION_EQUAL + "${PACKAGE_FIND_VERSION_PATCH}") + set(PACKAGE_VERSION_EXACT 1) + endif() +endif() Index: clang/cmake/modules/CMakeLists.txt =================================================================== --- clang/cmake/modules/CMakeLists.txt +++ clang/cmake/modules/CMakeLists.txt @@ -23,6 +23,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in ${clang_cmake_builddir}/ClangConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfigVersion.cmake.in + ${clang_cmake_builddir}/ClangConfigVersion.cmake + @ONLY) set(CLANG_CONFIG_CMAKE_DIR) set(CLANG_CONFIG_LLVM_CMAKE_DIR) set(CLANG_CONFIG_EXPORTS_FILE) @@ -48,6 +52,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake @ONLY) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfigVersion.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfigVersion.cmake + @ONLY) set(CLANG_CONFIG_CODE) set(CLANG_CONFIG_CMAKE_DIR) set(CLANG_CONFIG_EXPORTS_FILE) @@ -61,6 +69,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfigVersion.cmake ${CMAKE_CURRENT_SOURCE_DIR}/AddClang.cmake DESTINATION ${CLANG_INSTALL_PACKAGE_DIR} COMPONENT clang-cmake-exports)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits