summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2026-05-27 05:39:30 +0200
committerMikael Magnusson <mikachu@gmail.com>2026-06-07 12:45:29 +0200
commit1426a4dfdc2eccbcbf0c2583efd802e4169b487b (patch)
treee69ac7a82eb40f2f6b5f382aad041ef293340682
parentunposted: zsh/nearcolor: update docs, add tests (diff)
downloadzsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.tar
zsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.tar.gz
zsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.tar.bz2
zsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.tar.lz
zsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.tar.xz
zsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.tar.zst
zsh-1426a4dfdc2eccbcbf0c2583efd802e4169b487b.zip
54669: add --disable-link-all-libs configure option
When this is used, libraries only needed by specific modules will only be linked to those modules (currently libgdbm and libpcre2). When --enable-cap is used, the main shell also uses libcap functions so we want to link that either way. Speaking of the cap module, it did some weird thing where it always compiles but creates useless builtins that only error, which means you can't rely on zmodload to check if they'll work. I'm sure someone will complain about me changing this but I'm going to at least try it and see if someone has a good reason for it. The gdbm module also has a big ifdef for the whole module, but instead of dummy builtins it just does #error, so remove that. We won't try to compile it if the user didn't ask for it, and if the user asked for it and it wouldn't compile, configure won't create a Makefile. Using the ac_cv_ cache variables in db_gdbm.mdd also doesn't actually work properly, those will remain set and enable the module to be linked after you pass --disable-gdbm and you will get the aforementioned #error. Use the enable_gdbm variable instead, like pcre.mdd does (and also cap.mdd now that I evilly made it conditional on --enable-cap).
-rw-r--r--ChangeLog7
-rw-r--r--Src/Modules/cap.c10
-rw-r--r--Src/Modules/cap.mdd2
-rw-r--r--Src/Modules/db_gdbm.c10
-rw-r--r--Src/Modules/db_gdbm.mdd4
-rw-r--r--Src/Modules/pcre.mdd2
-rw-r--r--Src/mkmakemod.sh5
-rw-r--r--configure.ac43
8 files changed, 52 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index 12e5e4512..e87b638a1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2026-06-07 Mikael Magnusson <mikachu@gmail.com>
+
+ * 54669: Src/Modules/cap.c, Src/Modules/cap.mdd,
+ Src/Modules/db_gdbm.c, Src/Modules/db_gdbm.mdd,
+ Src/Modules/pcre.mdd, Src/mkmakemod.sh, configure.ac: add
+ --disable-link-all-libs configure option
+
2026-06-06 dana <dana@dana.is>
* unposted: NEWS: better document hlgroups, termquery, etc
diff --git a/Src/Modules/cap.c b/Src/Modules/cap.c
index 6db7cbc2a..a99e15c88 100644
--- a/Src/Modules/cap.c
+++ b/Src/Modules/cap.c
@@ -30,8 +30,6 @@
#include "cap.mdh"
#include "cap.pro"
-#ifdef HAVE_CAP_GET_PROC
-
static int
bin_cap(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
{
@@ -116,14 +114,6 @@ bin_setcap(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
return ret;
}
-#else /* !HAVE_CAP_GET_PROC */
-
-# define bin_cap bin_notavail
-# define bin_getcap bin_notavail
-# define bin_setcap bin_notavail
-
-#endif /* !HAVE_CAP_GET_PROC */
-
/* module paraphernalia */
static struct builtin bintab[] = {
diff --git a/Src/Modules/cap.mdd b/Src/Modules/cap.mdd
index 905f7ca47..543cf0139 100644
--- a/Src/Modules/cap.mdd
+++ b/Src/Modules/cap.mdd
@@ -1,5 +1,5 @@
name=zsh/cap
-link=dynamic
+link=`if test "x$enable_cap" = xyes; then echo dynamic; else echo no; fi`
load=no
autofeatures="b:cap b:getcap b:setcap"
diff --git a/Src/Modules/db_gdbm.c b/Src/Modules/db_gdbm.c
index 34f577e30..604788ae8 100644
--- a/Src/Modules/db_gdbm.c
+++ b/Src/Modules/db_gdbm.c
@@ -46,12 +46,6 @@ static void myfreeparamnode(HashNode hn);
static int no_database_action = 0;
-/*
- * Make sure we have all the bits I'm using for memory mapping, otherwise
- * I don't know what I'm doing.
- */
-#if defined(HAVE_GDBM_H) && defined(HAVE_GDBM_OPEN)
-
#include <gdbm.h>
static char *backtype = "db/gdbm";
@@ -817,7 +811,3 @@ myfreeparamnode(HashNode hn)
}
zfree(pm, sizeof(struct param));
}
-
-#else
-# error no gdbm
-#endif /* have gdbm */
diff --git a/Src/Modules/db_gdbm.mdd b/Src/Modules/db_gdbm.mdd
index 210c22177..122ba8a36 100644
--- a/Src/Modules/db_gdbm.mdd
+++ b/Src/Modules/db_gdbm.mdd
@@ -1,5 +1,5 @@
name=zsh/db/gdbm
-link='if test "x$ac_cv_lib_gdbm_gdbm_open" = xyes && test "x$ac_cv_header_gdbm_h" = xyes; then
+link='if test "x$enable_gdbm" = xyes; then
echo dynamic
else
echo no
@@ -10,3 +10,5 @@ load=no
autofeatures="b:ztie b:zuntie b:zgdbmpath p:zgdbm_tied"
objects="db_gdbm.o"
+
+libs="@GDBM_LIBS@"
diff --git a/Src/Modules/pcre.mdd b/Src/Modules/pcre.mdd
index 3e1579117..dac271b48 100644
--- a/Src/Modules/pcre.mdd
+++ b/Src/Modules/pcre.mdd
@@ -5,3 +5,5 @@ load=no
autofeatures="b:pcre_compile b:pcre_study b:pcre_match"
objects="pcre.o"
+
+libs="@PCRE_LIBS@"
diff --git a/Src/mkmakemod.sh b/Src/mkmakemod.sh
index 3ccf9c5e5..5e5adc070 100644
--- a/Src/mkmakemod.sh
+++ b/Src/mkmakemod.sh
@@ -28,6 +28,7 @@
# headers extra headers for this module (default none)
# hdrdeps extra headers on which the .mdh depends (default none)
# otherincs extra headers that are included indirectly (default none)
+# libs extra libraries to link this module against (default none)
#
# The .mdd file may also include a Makefile.in fragment between lines
# `:<<\Make' and `Make' -- this will be copied into Makemod.in.
@@ -186,7 +187,7 @@ if $first_stage; then
unset name moddeps nozshdep alwayslink hasexport
unset autofeatures autofeatures_emu
- unset objects proto headers hdrdeps otherincs
+ unset objects proto headers hdrdeps otherincs libs
. $top_srcdir/$the_subdir/${mddname}.mdd
q_name=`echo $name | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
test -n "${moddeps+set}" || moddeps=
@@ -324,7 +325,7 @@ if $first_stage; then
echo
echo "${mddname}.\$(DL_EXT): \$(MODDOBJS_${mddname}) ${mddname}.export $exportdeps \$(@LINKMODS@_${mddname})"
echo ' rm -f $@'
- echo " \$(DLLINK) \$(@E@XPIMP_$mddname) \$(@E@NTRYOPT) \$(MODDOBJS_${mddname}) \$(@LINKMODS@_${mddname}) \$(LIBS) "
+ echo " \$(DLLINK) \$(@E@XPIMP_$mddname) \$(@E@NTRYOPT) \$(MODDOBJS_${mddname}) \$(@LINKMODS@_${mddname}) \$(LIBS) ${libs} "
echo
fi
echo "${mddname}.mdhi: ${mddname}.mdhs \$(INCS_${mddname})"
diff --git a/configure.ac b/configure.ac
index e152588eb..4d348134e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -438,8 +438,15 @@ AS_HELP_STRING([--enable-cap],[enable the search for POSIX capabilities (may req
# Default off for licensing reasons
AC_ARG_ENABLE(gdbm,
-AS_HELP_STRING([--enable-gdbm],[enable the search for the GDBM library (see the zsh/db/gdbm module)]),
-[gdbm="$enableval"], [gdbm=no])
+AS_HELP_STRING([--enable-gdbm],[enable the search for the GDBM library (see the zsh/db/gdbm module)]))
+
+dnl
+dnl link all libraries in main shell
+dnl
+AC_ARG_ENABLE(link-all-libs,
+AS_HELP_STRING([--disable-link-all-libs],
+ [do not link module-only libraries into the main binary]),
+[enable_link_all_libs=$enableval], [enable_link_all_libs=yes])
dnl ------------------
dnl CHECK THE COMPILER
@@ -719,7 +726,6 @@ AC_ARG_WITH(term-lib,
AS_HELP_STRING([--with-term-lib=LIBS],[search space-separated LIBS for terminal handling]),
[if test "x$withval" != xno && test "x$withval" != x ; then
termcap_curses_order="$withval"
- AC_SEARCH_LIBS(tigetstr, [$termcap_curses_order])
else
termcap_curses_order="$ncursesw_test $ncurses_test tinfow tinfo termcap curses"
fi],
@@ -931,9 +937,18 @@ elif test x$zsh_cv_decl_ospeed_must_define = xyes; then
AC_DEFINE(MUST_DEFINE_OSPEED)
fi
-if test x$gdbm != xno; then
+if test x$enable_gdbm = xyes; then
AC_CHECK_HEADERS(gdbm.h)
+ save_LIBS=$LIBS
+ LIBS=
AC_CHECK_LIB(gdbm, gdbm_open)
+ GDBM_LIBS=$LIBS
+ LIBS=$save_LIBS
+ if test x$enable_link_all_libs = xyes; then
+ LIBS="$GDBM_LIBS $LIBS"
+ GDBM_LIBS=
+ fi
+ AC_SUBST(GDBM_LIBS)
fi
AC_CHECK_HEADERS(sys/xattr.h)
@@ -1268,7 +1283,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
grantpt unlockpt ptsname \
htons ntohs \
regcomp regexec regerror regfree \
- gdbm_open getxattr \
+ getxattr \
realpath canonicalize_file_name \
symlink getcwd \
cygwin_conv_path \
@@ -1320,8 +1335,16 @@ if test x$zsh_cv_func_realpath_accepts_null = xyes; then
fi
if test x$enable_pcre = xyes; then
- LIBS="`$PCRE_CONFIG --libs8` $LIBS"
+ save_LIBS=$LIBS
+ PCRE_LIBS="`$PCRE_CONFIG --libs8`"
+ LIBS="$PCRE_LIBS $LIBS"
AC_CHECK_FUNCS(pcre2_compile_8)
+ LIBS=$save_LIBS
+ if test x$enable_link_all_libs = xyes; then
+ LIBS="$PCRE_LIBS $LIBS"
+ PCRE_LIBS=
+ fi
+ AC_SUBST(PCRE_LIBS)
fi
if test x$enable_cap = xyes; then
@@ -3051,7 +3074,13 @@ if test "x$dynamic" = xyes; then
module linker flags : ${LDFLAGS} ${LIBLDFLAGS} ${DLLDFLAGS}"
fi
echo "\
-library flags : ${LIBS}
+library flags : ${LIBS}"
+if test x$enable_link_all_libs != xyes; then
+echo "\
+gdbm module library flags : ${GDBM_LIBS}
+pcre module library flags : ${PCRE_LIBS}"
+fi
+echo "\
installation basename : ${tzsh_name}
binary install path : ${zshbin2}
man page install path : ${zshman2}