evaleev / libint

Libint: high-performance library for computing Gaussian integrals in quantum mechanics
Other
218 stars 97 forks source link

CMake-built shared library is missing SONAME / library versioning #229

Closed mbanck closed 6 months ago

mbanck commented 2 years ago

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).

mbanck commented 2 years ago

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.

JonathonMisiewicz commented 6 months ago

Closed by #231.