blob: 9d0e96bb42d8a7458f3ac89936fcf63f58f55fac [file]
## -*- Autoconf -*-
## AM_OPTIONAL_AUTOMAKE -- skip `dist-XXX' formats whose tool is absent.
# Copyright (C) 2026 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_OPTIONAL_AUTOMAKE(OPTIONS)
# -----------------------------
# OPTIONS: whitespace-separated `dist-XXX' names (AM_INIT_AUTOMAKE
# spellings) for dist-bzip2/bzip3/xz/lzip/zstd/zip/shar/tarZ. `make
# dist' builds each archive when its tool is present and skips it
# otherwise, without failing. Unknown OPTION warns at autoreconf; a
# tool absent at configure appends no rule; a tool lost afterwards
# fails the pipeline, which the recipe catches. See bug#81040.
AC_DEFUN([AM_OPTIONAL_AUTOMAKE],
[m4_foreach_w([_am_opt_o], [$1],
[_AM_OPTIONAL_AUTOMAKE_ONE(_m4_defn([_am_opt_o]))])dnl
])
# _AM_OPTIONAL_AUTOMAKE_ONE(OPT)
# ------------------------------
# Dispatch on OPT; unrecognised OPT warns and is ignored.
AC_DEFUN([_AM_OPTIONAL_AUTOMAKE_ONE],
[m4_case([$1],
[dist-bzip2], [_AM_OPTIONAL_TAR([bzip2], [bzip2], [bz2], [-c])],
[dist-bzip3], [_AM_OPTIONAL_TAR([bzip3], [bzip3], [bz3], [-c])],
[dist-xz], [_AM_OPTIONAL_TAR([xz], [xz], [xz], [-c])],
[dist-lzip], [_AM_OPTIONAL_TAR([lzip], [lzip], [lz], [-c])],
[dist-zstd], [_AM_OPTIONAL_TAR([zstd], [zstd], [zst], [-c -q])],
[dist-tarZ], [_AM_OPTIONAL_TAR([compress], [compress], [Z], [-c])],
[dist-zip], [_AM_OPTIONAL_ZIP()],
[dist-shar], [_AM_OPTIONAL_SHAR()],
[m4_warn([syntax],
[am-optional: unknown option `$1', ignoring it])])dnl
])
# _AM_OPTIONAL_RULE(TAG, VAR, RECIPE, ARTIFACTS)
# ----------------------------------------------
# AC_CHECK_PROG for TAG, then once append RECIPE to the top Makefile
# via AC_CONFIG_COMMANDS (survives config.status reruns) iff configure
# found the tool. Hooked into dist/dist-all as an extra prerequisite.
# ARTIFACTS stay out of $(DIST_ARCHIVES), so distcleancheck must remove
# the copies that the in-tree `make dist' run by `make distcheck' leaves.
AC_DEFUN([_AM_OPTIONAL_RULE],
[m4_ifdef([_AM_OPTIONAL_DONE_$1], [],
[m4_define([_AM_OPTIONAL_DONE_$1])dnl
AC_CHECK_PROG([am__optional_$2], [$1], [$1])
AC_SUBST([am__optional_$2])dnl
AC_CONFIG_COMMANDS([am--optional-rule-$1],
[am__optional_mf=
for am__optional_cand in Makefile GNUmakefile makefile; do
if test -f "$am__optional_cand"; then
am__optional_mf=$am__optional_cand
break
fi
done
if test -n "$am__optional_mf" && test -n "$am__optional_$2"; then
cat >>"$am__optional_mf" <<'_am_opt_rule_eof_'
# Appended by am-optional for dist-$1.
dist dist-all: am--optional-dist-$1
distcleancheck: am--optional-rm-$1
.PHONY: am--optional-dist-$1 am--optional-rm-$1
$3
am--optional-rm-$1:
-rm -f $4
_am_opt_rule_eof_
fi
],
[am__optional_$2="$am__optional_$2"
])])dnl
])
# _AM_OPTIONAL_TAR(TOOL, VAR-TAG, EXT, FLAGS)
# -------------------------------------------
# Single-tool tar pipe; TOOL is last, so its failure is what's caught.
AC_DEFUN([_AM_OPTIONAL_TAR],
[_AM_OPTIONAL_RULE([$1], [$2],
[am--optional-dist-$1: distdir
@if test -n "$(am__optional_$2)"; then \
{ tardir=$(distdir) \
&& $(am__tar) | "$(am__optional_$2)" $4 > $(distdir).tar.$3; } \
|| { rm -f $(distdir).tar.$3; \
echo "am-optional: dist-$1 failed; archive not built" >&2; }; \
else \
echo "am-optional: $1 unavailable, skipping $(distdir).tar.$3" >&2; \
fi; \
:], [$(distdir).tar.$3])dnl
])
# _AM_OPTIONAL_ZIP
# ----------------
AC_DEFUN([_AM_OPTIONAL_ZIP],
[_AM_OPTIONAL_RULE([zip], [zip],
[am--optional-dist-zip: distdir
@if test -n "$(am__optional_zip)"; then \
rm -f $(distdir).zip; \
{ "$(am__optional_zip)" -rq $(distdir).zip $(distdir); } \
|| { rm -f $(distdir).zip; \
echo "am-optional: dist-zip failed; archive not built" >&2; }; \
else \
echo "am-optional: zip unavailable, skipping $(distdir).zip" >&2; \
fi; \
:], [$(distdir).zip])dnl
])
# _AM_OPTIONAL_SHAR
# -----------------
# Only `shar' is optional (gzip is a hard automake prereq). shar
# writes an intermediate file instead of piping into gzip: piped, gzip
# would succeed on empty input and leave a bogus .shar.gz when shar
# failed; the `&&' chain catches shar's exit instead.
AC_DEFUN([_AM_OPTIONAL_SHAR],
[_AM_OPTIONAL_RULE([shar], [shar],
[am--optional-dist-shar: distdir
@if test -n "$(am__optional_shar)"; then \
rm -f $(distdir).shar $(distdir).shar.gz; \
{ "$(am__optional_shar)" $(distdir) > $(distdir).shar \
&& eval GZIP= gzip $(GZIP_ENV) -f $(distdir).shar; } \
|| { rm -f $(distdir).shar $(distdir).shar.gz; \
echo "am-optional: dist-shar failed; archive not built" >&2; }; \
else \
echo "am-optional: shar unavailable, skipping $(distdir).shar.gz" >&2; \
fi; \
:], [$(distdir).shar $(distdir).shar.gz])dnl
])