aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-05-26 10:12:21 +0000
committerLaurent Bercot <ska@appnovation.com>2025-05-26 10:12:21 +0000
commit0da952ff83d8c5b97bbd350acbadbcd8b616cf19 (patch)
tree750fa8cef603bf64c3f1a2471e5b3ebcf91be78c
parente5831d197bd2a0cf0cecd1a6e9de63a68b75bc32 (diff)
downloadskalibs-0da952ff83d8c5b97bbd350acbadbcd8b616cf19.tar.gz
Improve gol. Add tentative dylib support.
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--Makefile30
-rwxr-xr-xconfigure13
-rw-r--r--package/deps.mak1
-rw-r--r--src/include/skalibs/gol.h5
-rw-r--r--src/libstddjb/gol.c9
-rw-r--r--src/libstddjb/gol_argv.c11
-rw-r--r--src/libstddjb/gol_main.c13
7 files changed, 61 insertions, 21 deletions
diff --git a/Makefile b/Makefile
index eda3dda..d34b055 100644
--- a/Makefile
+++ b/Makefile
@@ -54,7 +54,6 @@ ifdef DO_PKGCONFIG
PC_TARGETS += libskarnet.pc
endif
-
all: config.mak $(ALL_LIBS) $(ALL_INCLUDES) $(ALL_SYSDEPS) $(ALL_DATA) $(PC_TARGETS)
clean:
@@ -83,7 +82,7 @@ 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: $(SHARED_LIBS:lib%.$(SHLIB_EXT).xyzzy=$(DESTDIR)$(dynlibdir)/lib%.$(SHLIB_EXT))
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)/%)
@@ -95,9 +94,9 @@ $(DESTDIR)$(exthome): $(DESTDIR)$(home)
update: $(DESTDIR)$(exthome)
-global-links: $(DESTDIR)$(exthome) $(SHARED_LIBS:lib%.so.xyzzy=$(DESTDIR)$(sproot)/library.so/lib%.so.$(version_M))
+global-links: $(DESTDIR)$(exthome) $(SHARED_LIBS:lib%.$(SHLIB_EXT).xyzzy=$(DESTDIR)$(sproot)/library.so/lib%.$(SHLIB_EXT).$(version_M))
-$(DESTDIR)$(sproot)/library.so/lib%.so.$(version_M): $(DESTDIR)$(dynlibdir)/lib%.so.$(version_M)
+$(DESTDIR)$(sproot)/library.so/lib%.$(SHLIB_EXT).$(version_M): $(DESTDIR)$(dynlibdir)/lib%.$(SHLIB_EXT).$(version_M)
exec $(INSTALL) -D -l ..$(subst $(sproot),,$(exthome))/library.so/$(<F) $@
.PHONY: update global-links
@@ -110,7 +109,7 @@ $(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
+$(DESTDIR)$(dynlibdir)/lib%.$(SHLIB_EXT) $(DESTDIR)$(dynlibdir)/lib%.$(SHLIB_EXT).$(version_M): lib%.$(SHLIB_EXT).xyzzy
$(INSTALL) -D -m 755 $< $@.$(version) && \
$(INSTALL) -l $(@F).$(version) $@.$(version_M) && \
exec $(INSTALL) -l $(@F).$(version_M) $@
@@ -179,3 +178,24 @@ src/include/$(package)/ip46.h: src/include/$(package)/fmtscan.h src/include/$(pa
fi ; \
exec cat src/headers/ip46-footer ; \
} > $@
+
+ifeq ($(SHLIB_EXT),dylib)
+# MacOS weirdness and 3-semver forcing
+
+version_X := $(shell exec expr 256 '*' $(version_l) + $(subst .,,$(suffix $(version_M))))
+version_XY := $(version_X)$(suffix $(version_m))
+version_XYZ := $(version_XY)$(suffix $(version))
+
+install-dynlib: $(SHARED_LIBS:lib%.dylib.xyzzy=$(DESTDIR)$(dynlibdir)/lib%.dylib.$(version_X))
+global-links: $(SHARED_LIBS:lib%.dylib.xyzzy=$(DESTDIR)$(sproot)/library.so/lib%.dylib.$(version_X))
+
+$(DESTDIR)$(sproot)/library.so/lib%.dylib.$(version_X): $(DESTDIR)$(sproot)/library.so/lib%.dylib.$(version_M)
+ exec $(INSTALL) -D -l $(@F).$(version_M) $@
+
+$(DESTDIR)$(dynlibdir)/lib%.dylib.$(version_X): $(DESTDIR)$(dynlibdir)/lib%.dylib.$(version_M)
+ exec $(INSTALL) -l $(@F).$(version_M) $@
+
+libskarnet.dylib.xyzzy: $(ALL_DOBJS)
+ exec $(CC) -o $@ $(CFLAGS_ALL) $(CFLAGS_SHARED) $(LDFLAGS_ALL) $(LDFLAGS_SHARED) -Wl,-dylib_install_name,$(dynlibdir)/libskarnet.$(version_M).dylib -Wl,-dylib_compatibility_version,$(version_XY) -Wl,-dylib_current_version,$(version_XYZ) $^ $(SOCKET_LIB) $(SPAWN_LIB) $(SYSCLOCK_LIB) $(TAINNOW_LIB) $(TIMER_LIB) $(UTIL_LIB)
+endif
+
diff --git a/configure b/configure
index 5bc0b41..03f4ab6 100755
--- a/configure
+++ b/configure
@@ -399,6 +399,7 @@ sysconfdir='$prefix/etc'
pkgconfdir='$prefix/lib/pkgconfig'
sysdepdir='$prefix/lib/$package/sysdeps'
sysdeplist=
+shlibext=so
shared=true
static=true
allpic=true
@@ -604,6 +605,13 @@ if test -z "$target" ; then
fi
echo " ... $target"
+echo "Shared libraries will be named ..."
+libc="${target##*-}"
+if test "${libc##darwin}" != "$libc" ; then
+ shlibext=dylib
+fi
+echo " ... *.$shlibext"
+
# Produce automatic compilation flags
if $allpic ; then
tryflag CPPFLAGS_AUTO -fPIC
@@ -758,12 +766,13 @@ LDFLAGS := $LDFLAGS $LDFLAGS_POST
LDFLAGS_NOSHARED := $LDFLAGS_NOSHARED
LDFLAGS_SHARED := $LDFLAGS_SHARED
CROSS_COMPILE := ${cross}
+SHLIB_EXT := ${shlibext}
EOF
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,7 +781,7 @@ else
echo "STATIC_LIBS :="
fi
if $shared ; then
- echo "SHARED_LIBS := libskarnet.so.xyzzy"
+ echo "SHARED_LIBS := libskarnet.${shlibext}.xyzzy"
else
echo "SHARED_LIBS :="
fi
diff --git a/package/deps.mak b/package/deps.mak
index 041f3d7..7b7af35 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -369,6 +369,7 @@ src/libstddjb/getlnmax.o src/libstddjb/getlnmax.lo: src/libstddjb/getlnmax.c src
src/libstddjb/getlnmaxsep.o src/libstddjb/getlnmaxsep.lo: src/libstddjb/getlnmaxsep.c src/include/skalibs/buffer.h src/include/skalibs/siovec.h src/include/skalibs/skamisc.h
src/libstddjb/gol.o src/libstddjb/gol.lo: src/libstddjb/gol.c src/include/skalibs/gol.h
src/libstddjb/gol_argv.o src/libstddjb/gol_argv.lo: src/libstddjb/gol_argv.c src/include/skalibs/gol.h src/include/skalibs/strerr.h
+src/libstddjb/gol_main.o src/libstddjb/gol_main.lo: src/libstddjb/gol_main.c src/include/skalibs/gol.h src/include/skalibs/strerr.h
src/libstddjb/hiercopy.o src/libstddjb/hiercopy.lo: src/libstddjb/hiercopy.c src/include/skalibs/djbunix.h src/include/skalibs/skamisc.h
src/libstddjb/hiercopy_internal.o src/libstddjb/hiercopy_internal.lo: src/libstddjb/hiercopy_internal.c src/include/skalibs/direntry.h src/include/skalibs/djbunix.h src/include/skalibs/fcntl.h src/include/skalibs/stralloc.h
src/libstddjb/hiercopy_loose.o src/libstddjb/hiercopy_loose.lo: src/libstddjb/hiercopy_loose.c src/include/skalibs/djbunix.h src/include/skalibs/skamisc.h
diff --git a/src/include/skalibs/gol.h b/src/include/skalibs/gol.h
index 746ed97..ab687b2 100644
--- a/src/include/skalibs/gol.h
+++ b/src/include/skalibs/gol.h
@@ -26,7 +26,8 @@ struct gol_arg_s
uint8_t so : 7 ;
} ;
-extern int gol (char const *const *, unsigned int, gol_bool const *, unsigned int, gol_arg const *a, unsigned int, uint64_t *, char const **, int *) ;
-extern unsigned int gol_argv (int, char const *const *, gol_bool const *, unsigned int, gol_arg const *a, unsigned int, uint64_t *, char const **) ;
+extern int gol (char const *const *, gol_bool const *, unsigned int, gol_arg const *a, unsigned int, uint64_t *, char const **, int *) ;
+extern unsigned int gol_argv (char const *const *, gol_bool const *, unsigned int, gol_arg const *a, unsigned int, uint64_t *, char const **) ;
+extern unsigned int gol_main (int, char const *const *, gol_bool const *, unsigned int, gol_arg const *a, unsigned int, uint64_t *, char const **) ;
#endif
diff --git a/src/libstddjb/gol.c b/src/libstddjb/gol.c
index c608ed4..990cd73 100644
--- a/src/libstddjb/gol.c
+++ b/src/libstddjb/gol.c
@@ -4,9 +4,10 @@
#include <skalibs/gol.h>
-int gol (char const *const *argv, unsigned int argc, gol_bool const *b, unsigned int bn, gol_arg const *a, unsigned int an, uint64_t *br, char const **ar, int *problem)
+int gol (char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg const *a, unsigned int an, uint64_t *br, char const **ar, int *problem)
{
- for (unsigned int i = 0 ; i < argc ; i++)
+ unsigned int i = 0 ;
+ for (; argv[i] ; i++)
{
if (argv[i][0] != '-' || !argv[i][1]) return i ;
if (argv[i][1] == '-')
@@ -40,7 +41,7 @@ int gol (char const *const *argv, unsigned int argc, gol_bool const *b, unsigned
if (j < an)
{
if (p[1]) ar[a[j].i] = p + 1 ;
- else if (i+1 < argc && strcmp(argv[i+1], "--")) ar[a[j].i] = argv[++i] ;
+ else if (argv[i+1] && strcmp(argv[i+1], "--")) ar[a[j].i] = argv[++i] ;
break ;
}
for (j = 0 ; j < bn ; j++) if (*p == b[j].so) break ;
@@ -49,5 +50,5 @@ int gol (char const *const *argv, unsigned int argc, gol_bool const *b, unsigned
}
}
}
- return argc ;
+ return i ;
}
diff --git a/src/libstddjb/gol_argv.c b/src/libstddjb/gol_argv.c
index 4b37811..21dc790 100644
--- a/src/libstddjb/gol_argv.c
+++ b/src/libstddjb/gol_argv.c
@@ -1,17 +1,12 @@
/* ISC license. */
-#include <string.h>
-
#include <skalibs/gol.h>
#include <skalibs/strerr.h>
-unsigned int gol_argv (int argc, char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg const *a, unsigned int an, uint64_t *br, char const **ar)
+unsigned int gol_argv (char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg const *a, unsigned int an, uint64_t *br, char const **ar)
{
int problem = 0 ;
- int r ;
- if (!argc) strerr_diefu1x(100, "gol: invalid argv") ;
- if (argc == 1) return 1 ;
- r = gol(argv + 1, argc - 1, b, bn, a, an, br, ar, &problem) ;
+ int r = gol(argv, b, bn, a, an, br, ar, &problem) ;
if (r < 0)
{
@@ -27,5 +22,5 @@ unsigned int gol_argv (int argc, char const *const *argv, gol_bool const *b, uns
else
strerr_dief3x(100, "unrecognized ", "option with argument: ", argv[-r]) ;
}
- else return r + 1 ;
+ else return r ;
}
diff --git a/src/libstddjb/gol_main.c b/src/libstddjb/gol_main.c
new file mode 100644
index 0000000..1915fca
--- /dev/null
+++ b/src/libstddjb/gol_main.c
@@ -0,0 +1,13 @@
+/* ISC license. */
+
+#include <string.h>
+
+#include <skalibs/gol.h>
+#include <skalibs/strerr.h>
+
+unsigned int gol_main (int argc, char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg const *a, unsigned int an, uint64_t *br, char const **ar)
+{
+ if (argc < 1 || argv[argc]) strerr_diefu1x(100, "gol: invalid argc/argv") ;
+ if (argc == 1) return 1 ;
+ return 1 + gol_argv(argv + 1, b, bn, a, an, br, ar) ;
+}