From 9cce7d263ea3f2984a619cdfcb54d264c6a4c51d Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Tue, 5 Nov 2024 01:29:53 +0300 Subject: fully support relocatable binaries, improving AppImages * You can now specify `--with-scitecodatadir` as a relative path, that will be interpreted relative to the binary's location. * Win32 binaries already were relocatable, but this was a Windows-specific hack. Win32 binaries are now built with `--with-scitecodatadir=.` since everything is in a single directory. * Ubuntu packages are now also built `--with-scitecodatadir=../share/sciteco`. This is not crucial for ordinary installations, but is meant for AppImage creation. * Since AppImages are now built from relocatable packages, we no longer need the unionfs-workaround from pkg2appimage. This should fix the strange root contents when autocompleting in AppImage builds. * This might also fix the appimage.github.io CI issues. I assume that because I could reproduce the issue on FreeBSD's Linuxulator in dependence of pkg2appimage's "union"-setting. See https://github.com/AppImage/appimage.github.io/pull/3402 * Determining the binary location actually turned out be hard and very platform-dependant. There are now implementations for Windows (which could also read argv[0]), Linux and generic UNIX (which works on FreeBSD, but I am not sure about the others). I believe this could also be useful on Mac OS to create app bundles, but this needs to be tested - currently the Mac OS binaries are installed into fixed locations and don't use relocation. --- configure.ac | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 870b7b0..a82eb1d 100644 --- a/configure.ac +++ b/configure.ac @@ -173,9 +173,12 @@ AC_CHECK_FUNCS([memset setlocale strchr strrchr fstat sscanf], , [ # glib defines G_OS_UNIX instead... case $host in *-*-linux* | *-*-*bsd* | *-*-darwin* | *-*-cygwin* | *-*-haiku*) - AC_CHECK_FUNCS([realpath fchown dup dup2 getpid open read kill mmap], , [ + AC_CHECK_FUNCS([realpath readlink fchown dup dup2 getpid open read kill mmap], , [ AC_MSG_ERROR([Missing libc function]) ]) + AC_SEARCH_LIBS(dladdr, [dl], , [ + AC_MSG_ERROR([No library providing dladdr()!]) + ]) ;; esac @@ -183,10 +186,17 @@ esac # Config options # +# NOTE: This can be relative to the binary location for relocateable builds. AC_ARG_WITH(scitecodatadir, AS_HELP_STRING([--with-scitecodatadir=PATH], [Installation directory of data [default=DATADIR/sciteco]]), - [scitecodatadir=$withval], [scitecodatadir=$datadir/$PACKAGE]) + [scitecodatadir_rel=$withval], [scitecodatadir_rel=$datadir/$PACKAGE]) +AC_SUBST(scitecodatadir_rel) +# The Automake installation directory needs to be absolute, though: +case "$scitecodatadir_rel" in +/*) scitecodatadir="$scitecodatadir_rel";; +*) scitecodatadir="$bindir/$scitecodatadir_rel";; +esac AC_SUBST(scitecodatadir) # SciTECO library macro directory scitecolibdir=$scitecodatadir/lib @@ -194,8 +204,7 @@ AC_SUBST(scitecolibdir) # These paths can be changed at install-time and # should not be written into config.h: -AM_CPPFLAGS="$AM_CPPFLAGS -D'SCITECODATADIR=\"\$(scitecodatadir)\"' \ - -D'SCITECOLIBDIR=\"\$(scitecolibdir)\"'" +AM_CPPFLAGS="$AM_CPPFLAGS -D'SCITECODATADIR=\"\$(scitecodatadir_rel)\"'" # FIXME: It does not really make sense to have this configurable. # It would make more sense to allow linking against an externally-provided -- cgit v1.2.3