
Before this patch, the write_basic_package_version_file() function of the CMakePackageConfigHelpers module always emitted an architecture check, even if the ARCH_INDEPENDENT option was specified. While this is not an issue when configuring builds, as the check is skipped, this can create issues when the "arch independent" version files are installed in the datadir (e.g. /usr/share) in a MultiArch environment like Debian, where different architecture packages of the same libraries can be coinstalled; as the amd64 version of a given library contains "8 * 8" in the file, while the i386 one contains "4 * 8", there's a conflict, as files in /usr/share are expected to be identical across architectures. This patch fixes this issue by only emitting the architecture check code if needed; when ARCH_INDEPENDENT is specified, no code is written at all. Here's a diff between the version files generated before and after this patch: diff -u old/indep.cmake new/indep.cmake --- old/indep.cmake 2023-01-29 13:43:04.840671117 +0100 +++ new/indep.cmake 2023-01-29 13:57:28.475191551 +0100 @@ -52,19 +52,3 @@ endif() -# if the installed project requested no architecture check, don't perform the check -if("TRUE") - 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 "8" 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 "8") - math(EXPR installedBits "8 * 8") - set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") - set(PACKAGE_VERSION_UNSUITABLE TRUE) -endif() diff -u old/no-indep.cmake new/no-indep.cmake --- old/no-indep.cmake 2023-01-29 13:42:05.010710508 +0100 +++ new/no-indep.cmake 2023-01-29 13:57:40.914237219 +0100 @@ -52,13 +52,8 @@ endif() -# if the installed project requested no architecture check, don't perform the check -if("FALSE") - 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 "8" STREQUAL "") +if(CMAKE_SIZEOF_VOID_P STREQUAL "" OR "8" STREQUAL "") return() endif() Fixes: #24375
75 lines
3.2 KiB
CMake
75 lines
3.2 KiB
CMake
# 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 and minor versions are 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]+)\\.([0-9]+)")
|
|
set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
|
|
set(CVF_VERSION_MINOR "${CMAKE_MATCH_2}")
|
|
|
|
if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
|
|
string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
|
|
endif()
|
|
if(NOT CVF_VERSION_MINOR VERSION_EQUAL 0)
|
|
string(REGEX REPLACE "^0+" "" CVF_VERSION_MINOR "${CVF_VERSION_MINOR}")
|
|
endif()
|
|
else()
|
|
set(CVF_VERSION_MAJOR "@CVF_VERSION@")
|
|
set(CVF_VERSION_MINOR "")
|
|
endif()
|
|
|
|
if(PACKAGE_FIND_VERSION_RANGE)
|
|
# both endpoints of the range must have the expected major and minor versions
|
|
math (EXPR CVF_VERSION_MINOR_NEXT "${CVF_VERSION_MINOR} + 1")
|
|
if (NOT (PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
|
|
AND PACKAGE_FIND_VERSION_MIN_MINOR STREQUAL CVF_VERSION_MINOR)
|
|
OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE"
|
|
AND NOT (PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR
|
|
AND PACKAGE_FIND_VERSION_MAX_MINOR STREQUAL CVF_VERSION_MINOR))
|
|
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE"
|
|
AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL ${CVF_VERSION_MAJOR}.${CVF_VERSION_MINOR_NEXT})))
|
|
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
|
elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
|
|
AND PACKAGE_FIND_VERSION_MIN_MINOR STREQUAL CVF_VERSION_MINOR
|
|
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(NOT PACKAGE_FIND_VERSION_MAJOR VERSION_EQUAL 0)
|
|
string(REGEX REPLACE "^0+" "" PACKAGE_FIND_VERSION_MAJOR "${PACKAGE_FIND_VERSION_MAJOR}")
|
|
endif()
|
|
if(NOT PACKAGE_FIND_VERSION_MINOR VERSION_EQUAL 0)
|
|
string(REGEX REPLACE "^0+" "" PACKAGE_FIND_VERSION_MINOR "${PACKAGE_FIND_VERSION_MINOR}")
|
|
endif()
|
|
|
|
if((PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) AND
|
|
(PACKAGE_FIND_VERSION_MINOR STREQUAL CVF_VERSION_MINOR))
|
|
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()
|
|
|
|
@CVF_ARCH_INDEPENDENT_CHECK@
|