From ffccf1fa8e976c6876a3eb6854553bd1002de9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Wed, 6 Dec 2023 21:04:40 +0100 Subject: [PATCH] Add cmake version file --- CMakeLists.txt | 18 +++++-- cmake/OpenJPEGConfigVersion.cmake.in | 70 ++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 cmake/OpenJPEGConfigVersion.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 8acca1663..e38518de2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,17 +313,29 @@ if (${CMAKE_VERSION} VERSION_LESS 3.0) ${${OPENJPEG_NAMESPACE}_BINARY_DIR}/OpenJPEGConfig.cmake @ONLY ) + set(CVF_VERSION ${OPENJPEG_VERSION}) + set(CVF_ARCH_INDEPENDENT FALSE) + configure_file( + ${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/OpenJPEGConfigVersion.cmake.in + ${${OPENJPEG_NAMESPACE}_BINARY_DIR}/OpenJPEGConfigVersion.cmake + @ONLY) else() include(CMakePackageConfigHelpers) configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/OpenJPEGConfig.cmake.in ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake INSTALL_DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR} PATH_VARS CMAKE_INSTALL_INCLUDEDIR) + write_basic_package_version_file( + ${OPENJPEG_BINARY_DIR}/OpenJPEGConfigVersion.cmake + COMPATIBILITY SameMajorVersion + VERSION ${OPENJPEG_VERSION}) endif() -install( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake - DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR} -) +install( + FILES + ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake + ${OPENJPEG_BINARY_DIR}/OpenJPEGConfigVersion.cmake + DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR}) #----------------------------------------------------------------------------- diff --git a/cmake/OpenJPEGConfigVersion.cmake.in b/cmake/OpenJPEGConfigVersion.cmake.in new file mode 100644 index 000000000..cf73f603d --- /dev/null +++ b/cmake/OpenJPEGConfigVersion.cmake.in @@ -0,0 +1,70 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, +# but only if the requested major version is the same as the current one. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "@CVF_VERSION@") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + + if("@CVF_VERSION@" MATCHES "^([0-9]+)\\.") + set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") + if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0) + string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}") + endif() + else() + set(CVF_VERSION_MAJOR "@CVF_VERSION@") + endif() + + if(PACKAGE_FIND_VERSION_RANGE) + # both endpoints of the range must have the expected major version + math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1") + if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR + AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + else() + if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("@CVF_ARCH_INDEPENDENT@") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "@CMAKE_SIZEOF_VOID_P@") + math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif()