CMake-built shared library is missing SONAME / library versioning
mbanck opened this issue · 2 comments
I tried to go through open and closed issues and couldn't find it, but I it could well be that this is a duplicate.
Anyway, the exported CMake build via -DLIBINT2_BUILD_SHARED_AND_STATIC_LIBS=ON
just builds libint2.so
, no library versioning.
2.7.1:
libint2-2.7.1# objdump -x obj-x86_64-linux-gnu/libint2.so | grep SONAME
SONAME libint2.so
2.6.0:
objdump -x usr/lib/x86_64-linux-gnu/libint2.so.2.0.3 | grep SONAME
SONAME libint2.so.2
I browsed through CMakeLists.txt
and couldn't find anything about library versioning either, am I missing something?
cc @loriab though I have the nagging feeling we discussed this already...
What I think needs changing is this:
--- ./export/cmake/CMakeLists.txt.export.orig 2022-01-01 12:43:08.071905766 +0100
+++ ./export/cmake/CMakeLists.txt.export 2022-01-01 12:47:00.621475434 +0100
@@ -194,7 +194,7 @@
# shared and static libraries built from the same object files
if (LIBINT2_BUILD_SHARED_AND_STATIC_LIBS)
add_library(libint2 SHARED $<TARGET_OBJECTS:libint2_obj>)
- set_target_properties(libint2 PROPERTIES LIBRARY_OUTPUT_NAME int2)
+ set_target_properties(libint2 PROPERTIES LIBRARY_OUTPUT_NAME int2 VERSION 2.0.4 SOVERSION 2)
add_library(libint2-static STATIC $<TARGET_OBJECTS:libint2_obj>)
set_target_properties(libint2-static PROPERTIES ARCHIVE_OUTPUT_NAME int2)
target_include_directories(libint2-static INTERFACE
This leads to:
ibint2-2.7.1# ls -l obj-x86_64-linux-gnu/libint2.so*
lrwxrwxrwx 1 mba mba 12 Jan 1 11:58 obj-x86_64-linux-gnu/libint2.so -> libint2.so.2
lrwxrwxrwx 1 mba mba 16 Jan 1 11:58 obj-x86_64-linux-gnu/libint2.so.2 -> libint2.so.2.0.4
-rwxr-xr-x 1 mba mba 71004840 Jan 1 11:58 obj-x86_64-linux-gnu/libint2.so.2.0.4
and
libint2-2.7.1# objdump -x obj-x86_64-linux-gnu/libint2.so | grep SONAME
SONAME libint2.so.2
However, at this point, it is not yet clear to me what VERSION
actually should be, i.e. whether 2.7.1 breaks API with 2.6.0 (then SOVERSION
should be bumped to 3) or at least adds to API (then SOVERSION
should stay at 2, but VERSION
should be bumped to 2.1.0).
Ok, so I compared the shared library symbols between 2.6.0 (current Debian unstable package) and 2.7.1 (my current packaging snapshot), like this (the so.2.0.4
filename is preliminary as per the comment above):
objdump -T 2.6.0/usr/lib/x86_64-linux-gnu/libint2.so.2.0.3 | grep Base | awk '{print $7}' | sort > 2.6.0.symbols
objdump -T 2.7.1/usr/lib/x86_64-linux-gnu/libint2.so.2.0.4 | grep Base | awk '{print $7}' | sort > 2.7.1.symbols
diff -u 2.6.0.symbols 2.7.1.symbols
--- 2.6.0.symbols 2022-01-09 11:40:46.276661640 +0100
+++ 2.7.1.symbols 2022-01-09 11:40:31.765066550 +0100
@@ -4081,6 +4081,7 @@
eri3_aB_S__0__P__1___TwoPRep_unit__0__S__1___Ab__up_0_prereq
eri3_aB_S__0__S__1___TwoPRep_unit__0__S__1___Ab__up_0
eri3_aB_S__0__S__1___TwoPRep_unit__0__S__1___Ab__up_0_prereq
+__gmon_start__
HRRPart0bra0ket0d001d
HRRPart0bra0ket0d001p
HRRPart0bra0ket0d010d
@@ -4369,6 +4370,8 @@
HRRPart1bra0ket0pp100
HRRPart1bra0ket0psp
HRRPart1bra0ket0sp
+_ITM_deregisterTMCloneTable
+_ITM_registerTMCloneTable
_kinetic_D_D
_kinetic_D_D_prereq
_kinetic_D_F
@@ -5960,6 +5963,8 @@
_sphemultipole_S_P_prereq
_sphemultipole_S_S
_sphemultipole_S_S_prereq
+_ZGVN7libint211CGShellInfoINS_19CGShellOrderingDataILNS_15CGShellOrderingE6ELj4EEEE5data_E
+_ZN7libint211CGShellInfoINS_19CGShellOrderingDataILNS_15CGShellOrderingE6ELj4EEEE5data_E
_ZN7libint211OSVRR_xs_xsILi0ELi10ELi10ELb0ELb0EE7computeEPK8Libint_tPdPKdS7_S7_S7_S7_
_ZN7libint211OSVRR_xs_xsILi0ELi10ELi5ELb0ELb0EE7computeEPK8Libint_tPdPKdS7_S7_S7_S7_
_ZN7libint211OSVRR_xs_xsILi0ELi10ELi6ELb0ELb0EE7computeEPK8Libint_tPdPKdS7_S7_S7_S7_
@@ -6017,3 +6022,5 @@
_ZN7libint217GenericGaussDerivILi6ELb0EE7computeEPK8Libint_tPdPKdS7_jjjRA1_S6_
_ZN7libint217GenericGaussDerivILi7ELb0EE7computeEPK8Libint_tPdPKdS7_jjjRA1_S6_
_ZN7libint217GenericGaussDerivILi8ELb0EE7computeEPK8Libint_tPdPKdS7_jjjRA1_S6_
+_ZN7libint219CGShellOrderingDataILNS_15CGShellOrderingE6ELj4EEC1Ev
+_ZN7libint219CGShellOrderingDataILNS_15CGShellOrderingE6ELj4EEC2Ev
So it seems the ABI differences between 2.6.0 and 2.7.1 are minimal and only a few symbols got added. This makes me feel much better, and I think the above patch is appropriate.
Closed by #231.