From d5a4d1fb9c03a2648529c9ae196ea25cdf000634 Mon Sep 17 00:00:00 2001 From: Ulysses Apokin Date: Fri, 21 Nov 2025 10:32:22 +0300 Subject: [PATCH] Added versioning for shared libraries. According to the packaging policies for shared libraries in Linux, shared libraries should look like this: libfoo.so.${MAJOR}.${MINOR}.${PATCH} The following symlinks to this library should also be created: libfoo.so .${MAJOR} -> libfoo.so .${MAJOR}.${MINOR}.${PATCH} libfoo.so -> libfoo.so .${MAJOR}.${MINOR}.${PATCH} In this case, the libfoo library package contains the following files: The library itself: libfoo.so .${MAJOR}.${MINOR}.${PATCH} As well as a symlink to it, which contains the library name and the ABI version.: libfoo.so.${MAJOR} The following symlink is placed in the libfoo-devel package: libfoo.so This is the standard packaging method for many distributions. Look: https://docs.fedoraproject.org/en-US/packaging-guidelines/#_shared_libraries https://www.debian.org/doc/debian-policy/ch-sharedlibs.html Currently, when using the cmake options EIGEN_BUILD_BLAS=ON and EIGEN_BUILD_LAPACK=ON, libraries are being built libeigen_blas.so and libeigen_lapack.so . They do not have an ABI specific, which is not suitable for packaging these libraries in distributions without violating the policy. --- CMakeLists.txt | 18 +++++++++--------- blas/CMakeLists.txt | 4 +++- lapack/CMakeLists.txt | 4 +++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36912bcde..8bbab78c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,19 +100,19 @@ endif() file(READ "${PROJECT_SOURCE_DIR}/Eigen/Version" _eigen_version_header) if (NOT DEFINED EIGEN_WORLD_VERSION) string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen_world_version_match "${_eigen_version_header}") - set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}") + set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}" CACHE STRING "") endif() if (NOT DEFINED EIGEN_MAJOR_VERSION) string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen_major_version_match "${_eigen_version_header}") - set(EIGEN_MAJOR_VERSION "${CMAKE_MATCH_1}") + set(EIGEN_MAJOR_VERSION "${CMAKE_MATCH_1}" CACHE STRING "") endif() if (NOT DEFINED EIGEN_MINOR_VERSION) string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen_minor_version_match "${_eigen_version_header}") - set(EIGEN_MINOR_VERSION "${CMAKE_MATCH_1}") + set(EIGEN_MINOR_VERSION "${CMAKE_MATCH_1}" CACHE STRING "") endif() if (NOT DEFINED EIGEN_PATCH_VERSION) string(REGEX MATCH "define[ \t]+EIGEN_PATCH_VERSION[ \t]+([0-9]+)" _eigen_patch_version_match "${_eigen_version_header}") - set(EIGEN_PATCH_VERSION "${CMAKE_MATCH_1}") + set(EIGEN_PATCH_VERSION "${CMAKE_MATCH_1}" CACHE STRING "") endif() if (NOT DEFINED EIGEN_PRERELEASE_VERSION) set(EIGEN_PRERELEASE_VERSION "dev") @@ -134,18 +134,18 @@ endif() if (NOT DEFINED EIGEN_BUILD_VERSION AND DEFINED EIGEN_GIT_REVNUM) string(SUBSTRING "${EIGEN_GIT_REVNUM}" 0 8 EIGEN_BUILD_VERSION) else() - set(EIGEN_BUILD_VERSION "") + set(EIGEN_BUILD_VERSION "" CACHE STRING "") endif() # The EIGEN_VERSION_NUMBER must be of the form . # The EIGEN_VERSION_STRING can contain the preprelease/build strings. -set(EIGEN_VERSION_NUMBER "${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION}.${EIGEN_PATCH_VERSION}") -set(EIGEN_VERSION_STRING "${EIGEN_VERSION_NUMBER}") +set(EIGEN_VERSION_NUMBER "${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION}.${EIGEN_PATCH_VERSION}" CACHE STRING "") +set(EIGEN_VERSION_STRING "${EIGEN_VERSION_NUMBER}" CACHE STRING "") if (NOT "x${EIGEN_PRERELEASE_VERSION}" STREQUAL "x") - set(EIGEN_VERSION_STRING "${EIGEN_VERSION_STRING}-${EIGEN_PRERELEASE_VERSION}") + set(EIGEN_VERSION_STRING "${EIGEN_VERSION_STRING}-${EIGEN_PRERELEASE_VERSION}" CACHE STRING "") endif() if (NOT "x${EIGEN_BUILD_VERSION}" STREQUAL "x") - set(EIGEN_VERSION_STRING "${EIGEN_VERSION_STRING}+${EIGEN_BUILD_VERSION}") + set(EIGEN_VERSION_STRING "${EIGEN_VERSION_STRING}+${EIGEN_BUILD_VERSION}" CACHE STRING "") endif() diff --git a/blas/CMakeLists.txt b/blas/CMakeLists.txt index 45488d73d..c8a28851b 100644 --- a/blas/CMakeLists.txt +++ b/blas/CMakeLists.txt @@ -21,7 +21,9 @@ list(APPEND EIGEN_BLAS_TARGETS eigen_blas_static) if (EIGEN_BUILD_SHARED_LIBS) add_library(eigen_blas SHARED ${EigenBlas_SRCS} "eigen_blas.def") target_compile_definitions(eigen_blas PUBLIC "EIGEN_BLAS_BUILD_DLL") - set_target_properties(eigen_blas PROPERTIES CXX_VISIBILITY_PRESET hidden) + set_target_properties(eigen_blas PROPERTIES CXX_VISIBILITY_PRESET hidden + VERSION ${EIGEN_VERSION_NUMBER} + SOVERSION ${EIGEN_MAJOR_VERSION}) list(APPEND EIGEN_BLAS_TARGETS eigen_blas) endif() diff --git a/lapack/CMakeLists.txt b/lapack/CMakeLists.txt index d837fff96..51bb45516 100644 --- a/lapack/CMakeLists.txt +++ b/lapack/CMakeLists.txt @@ -110,7 +110,9 @@ if (EIGEN_BUILD_SHARED_LIBS) # Build LAPACK but link BLAS. target_compile_definitions(eigen_lapack PUBLIC "EIGEN_BLAS_LINK_DLL" "EIGEN_LAPACK_BUILD_DLL") target_link_libraries(eigen_lapack eigen_blas) - set_target_properties(eigen_lapack PROPERTIES CXX_VISIBILITY_PRESET hidden) + set_target_properties(eigen_lapack PROPERTIES CXX_VISIBILITY_PRESET hidden + VERSION ${EIGEN_VERSION_NUMBER} + SOVERSION ${EIGEN_MAJOR_VERSION}) list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack) endif() -- GitLab