For pkgsrc we'd like to be building, installing, and linking skaware
with/as shared libraries by default.
As a packager dealing with random build systems, the most expedient way
to get them to produce sufficiently portable shared libraries is usually
libtool. (macOS is a popular pkgsrc platform, and there are less popular
weird ones too.)
I libtoolized pkgsrc skalibs some years back, but it's been less than
expedient every time skalibs is updated, so I haven't wanted to
proliferate that approach to the rest of the stack. And also whereas
most of those other libtoolizations were drive-bys, skaware feels (as it
does to everyone here, I'm sure) worth more investment on my part.
So I've invested enough to post a new patch that:
- Produces pretty much unchanged results on NetBSD (and probably Linux)
- Produces shlibs on macOS (the latest Sequoia/aarch64 and also
Tiger/powerpc) that look to my eyes like what libtool would make
- Doesn't use libtool
- Trades away some GNU Make declarative expressiveness in exchange for
zeal, but maybe leaves enough hints to restore the expressiveness
On NetBSD I've verified that skalibs can be dynamically linked by
s6-dns. I ran out of steam getting s6-dns to build macOS dylibs, but I
bet it'd work if someone did (and am, of course, happy to test).
Hoping this is enough to go on, and all those README.macos can go away
soon :-)
- Amitai
From 4b6b867969dd44188b8de2e1461cead282256cbc Mon Sep 17 00:00:00 2001
From: Amitai Schleier <[email protected]>
Date: Fri, 16 May 2025 23:48:42 -0400
Subject: [PATCH] Install shlibs like libtool would, even on macOS.
NetBSD with libtool and with this change:
:; ls -l $(pkg_info -L skalibs | grep /lib/lib)
work.*/.destdir/opt/pkg/lib/libskarnet.*
-rw-r--r-- 1 root wheel 1276180 May 13 07:03 /opt/pkg/lib/libskarnet.a
-rwxr-xr-x 1 root wheel 963 May 13 07:03 /opt/pkg/lib/libskarnet.la
lrwxr-xr-x 1 root wheel 20 May 13 07:03 /opt/pkg/lib/libskarnet.so
-> libskarnet.so.2.14.4
lrwxr-xr-x 1 root wheel 20 May 13 07:03 /opt/pkg/lib/libskarnet.so.2
-> libskarnet.so.2.14.4
-rwxr-xr-x 1 root wheel 318624 May 13 07:03
/opt/pkg/lib/libskarnet.so.2.14.4
-rw-r--r-- 1 schmonz users 1277994 May 19 15:36
work.netbsd10-arm64/.destdir/opt/pkg/lib/libskarnet.a
lrwx------ 1 schmonz users 18 May 19 15:36
work.netbsd10-arm64/.destdir/opt/pkg/lib/libskarnet.so -> libskarnet.so.2.14
lrwx------ 1 schmonz users 18 May 19 15:36
work.netbsd10-arm64/.destdir/opt/pkg/lib/libskarnet.so.2 -> libskarnet.so.2.14
lrwx------ 1 schmonz users 22 May 19 15:36
work.netbsd10-arm64/.destdir/opt/pkg/lib/libskarnet.so.2.14 ->
libskarnet.so.2.14.4.0
-rwxr-xr-x 1 schmonz users 318624 May 19 15:36
work.netbsd10-arm64/.destdir/opt/pkg/lib/libskarnet.so.2.14.4.0
macOS with libtool and with this change:
:; ls -l $(pkg_info -L skalibs | grep /lib/lib)
work.*/.destdir/opt/pkg/lib/libskarnet.*
-rwxr-xr-x 1 root wheel 216544 May 16 13:11
/opt/pkg/lib/libskarnet.2.dylib
-rw-r--r-- 1 root wheel 632232 May 16 13:11 /opt/pkg/lib/libskarnet.a
lrwxr-xr-x 1 root wheel 18 May 16 13:11 /opt/pkg/lib/libskarnet.dylib
-> libskarnet.2.dylib
-rwxr-xr-x 1 root wheel 966 May 16 13:11 /opt/pkg/lib/libskarnet.la
-rwxr-xr-x 1 schmonz staff 216096 May 19 16:43
work.magnetic-babysitter/.destdir/opt/pkg/lib/libskarnet.2.14.4.0.dylib
lrwx------ 1 schmonz staff 25 May 19 16:43
work.magnetic-babysitter/.destdir/opt/pkg/lib/libskarnet.2.14.dylib ->
libskarnet.2.14.4.0.dylib
lrwx------ 1 schmonz staff 21 May 19 16:43
work.magnetic-babysitter/.destdir/opt/pkg/lib/libskarnet.2.dylib ->
libskarnet.2.14.dylib
-rw-r--r-- 1 schmonz staff 633240 May 19 16:43
work.magnetic-babysitter/.destdir/opt/pkg/lib/libskarnet.a
lrwx------ 1 schmonz staff 21 May 19 16:43
work.magnetic-babysitter/.destdir/opt/pkg/lib/libskarnet.dylib ->
libskarnet.2.14.dylib
:; otool -L /opt/pkg/lib/libskarnet.2.dylib
work.*/.destdir/opt/pkg/lib/libskarnet.2.dylib
/opt/pkg/lib/libskarnet.2.dylib:
/opt/pkg/lib/libskarnet.2.dylib (compatibility version 17.0.0, current
version 17.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current
version 1351.0.0)
work.magnetic-babysitter/.destdir/opt/pkg/lib/libskarnet.2.dylib:
/opt/pkg/lib/libskarnet.2.dylib (compatibility version 2.0.0, current
version 2.14.4)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current
version 1351.0.0)
(Ignore version inflation in the former. Merely a problem for me to deal
with in pkgsrc. Since this'll be your first time shipping macOS shlibs,
no version-sort-order concerns here.)
---
Makefile | 29 ++++++++++++++++++++++-------
README.macos | 3 ---
configure | 9 ++++++---
3 files changed, 28 insertions(+), 13 deletions(-)
delete mode 100644 README.macos
diff --git a/Makefile b/Makefile
index eda3dda..bb0c5a5 100644
--- a/Makefile
+++ b/Makefile
@@ -83,7 +83,22 @@ endif
install: install-sysconf install-sysdeps install-dynlib install-lib
install-include install-pkgconfig
install-sysconf: $(ALL_DATA:src/etc/%=$(DESTDIR)$(sysconfdir)/%)
install-sysdeps: $(ALL_SYSDEPS:$(sysdeps)/%=$(DESTDIR)$(sysdepdir)/%)
-install-dynlib: $(SHARED_LIBS:lib%.so.xyzzy=$(DESTDIR)$(dynlibdir)/lib%.so)
+install-dynlib:
+ifeq ($(SHLIB_EXT),dylib)
+ $(INSTALL) -D -m 755 libskarnet.dylib.xyzzy
$(DESTDIR)$(dynlibdir)/libskarnet.$(version).dylib
+ $(INSTALL) -l libskarnet.$(version).dylib
$(DESTDIR)$(dynlibdir)/libskarnet.$(version_M).dylib
+ $(INSTALL) -l libskarnet.$(version_M).dylib
$(DESTDIR)$(dynlibdir)/libskarnet.dylib
+
+ # Mach-O expects a filename containing a major version number
+ $(INSTALL) -l libskarnet.$(version_M).dylib
$(DESTDIR)$(dynlibdir)/libskarnet.$(version_l).dylib
+else
+ $(INSTALL) -D -m 755 libskarnet.so.xyzzy
$(DESTDIR)$(dynlibdir)/libskarnet.so.$(version)
+ $(INSTALL) -l libskarnet.so.$(version)
$(DESTDIR)$(dynlibdir)/libskarnet.so.$(version_M)
+ $(INSTALL) -l libskarnet.so.$(version_M)
$(DESTDIR)$(dynlibdir)/libskarnet.so
+
+ # ELF probably wants *not* to have this link, but for now let's be
kinda like Mach-O
+ $(INSTALL) -l libskarnet.so.$(version_M)
$(DESTDIR)$(dynlibdir)/libskarnet.so.$(version_l)
+endif
install-lib: $(STATIC_LIBS:lib%.a.xyzzy=$(DESTDIR)$(libdir)/lib%.a)
install-include:
$(ALL_INCLUDES:src/include/$(package)/%.h=$(DESTDIR)$(includedir)/$(package)/%.h)
install-pkgconfig: $(PC_TARGETS:%=$(DESTDIR)$(pkgconfdir)/%)
@@ -110,11 +125,6 @@ $(DESTDIR)$(sysconfdir)/%: src/etc/%
$(DESTDIR)$(sysdepdir)/%: $(sysdeps)/%
exec $(INSTALL) -D -m 644 $< $@
-$(DESTDIR)$(dynlibdir)/lib%.so $(DESTDIR)$(dynlibdir)/lib%.so.$(version_M):
lib%.so.xyzzy
- $(INSTALL) -D -m 755 $< $@.$(version) && \
- $(INSTALL) -l $(@F).$(version) $@.$(version_M) && \
- exec $(INSTALL) -l $(@F).$(version_M) $@
-
$(DESTDIR)$(libdir)/lib%.a: lib%.a.xyzzy
exec $(INSTALL) -D -m 644 $< $@
@@ -134,8 +144,13 @@ libskarnet.a.xyzzy: $(ALL_SOBJS)
exec $(AR) rc $@ $^
exec $(RANLIB) $@
+LDFLAGS_SHARED_SO=-Wl,-soname,libskarnet.so.$(version_M)
-Wl,-rpath=$(dynlibdir)
libskarnet.so.xyzzy: $(ALL_DOBJS)
- exec $(CC) -o $@ $(CFLAGS_ALL) $(CFLAGS_SHARED) $(LDFLAGS_ALL)
$(LDFLAGS_SHARED) -Wl,-soname,libskarnet.so.$(version_M)
-Wl,-rpath=$(dynlibdir) $^ $(SOCKET_LIB) $(SPAWN_LIB) $(SYSCLOCK_LIB)
$(TAINNOW_LIB) $(TIMER_LIB) $(UTIL_LIB)
+ exec $(CC) -o $@ $(CFLAGS_ALL) $(CFLAGS_SHARED) $(LDFLAGS_ALL)
$(LDFLAGS_SHARED) $(LDFLAGS_SHARED_SO) $^ $(SOCKET_LIB) $(SPAWN_LIB)
$(SYSCLOCK_LIB) $(TAINNOW_LIB) $(TIMER_LIB) $(UTIL_LIB)
+
+LDFLAGS_SHARED_DYLIB=-Wl,-dylib_install_name,$(DESTDIR)$(dynlibdir)/libskarnet.$(version_l).dylib
-Wl,-dylib_compatibility_version,$(version_l)
-Wl,-dylib_current_version,$(version)
+libskarnet.dylib.xyzzy: $(ALL_DOBJS)
+ exec $(CC) -o $@ $(CFLAGS_ALL) $(CFLAGS_SHARED) $(LDFLAGS_ALL)
$(LDFLAGS_SHARED) $(LDFLAGS_SHARED_DYLIB) $^ $(SOCKET_LIB) $(SPAWN_LIB)
$(SYSCLOCK_LIB) $(TAINNOW_LIB) $(TIMER_LIB) $(UTIL_LIB)
libskarnet.pc:
exec env \
diff --git a/README.macos b/README.macos
deleted file mode 100644
index 8b01f7a..0000000
--- a/README.macos
+++ /dev/null
@@ -1,3 +0,0 @@
- This package will compile on Darwin (MacOS), but the building of
-shared libraries is not supported.
- Make sure you use the --disable-shared option to configure.
diff --git a/configure b/configure
index 5bc0b41..8a8b8a7 100755
--- a/configure
+++ b/configure
@@ -400,6 +400,7 @@ pkgconfdir='$prefix/lib/pkgconfig'
sysdepdir='$prefix/lib/$package/sysdeps'
sysdeplist=
shared=true
+shlibext=so; if [ "$(uname -s)" = Darwin ]; then shlibext=dylib; fi
static=true
allpic=true
slashpackage=false
@@ -499,7 +500,7 @@ if $slashpackage ; then
sysdepdir=${home}/sysdeps
binprefix=${home}/command
extbinprefix=${exthome}/command
- dynlibdir=${home}/library.so
+ dynlibdir=${home}/library.${shlibext}
libdir=${home}/library
includedir=${home}/include
pkgconfdir=${home}/pkgconfig
@@ -763,7 +764,7 @@ if test -n "$vpaths" ; then
echo "vpath lib%a$vpaths"
fi
if test -n "$vpathd" ; then
- echo "vpath lib%.so$vpathd"
+ echo "vpath lib%.${shlibext}$vpathd"
fi
if $static ; then
@@ -772,9 +773,11 @@ else
echo "STATIC_LIBS :="
fi
if $shared ; then
- echo "SHARED_LIBS := libskarnet.so.xyzzy"
+ echo "SHARED_LIBS := libskarnet.${shlibext}.xyzzy"
+ echo "SHLIB_EXT := ${shlibext}"
else
echo "SHARED_LIBS :="
+ echo "SHLIB_EXT :="
fi
if $pcw ; then
echo "DO_PKGCONFIG := 1"
--
2.49.0