Files
openwrt/include/site/cache
T
John Crispin a0b036985a build: cache the autoconf results of a package that opts in
A configure run spends its time on the compiler invocations behind its
checks, not on the shell. tools/m4 runs the compiler 633 times and takes
24 seconds. ccache does not help, because it refuses to cache an
autoconf conftest compile at all; it counts these separately as
"Autoconf compile/link" under its uncacheable calls.

A package that sets PKG_CONFIGURE_CACHE or HOST_CONFIGURE_CACHE keeps a
config.cache under tmp/, so a package that is cleaned and built again
reads the answers instead of running the checks. The configure stage of
tools/m4 drops from 24.5 s to 1.5 s. dirclean removes tmp/, so a full
reset of the tree starts from cold answers.

A package has to opt in, because a cache is only correct for a configure
script that keeps its side effects outside the AC_CACHE_VAL body.
ncurses appends -D_XOPEN_SOURCE and -D_DEFAULT_SOURCE to CPPFLAGS inside
that body, so a cached run restores the value, skips the append, and
then fails to compile wcwidth. ncurses_cfg.h is identical in both cases;
the difference is in the generated Makefile.

The path covers everything else that changes an answer. A target package
is keyed on the toolchain directory, which carries the gcc version. A
host package is keyed on the version string of the host compiler,
because autoconf cannot detect a new compiler behind an unchanged name;
gcc 14 turned an implicit function declaration into an error and changed
many answers that way. Both are keyed on a hash of the configure
arguments and the build flags, and autoconf refuses a cache written with
different flags on top of that.

A cached program path outlives a wipe of staging_dir, so ac_cv_path_ and
ac_cv_prog_ answers are dropped when the cache loads and configure
searches PATH again. Without that, a cache written before staging_dir
held sed pins /usr/bin/sed for good. A search runs no compiler, so this
costs nothing that matters.

The cache arrives through a site script rather than --cache-file, so a
hand written configure script never sees a new argument. The site script
removes the file of the previous arguments, so a different configuration
gets a cold cache instead of an autoconf error. It also unsets the
variable, and make exports it for the configure stage alone, so a nested
configure run keeps its own cache.

Set CONFIGURE_CACHE_DIR to keep the cache elsewhere, or to the empty
string to run every check again.

Host builds now read a site script on Linux as well. Before this change
only Darwin had one.

CONFIG_SITE holds one path name: autoconf before 2.70 reads the whole
value as that one name, so a second path would silence both scripts. It
names the cache script alone, and the cache script loads the site script
of the architecture from CONFIG_SITE_BASE.

Signed-off-by: John Crispin <john@phrozen.org>
2026-09-22 18:18:58 +02:00

45 lines
1.8 KiB
Bash

#!/bin/sh
#
# Points the autoconf result cache at the file that the build system keeps for
# this package. Set CONFIGURE_CACHE_DIR to switch this on; see rules.mk.
#
# configure sources the site scripts before it loads the cache, so setting
# cache_file here has the same effect as --cache-file, without a configure
# argument that a hand written configure script would choke on.
# Autoconf before 2.70 reads CONFIG_SITE as a single path name, so the site
# script of the architecture cannot be a second word in it. Load it from here.
if [ -n "$CONFIG_SITE_BASE" ] && [ -r "$CONFIG_SITE_BASE" ]; then
. "$CONFIG_SITE_BASE"
fi
if [ -n "$CONFIGURE_CACHE_FILE" ]; then
configure_cache_dir=${CONFIGURE_CACHE_FILE%/*}
mkdir -p "$configure_cache_dir" 2>/dev/null
# A change of the configure arguments gives a new file name. Drop the
# file of the previous arguments so that the directory holds one cache
# per package.
for configure_cache_stale in "$configure_cache_dir"/*.cache; do
[ -f "$configure_cache_stale" ] || continue
[ "$configure_cache_stale" = "$CONFIGURE_CACHE_FILE" ] || rm -f "$configure_cache_stale"
done
# A cached program path outlives a wipe of staging_dir, so it can name a
# tool that is gone, or miss one that the build installed since. Drop
# those answers and let configure search PATH again. A search runs no
# compiler, and the compiler is where the time goes.
if [ -f "$CONFIGURE_CACHE_FILE" ]; then
grep -v -e '^ac_cv_path_' -e '^ac_cv_prog_' \
"$CONFIGURE_CACHE_FILE" > "$CONFIGURE_CACHE_FILE.tmp"
mv -f "$CONFIGURE_CACHE_FILE.tmp" "$CONFIGURE_CACHE_FILE"
fi
cache_file=$CONFIGURE_CACHE_FILE
# A configure script that runs further configure scripts must not hand
# this cache to them. Their checks run with different flags.
unset CONFIGURE_CACHE_FILE configure_cache_dir configure_cache_stale
fi