fix(guile-avahi): build static Guile bindings instead of dlopenable avahi extension

This commit is contained in:
vxtls 2026-03-08 10:24:48 -04:00
parent 74da573c33
commit 49537b4100
2 changed files with 249 additions and 10 deletions

View file

@ -2,30 +2,101 @@
src_prepare() { src_prepare() {
default default
autoreconf -fi
} }
src_configure() { src_configure() {
local host_triplet pkg_config_path local host_triplet pkg_config_path guile_cflags guile_static_libs
local avahi_cflags avahi_static_libs
host_triplet="$(gcc -dumpmachine)" host_triplet="$(gcc -dumpmachine)"
pkg_config_path="${LIBDIR}/pkgconfig" pkg_config_path="${LIBDIR}/pkgconfig:${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig"
guile_cflags="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --cflags guile-3.0)"
guile_static_libs="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --static --libs guile-3.0)"
avahi_cflags="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --cflags avahi-client)"
avahi_static_libs="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --static --libs avahi-client)"
PATH="${PREFIX}/bin:/usr/bin:/bin" \ PATH="${PREFIX}/bin:/usr/bin:/bin" \
PKG_CONFIG_LIBDIR="${pkg_config_path}:${PREFIX}/lib/pkgconfig" \ PKG_CONFIG="/usr/bin/pkg-config" \
PKG_CONFIG_PATH="${pkg_config_path}:${PREFIX}/lib/pkgconfig" \ PKG_CONFIG_LIBDIR="${pkg_config_path}" \
LD_LIBRARY_PATH="${LIBDIR}:${LD_LIBRARY_PATH}" \ PKG_CONFIG_PATH="${pkg_config_path}" \
LD_LIBRARY_PATH="${LIBDIR}:${PREFIX}/lib:${LD_LIBRARY_PATH}" \
GUILE_CFLAGS="${guile_cflags}" \
GUILE_LDFLAGS="${guile_static_libs}" \
AVAHI_CFLAGS="${avahi_cflags}" \
AVAHI_LIBS="${avahi_static_libs}" \
./configure \ ./configure \
--prefix="${PREFIX}" \ --prefix="${PREFIX}" \
--libdir="${LIBDIR}" \ --libdir="${LIBDIR}" \
--host="${host_triplet}" \ --host="${host_triplet}" \
--build="${host_triplet}" --build="${host_triplet}" \
--enable-static \
--disable-shared \
'--with-guilemoduledir=$(datarootdir)/guile/site/$(GUILE_EFFECTIVE_VERSION)'
} }
src_compile() { src_compile() {
make "${MAKEJOBS}" -f Makefile PREFIX="${PREFIX}" \ local pkg_config_path guile_cflags guile_static_libs avahi_cflags avahi_static_libs
CROSS_COMPILING_VARIABLE="AVAHI_GUILE_CROSS_COMPILING=yes" pkg_config_path="${LIBDIR}/pkgconfig:${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig"
guile_cflags="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --cflags guile-3.0)"
guile_static_libs="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --static --libs guile-3.0)"
avahi_cflags="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --cflags avahi-client)"
avahi_static_libs="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --static --libs avahi-client)"
CPPFLAGS="${guile_cflags} ${avahi_cflags} ${CPPFLAGS:-}" \
GUILE_CFLAGS="${guile_cflags}" \
GUILE_LDFLAGS="${guile_static_libs}" \
AVAHI_CFLAGS="${avahi_cflags}" \
AVAHI_LIBS="${avahi_static_libs}" \
default_src_compile
} }
src_install() { src_install() {
make -f Makefile install PREFIX="${PREFIX}" DESTDIR="${DESTDIR}" \ local pkg_config_path guile_cflags guile_static_libs avahi_cflags avahi_static_libs
CROSS_COMPILING_VARIABLE="AVAHI_GUILE_CROSS_COMPILING=yes" pkg_config_path="${LIBDIR}/pkgconfig:${PREFIX}/lib/pkgconfig:${PREFIX}/share/pkgconfig"
guile_cflags="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --cflags guile-3.0)"
guile_static_libs="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --static --libs guile-3.0)"
avahi_cflags="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --cflags avahi-client)"
avahi_static_libs="$(PKG_CONFIG_LIBDIR="${pkg_config_path}" PKG_CONFIG_PATH="${pkg_config_path}" \
/usr/bin/pkg-config --static --libs avahi-client)"
CPPFLAGS="${guile_cflags} ${avahi_cflags} ${CPPFLAGS:-}" \
GUILE_CFLAGS="${guile_cflags}" \
GUILE_LDFLAGS="${guile_static_libs}" \
AVAHI_CFLAGS="${avahi_cflags}" \
AVAHI_LIBS="${avahi_static_libs}" \
default_src_install
}
src_postprocess() {
local guile_site_path guile_core_site guile_site_ccache guile_core_ccache
default_src_postprocess
if find "${DESTDIR}" -type f \( -name '*.so' -o -name '*.so.*' \) | grep -q .; then
echo "guile-avahi: shared objects are forbidden in static profile." >&2
false
fi
guile_site_path="${DESTDIR}${PREFIX}/share/guile/site/3.0"
guile_core_site="${PREFIX}/share/guile/3.0"
guile_site_ccache="${DESTDIR}${LIBDIR}/guile/3.0/site-ccache"
guile_core_ccache="${LIBDIR}/guile/3.0/ccache"
PATH="${DESTDIR}${PREFIX}/bin:${PREFIX}/bin:/usr/bin:/bin" \
GUILE_LOAD_PATH="${guile_site_path}:${guile_core_site}" \
GUILE_LOAD_COMPILED_PATH="${guile_site_ccache}:${guile_core_ccache}" \
GUILE_SYSTEM_PATH="${guile_site_path}:${guile_core_site}" \
GUILE_SYSTEM_COMPILED_PATH="${guile_site_ccache}:${guile_core_ccache}" \
"${DESTDIR}${PREFIX}/bin/guile" -c '(use-modules (avahi) (avahi client)) (display "avahi-module-ok\n")'
} }

View file

@ -0,0 +1,168 @@
diff -urN guile-avahi-0.4.1/Makefile.am guile-avahi-0.4.1/Makefile.am
--- guile-avahi-0.4.1/Makefile.am 2023-01-15 17:29:00
+++ guile-avahi-0.4.1/Makefile.am 2026-03-08 10:22:35
@@ -37,6 +37,7 @@
EXTRA_DIST += \
src/make-enum-map.scm src/make-smob-types.scm \
src/make-enum-header.scm src/make-smob-header.scm \
+ src/guile-static-main.c \
src/make-callback-header.scm src/make-callback-trampolines.scm
# Files generated by (avahi build ...).
@@ -61,6 +62,11 @@
src/common.c.x src/watch.c.x src/client.c.x \
src/errors.c.x src/publish.c.x src/lookup.c.x
+guile_avahi_common_cflags = \
+ $(AVAHI_CFLAGS) $(GUILE_CFLAGS) $(AM_CFLAGS)
+
+if ENABLE_SHARED
+
nobase_guileextension_LTLIBRARIES = guile-avahi-v-0.la
# Use '-module' to build a "dlopenable module", in Libtool terms.
@@ -72,11 +78,28 @@
src/utils.c src/errors.c src/watch.c \
src/common.c src/client.c \
src/publish.c src/lookup.c
-guile_avahi_v_0_la_CFLAGS = \
- $(AVAHI_CFLAGS) $(GUILE_CFLAGS) $(AM_CFLAGS)
+guile_avahi_v_0_la_CFLAGS = $(guile_avahi_common_cflags)
+guile_avahi_v_0_la_DEPENDENCIES = $(BUILT_SOURCES)
guile_avahi_v_0_la_LIBADD = \
$(AVAHI_LIBS) $(GUILE_LDFLAGS)
+else
+lib_LIBRARIES = libguile-avahi-static.a
+libguile_avahi_static_a_SOURCES = \
+ src/utils.c src/errors.c src/watch.c \
+ src/common.c src/client.c \
+ src/publish.c src/lookup.c
+libguile_avahi_static_a_CPPFLAGS = $(AM_CPPFLAGS)
+libguile_avahi_static_a_CFLAGS = $(guile_avahi_common_cflags)
+libguile_avahi_static_a_DEPENDENCIES = $(BUILT_SOURCES)
+bin_PROGRAMS = guile
+guile_SOURCES = src/guile-static-main.c
+guile_CPPFLAGS = $(AM_CPPFLAGS)
+guile_CFLAGS = $(guile_avahi_common_cflags)
+guile_LDFLAGS = -static
+guile_LDADD = libguile-avahi-static.a $(GUILE_LDFLAGS) $(AVAHI_LIBS) $(LIBS)
+endif
+
AM_CFLAGS = $(GCC_CFLAGS)
AM_CPPFLAGS = -I$(builddir)/src -I$(srcdir)/src \
-I$(top_srcdir)/lib -I$(top_builddir)/lib
@@ -173,6 +196,8 @@
gosubdir = $(godir)/avahi
goclientdir = $(gosubdir)/client
+if ENABLE_SHARED
+
nodist_go_DATA = \
modules/avahi.go
nodist_gosub_DATA = \
@@ -213,6 +238,7 @@
SUFFIXES += .go
CLEANFILES += $(GOBJECTS)
+endif ENABLE_SHARED
#
diff -urN guile-avahi-0.4.1/configure.ac guile-avahi-0.4.1/configure.ac
--- guile-avahi-0.4.1/configure.ac 2023-01-15 17:30:33
+++ guile-avahi-0.4.1/configure.ac 2026-03-08 10:22:35
@@ -27,7 +27,8 @@
# Libtool.
LT_PREREQ([2.2.6])
-LT_INIT([disable-static dlopen])
+LT_INIT([dlopen])
+AM_CONDITIONAL([ENABLE_SHARED], [test "x$enable_shared" != "xno"])
# Checks for programs.
AC_PROG_CC
diff -urN guile-avahi-0.4.1/modules/avahi.in guile-avahi-0.4.1/modules/avahi.in
--- guile-avahi-0.4.1/modules/avahi.in 2023-01-15 16:21:01
+++ guile-avahi-0.4.1/modules/avahi.in 2026-03-08 10:22:35
@@ -110,7 +110,8 @@
(string-append %libdir "/guile-avahi-v-0")
"guile-avahi-v-0"))
- (unless (getenv "AVAHI_GUILE_CROSS_COMPILING")
+ (unless (or (getenv "AVAHI_GUILE_CROSS_COMPILING")
+ (module-variable (current-module) 'watch?))
(load-extension %avahi-extension "scm_avahi_common_init")))
;; Optional bindings, depending on the configuration.
diff -urN guile-avahi-0.4.1/modules/avahi/client/lookup.scm guile-avahi-0.4.1/modules/avahi/client/lookup.scm
--- guile-avahi-0.4.1/modules/avahi/client/lookup.scm 2023-01-15 16:21:14
+++ guile-avahi-0.4.1/modules/avahi/client/lookup.scm 2026-03-08 10:22:35
@@ -63,7 +63,8 @@
resolver-event->string
resolver-event/found resolver-event/failure))
-(unless (getenv "AVAHI_GUILE_CROSS_COMPILING")
- (load-extension %avahi-extension "scm_avahi_lookup_init"))
+(unless (or (getenv "AVAHI_GUILE_CROSS_COMPILING")
+ (module-variable (current-module) 'domain-browser?))
+ (load-extension %avahi-extension "scm_avahi_lookup_init"))
;;; arch-tag: 9ab68bd4-4705-42e5-89c3-e02551be4d09
diff -urN guile-avahi-0.4.1/modules/avahi/client/publish.scm guile-avahi-0.4.1/modules/avahi/client/publish.scm
--- guile-avahi-0.4.1/modules/avahi/client/publish.scm 2023-01-15 16:21:20
+++ guile-avahi-0.4.1/modules/avahi/client/publish.scm 2026-03-08 10:22:35
@@ -39,7 +39,8 @@
publish-flag/no-cookie publish-flag/update
publish-flag/use-wide-area publish-flag/use-multicast))
-(unless (getenv "AVAHI_GUILE_CROSS_COMPILING")
- (load-extension %avahi-extension "scm_avahi_publish_init"))
+(unless (or (getenv "AVAHI_GUILE_CROSS_COMPILING")
+ (module-variable (current-module) 'entry-group?))
+ (load-extension %avahi-extension "scm_avahi_publish_init"))
;;; arch-tag: 36180c98-3262-40a6-a90c-eb8f283e628e
diff -urN guile-avahi-0.4.1/modules/avahi/client.scm guile-avahi-0.4.1/modules/avahi/client.scm
--- guile-avahi-0.4.1/modules/avahi/client.scm 2023-01-15 16:21:09
+++ guile-avahi-0.4.1/modules/avahi/client.scm 2026-03-08 10:22:35
@@ -29,8 +29,9 @@
client-flag->string
client-flag/ignore-user-config client-flag/no-fail))
-(unless (getenv "AVAHI_GUILE_CROSS_COMPILING")
- (load-extension %avahi-extension "scm_avahi_client_init"))
+(unless (or (getenv "AVAHI_GUILE_CROSS_COMPILING")
+ (module-variable (current-module) 'client?))
+ (load-extension %avahi-extension "scm_avahi_client_init"))
;; Optional bindings, depending on the configuration.
(if (defined? 'set-client-host-name!) (export set-client-host-name!))
diff -urN guile-avahi-0.4.1/src/guile-static-main.c guile-avahi-0.4.1/src/guile-static-main.c
--- guile-avahi-0.4.1/src/guile-static-main.c 1969-12-31 19:00:00
+++ guile-avahi-0.4.1/src/guile-static-main.c 2026-03-08 10:22:35
@@ -0,0 +1,24 @@
+#include <libguile.h>
+
+void scm_avahi_common_init(void);
+void scm_avahi_client_init(void);
+void scm_avahi_lookup_init(void);
+void scm_avahi_publish_init(void);
+
+static void
+inner_main(void *closure, int argc, char **argv)
+{
+ (void) closure;
+ scm_avahi_common_init();
+ scm_avahi_client_init();
+ scm_avahi_lookup_init();
+ scm_avahi_publish_init();
+ scm_shell(argc, argv);
+}
+
+int
+main(int argc, char **argv)
+{
+ scm_boot_guile(argc, argv, inner_main, NULL);
+ return 0;
+}