From 5ebbd50cffc013a7dd0f3b1eaaa83d199e8e47fd Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sun, 24 Jul 2016 00:14:20 +0530 Subject: [PATCH] cmake: add soname info to libgd.so Pull out the library versioning info out of configure and into a common script that both cmake & autotools can run. This way we have a single source of truth for the versioning info. --- CMakeLists.txt | 11 +++++++++++ config/getlib.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ configure.ac | 25 +++++++++++-------------- src/CMakeLists.txt | 2 ++ 4 files changed, 66 insertions(+), 14 deletions(-) create mode 100755 config/getlib.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c8ad34b..9fe2eb4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,6 +78,17 @@ else (USE_EXT_GD) SET(GD_VERSION_INT "2020555") + MACRO(GV_LT VER VAR) + execute_process( + COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/config/getlib.sh ${VER} + OUTPUT_VARIABLE ${VAR} + ) + ENDMACRO(GV_LT) + + GV_LT(SONAME GDLIB_LIB_SOVERSION) + GV_LT(VERSION GDLIB_LIB_VERSION) + MESSAGE(STATUS "gd shared lib version ${GDLIB_LIB_SOVERSION} (${GDLIB_LIB_VERSION})") + SET(CMAKE_REQUIRED_INCLUDES "/usr/include" "/usr/local/include") include(CheckIncludeFiles) diff --git a/config/getlib.sh b/config/getlib.sh new file mode 100755 index 00000000..4835cf6c --- /dev/null +++ b/config/getlib.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +GETVER="${0%/*}/getver.pl" +GDLIB_MAJOR=$("${GETVER}" MAJOR) +GDLIB_MINOR=$("${GETVER}" MINOR) +GDLIB_REVISION=$("${GETVER}" RELEASE) + +# Dynamic library version information +# See http://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info + +GDLIB_LT_CURRENT=3 +# This is the version where the soname (current above) changes. We use it +# to reset the revision base back to zero. It's a bit of a pain, but some +# systems restrict the revision range below to [0..255] (like OS X). +GDLIB_PREV_MAJOR=2 +GDLIB_PREV_MINOR=2 +# This isn't 100% correct, but it tends to be a close enough approximation +# for how we manage the codebase. It's rare to do a release that doesn't +# modify the library since this project is centered around the library. +GDLIB_LT_REVISION=$(( ((GDLIB_MAJOR - GDLIB_PREV_MAJOR) << 6) | ((GDLIB_MINOR - GDLIB_PREV_MINOR) << 3) | GDLIB_REVISION )) +GDLIB_LT_AGE=0 + +# The first three fields we feed into libtool and the OS target determines how +# they get used. The last two fields we feed into cmake. We use the same rules +# as Linux SONAME versioning in libtool, but cmake should handle it for us. +case $1 in +CURRENT) + printf '%s' "${GDLIB_LT_CURRENT}" + ;; +REVISION) + printf '%s' "${GDLIB_LT_REVISION}" + ;; +AGE) + printf '%s' "${GDLIB_LT_AGE}" + ;; +VERSION) + printf '%s' "$(( GDLIB_LT_CURRENT - GDLIB_LT_AGE )).${GDLIB_LT_AGE}.${GDLIB_LT_REVISION}" + ;; +SONAME) + printf '%s' "$(( GDLIB_LT_CURRENT - GDLIB_LT_AGE ))" + ;; +esac diff --git a/configure.ac b/configure.ac index 91643bd6..c3fb034e 100644 --- a/configure.ac +++ b/configure.ac @@ -34,20 +34,17 @@ AC_SUBST(GDLIB_REVISION) AC_SUBST(GDLIB_EXTRA) AC_SUBST(GDLIB_VERSION) -# Dynamic library version information -# See http://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info - -GDLIB_LT_CURRENT=3 -dnl This is the version where the soname (current above) changes. We use it -dnl to reset the revision base back to zero. It's a bit of a pain, but some -dnl systems restrict the revision range below to [0..255] (like OS X). -GDLIB_PREV_MAJOR=2 -GDLIB_PREV_MINOR=2 -dnl This isn't 100% correct, but it tends to be a close enough approximation -dnl for how we manage the codebase. It's rare to do a release that doesn't -dnl modify the library since this project is centered around the library. -GDLIB_LT_REVISION=$(( ((GDLIB_MAJOR - GDLIB_PREV_MAJOR) << 6) | ((GDLIB_MINOR - GDLIB_PREV_MINOR) << 3) | GDLIB_REVISION )) -GDLIB_LT_AGE=0 +dnl Keep the libtool version details in an external script so cmake can +dnl access the values too. +define([lt_gv], [config/getlib.sh ]$1) +m4_define([gd_LT_CURRENT], esyscmd(lt_gv(CURRENT))) +m4_define([gd_LT_REVISION], esyscmd(lt_gv(REVISION))) +m4_define([gd_LT_AGE], esyscmd(lt_gv(AGE))) + +GDLIB_LT_CURRENT=gd_LT_CURRENT +GDLIB_LT_REVISION=gd_LT_REVISION +GDLIB_LT_AGE=gd_LT_AGE + AC_SUBST(GDLIB_LT_CURRENT) AC_SUBST(GDLIB_LT_REVISION) AC_SUBST(GDLIB_LT_AGE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08fd6991..a621fe1e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -76,6 +76,8 @@ include(GNUInstallDirs) if (BUILD_SHARED_LIBS) add_library(${GD_LIB} ${LIBGD_SRC_FILES}) set_target_properties(${GD_LIB} PROPERTIES + SOVERSION ${GDLIB_LIB_SOVERSION} + VERSION ${GDLIB_LIB_VERSION} C_VISIBILITY_PRESET hidden CXX_VISIBILITY_PRESET hidden )