Hi folks,

On 10/18/21 11:13 PM, Pariksheet Nanda wrote:

The trouble is, R's installation process will only copy compiled files from ./libs/ that have exactly the extension ".so" and files ending with ".so.1" are ignored.
--snip--
So is there some mechanism to copy arbitrary files or symlinks to the final install location?  I prefer not to patch upstreams Makefile.am to remove their -version-info, but currently that's the only option I can think of.

It turns out removing -version-info or setting it to 0.0.0 will still try to link against libghmm.so.0 which is still problematic. I don't see how to disable libtool's versioning.

So after playing around, the only way I can think of doing is is eliminating the dependency file by compiling it statically and linking it with the dynamic library, because when I try merging the 2 dynamic libraries with libtool it gives the same error of not finding "libghmm.so.1". I have a patch that works on my Debian machines, but not yet on the Ubuntu CI Image:

https://gitlab.com/coregenomics/tsshmm/-/commit/e9608f01deb7baa13684d2bd65fe11e93f6c2e08

Also pasting the short diff below for search-ability.


Pariksheet

Pariksheet



$ GIT_PAGER=cat git log -1 --patch
commit e9608f01deb7baa13684d2bd65fe11e93f6c2e08 (HEAD -> master, origin/master, origin/HEAD)
Author: Pariksheet Nanda <pariksheet.na...@uconn.edu>
Date:   Tue Oct 19 01:43:09 2021 -0400

    BLD: Link bundled dependency statically to workaround load errors

diff --git a/configure.ac b/configure.ac
index 87b4d31..4d0be6e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -135,8 +135,6 @@ AS_IF([test x$with_ghmm_strategy = x],
       ) # AS_IF
 ) # AS_IF

-AC_SUBST(GHMM_LIBS, -lghmm)
-
 # If GHMM_ROOT was provided, set the header and library paths.
 #
# Check for the existance of include/ and lib/ sub-directories and if both are
@@ -180,7 +178,10 @@ AS_IF(test x$found_ghmm_system != xyes &&
       AM_CONDITIONAL(BUNDLED_GHMM, true)
       [AX_SUBDIRS_CONFIGURE([src/ghmm-0.9-rc3],
                             [[CFLAGS=$CFLAGS],
-                             [--enable-gsl=no],
+                             [--enable-static],
+                             [--disable-shared],
+                             [--with-pic],
+                             [--enable-gsl=no],
                              [--disable-gsltest],
                              [--with-rng=mt],
                              [--with-python=no],
@@ -191,8 +192,14 @@ AS_IF(test x$found_ghmm_system != xyes &&
       [AS_IF([test -d $GHMM_ROOT], [],
              AC_MSG_FAILURE(Directory of bundled GHMM not found.))]
       [AC_SUBST(GHMM_CPPFLAGS, ["-I$GHMM_ROOT/.."])]
-      # Using -rpath=. prefers the bundled over any system installation.
-      [AC_SUBST(GHMM_LDFLAGS, ["-Wl,-rpath=. -L$GHMM_ROOT/.libs"])]
+ # We don't need GMM_LIBS or GHMM_LDFLAGS because we can directly merge
+      # libraries using tsshmm_la_LIBADD per
+      # https://stackoverflow.com/a/13978856 and
+ # https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html
+      #
+      # However we now need to link against libghmm's libxml2 dependency
+      # because we're merging libraries.
+      [PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6])]
AC_MSG_NOTICE(Applying patches to GHMM to fix errors and warnings from "R CMD check")
       # Patch bug in upstream's configure bug:
       #
@@ -239,7 +246,9 @@ AS_IF(test x$found_ghmm_system != xyes &&
 #include <ghmm/fbgibbs.h>' src/ghmm-0.9-rc3/tests/mcmc.c
       [touch -r src/ghmm-0.9-rc3/tests/mcmc.c{.bak,}]
       [diff -u src/ghmm-0.9-rc3/tests/mcmc.c{.bak,}]
-      AC_MSG_NOTICE(Finished patching GHMM)
+      AC_MSG_NOTICE(Finished patching GHMM),
+      # Only link if we're not using the static bundled dependency.
+      [AC_SUBST(GHMM_LIBS, -lghmm)]
 ) # AS_IF

 # Variables for Doxygen.
diff --git a/src/Makefile.am b/src/Makefile.am
index 617a4e7..0e38b4a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -9,18 +9,19 @@ endif
 lib_LTLIBRARIES    = tsshmm.la
 tsshmm_la_CFLAGS   = $(PKG_CFLAGS)
 tsshmm_la_CPPFLAGS = $(PKG_CPPFLAGS)
+if BUNDLED_GHMM
+tsshmm_la_LIBADD   = @GHMM_ROOT@/libghmm.la
+tsshmm_la_LDFLAGS  = -module $(PKG_LIBS) @LIBXML2_LIBS@
+else
 tsshmm_la_LDFLAGS  = -module $(PKG_LIBS)
+endif
 tsshmm_la_SOURCES  = R_init_tsshmm.c R_wrap_tsshmm.c models.c \
 simulate.c train.c tss.c viterbi.c

 ACLOCAL_AMFLAGS = -I tools

 # Hook that runs after the default "all" rule.
-if BUNDLED_GHMM
-all-local : tsshmm.so libghmm.so
-else
 all-local : tsshmm.so
-endif

 # One of the limitations with POSIX-compliant `make` is not being able to
# specify multiple outputs from a single rule. Therefore, even though libtool
@@ -30,14 +31,8 @@ tsshmm.so : tsshmm.la
        cp -av .libs/tsshmm.so.0.0.0 $@
        chmod -x $@

-if BUNDLED_GHMM
-libghmm.so : @GHMM_ROOT@/libghmm.la
-       cp -av @GHMM_ROOT@/.libs/libghmm.so.1.0.0 $@
-       chmod -x $@
-endif
-
 clean-local :
-       rm -f tsshmm.so libghmm.so
+       rm -f tsshmm.so

 distclean-local : clean-local

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to