-dnl Copyright © 2022 Nick Bowler
+dnl Copyright © 2022-2024 Nick Bowler
dnl
dnl Hack to reduce glsym transformations to a subset of gnulib sources.
dnl
dnl This is free software: you are free to do what the fuck you want to.
dnl There is NO WARRANTY, to the extent permitted by law.
-dnl DX_GNULIB_SYMFILES(filename)
+dnl DX_GNULIB_SYMFILES(filename, [shortname])
dnl
dnl When using the glconfig symbol-renaming functionality to include gnulib
dnl components in a library, it may not be the case that every file is actually
dnl based on the actually-enabled gnulib objects.
dnl
dnl The list of leftover objects which are not subject to symbol renaming is
-dnl then placed in the gnulib_extra_objects make variable.
+dnl then placed in the gnulib_extra_objects make variable. If shortname is
+dnl nonempty, these object file names will be prefixed with the specified
+dnl value followed by a hyphen (to match up with Automake's object file
+dnl renaming system).
AC_DEFUN_ONCE([DX_GNULIB_SYMFILES],
[AC_REQUIRE([DX_PROG_JOIN])dnl
CONFIGURE_DEPENDENCIES=${CONFIGURE_DEPENDENCIES:+" "}'${top_srcdir}/$1'
IFS=:; set x $gl_f
gl_of=$[2]; gl_am=$gl_of.am # TODO fully handle user-specified input files
IFS=$gl_save_IFS
- test -f "$gl_am" || test -f "$srcdir/gl_am" || continue
+ test -f "$gl_am" || test -f "$srcdir/$gl_am" || continue
$MAKE -f - glconfig-objects GLCONFIG_OBJECTS="$ac_tmp/gl_objs.lst" \
<"$gl_of" >/dev/null 2>&1 && test -f "$ac_tmp/gl_objs.lst" || continue
sed 's|[[.][^/.]*$]| &|' "$ac_tmp/gl_objs.lst" | LC_ALL=C sort -u \
EOF
$JOIN -a1 "$ac_tmp/gl_syms.1" "$ac_tmp/gl_syms.2" >"$ac_tmp/gl_syms.3"
# Now replace default gnulib_symfiles assignment with the computed list
- $AWK -f - -v f="$ac_tmp/gl_syms.3" "$gl_of" >"$ac_tmp/gl_tmp.mk" <<'EOF'
-$[1] "/" $[2] "/" $[3] == "gnulib_symfiles/=/$(gnulib_all_symfiles)" {
- objlst = symlst = "";
- while ((rc = getline < f) > 0) {
- if ($[3] == "x")
- symlst = symlst " " $[1] ".glsym";
- else
- objlst = objlst " " $[1] $[2];
- }
+ $AWK '$[1] "/" $[2] "/" $[3] == "gnulib_symfiles/=/$(gnulib_all_symfiles)" {
+ objlst = symlst = "";
+ while ((rc = getline < f) > 0) {
+ if ($[3] == "x") {
+ symlst = symlst " " $[1] ".glsym";
+ } else {
+ m4_ifnblank([$2], [sub(/[[^\/]]*$/, "$2-&", $[1]);
+ ])objlst = objlst " " $[1] $[2];
+ }
+ }
- if (rc < 0)
- exit 1;
+ if (rc < 0)
+ exit 1;
- print "gnulib_symfiles =" symlst;
- print "gnulib_extra_objects =" objlst;
- next;
-}
-# add ourself to Automake's generated rebuild rules
-$[2] == "=" && $[1] ~ /^am__(depfiles_maybe|maybe_remake_depfiles)$/ {
- for (i = 3; i <= NF; i++)
- if ($i == "gnulib-symfiles")
- break;
- $i = "gnulib-symfiles";
-}
-{ print }
-EOF
+ print "gnulib_symfiles =" symlst;
+ print "gnulib_extra_objects =" objlst;
+ next;
+ }
+ # add ourself to Automake-generated rebuild rules
+ $[2] == "=" && $[1] ~ /^am__(depfiles_maybe|maybe_remake_depfiles)$/ {
+ for (i = 3; i <= NF; i++)
+ if ($i == "gnulib-symfiles")
+ break;
+ $i = "gnulib-symfiles";
+ }
+ { print; }' f="$ac_tmp/gl_syms.3" "$gl_of" >"$ac_tmp/gl_tmp.mk"
mv -f "$ac_tmp/gl_tmp.mk" "$gl_of"
break # should be max one makefile needing patching
done], [: "\${MAKE=${MAKE-make}}" "\${JOIN=$JOIN}"])])