mirror of
https://github.com/openwrt/openwrt.git
synced 2026-10-13 13:18:09 +04:00
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>