build: --enable-ccache-prefix-map for cross-tree ccache sharing
The out-of-tree build puts absolute source-root paths on the command line
(-I${MAGICSRC}, -I${srcdir}, the source file itself), which are part of
ccache's key -- so same-tree rebuilds hit (proven) but different checkouts /
build dirs do not share cache.
New opt-in configure --enable-ccache-prefix-map adds
-ffile-prefix-map=${MAGICSRC}=.
to CFLAGS (requires ccache; the flag is probed for GCC-8+/clang support and
skipped with a warning otherwise). This relativizes the source paths embedded
in the compiled output (__FILE__, debug info) so a cached object is valid
regardless of which tree produced it.
Off by default: it makes debug paths relative, so gdb then needs
`set substitute-path . <srcdir>`. It is only for cross-tree *correctness* and
must be paired with CCACHE_BASEDIR=<build top> in the environment for cross-tree
*hits* (that half normalizes the command-line paths in the hash; this half keeps
the cached output tree-neutral). Same-tree caching needs neither.
Verified: default/--disable-ccache carry no -ffile-prefix-map;
--enable-ccache-prefix-map (probe "yes") adds it, and with --disable-ccache it
warns and is ignored. Full build rc=0 (375 files); the installed tclmagic.so
contains zero absolute /work/magic paths.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5719a536e8
commit
64614da7a0
|
|
@ -691,6 +691,7 @@ ALLOCA
|
||||||
EGREP
|
EGREP
|
||||||
GREP
|
GREP
|
||||||
PERL
|
PERL
|
||||||
|
CCACHE_PREFIX_MAP_FLAG
|
||||||
CCACHE
|
CCACHE
|
||||||
SED
|
SED
|
||||||
RANLIB
|
RANLIB
|
||||||
|
|
@ -762,6 +763,7 @@ ac_subst_files=''
|
||||||
ac_user_opts='
|
ac_user_opts='
|
||||||
enable_option_checking
|
enable_option_checking
|
||||||
enable_ccache
|
enable_ccache
|
||||||
|
enable_ccache_prefix_map
|
||||||
with_gnu_ld
|
with_gnu_ld
|
||||||
enable_assertions
|
enable_assertions
|
||||||
enable_debug
|
enable_debug
|
||||||
|
|
@ -1428,6 +1430,7 @@ Optional Features:
|
||||||
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
||||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||||
--disable-ccache do not use ccache even if it is installed
|
--disable-ccache do not use ccache even if it is installed
|
||||||
|
--enable-ccache-prefix-map relativize embedded source paths for cross-tree ccache (needs ccache; makes debug paths relative)
|
||||||
--enable-assertions build with fatal assertions enabled
|
--enable-assertions build with fatal assertions enabled
|
||||||
--enable-debug build with fatal debug enabled
|
--enable-debug build with fatal debug enabled
|
||||||
--disable-compression disable file compression
|
--disable-compression disable file compression
|
||||||
|
|
@ -4289,6 +4292,45 @@ $as_echo "$as_me: using ccache: CC=\"$CC\"" >&6;}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
CCACHE_PREFIX_MAP_FLAG=""
|
||||||
|
# Check whether --enable-ccache-prefix-map was given.
|
||||||
|
if test "${enable_ccache_prefix_map+set}" = set; then :
|
||||||
|
enableval=$enable_ccache_prefix_map;
|
||||||
|
if test "x$CCACHE" = "x"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-ccache-prefix-map ignored: ccache is not in use" >&5
|
||||||
|
$as_echo "$as_me: WARNING: --enable-ccache-prefix-map ignored: ccache is not in use" >&2;}
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -ffile-prefix-map" >&5
|
||||||
|
$as_echo_n "checking whether $CC accepts -ffile-prefix-map... " >&6; }
|
||||||
|
magic_save_cflags="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS -ffile-prefix-map=/nonexistent=."
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }; CCACHE_PREFIX_MAP_FLAG="-ffile-prefix-map"
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compiler lacks -ffile-prefix-map; not relativizing paths" >&5
|
||||||
|
$as_echo "$as_me: WARNING: compiler lacks -ffile-prefix-map; not relativizing paths" >&2;}
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
CFLAGS="$magic_save_cflags"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Extract the first word of "perl", so it can be a program name with args.
|
# Extract the first word of "perl", so it can be a program name with args.
|
||||||
set dummy perl; ac_word=$2
|
set dummy perl; ac_word=$2
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,32 @@ if test "x$enable_ccache" = "xyes"; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl Optional: normalize the absolute source-root prefix embedded in compiled
|
||||||
|
dnl output (__FILE__, debug info) so a cached object is valid regardless of which
|
||||||
|
dnl checkout / build dir produced it -- needed for *correct* cross-tree ccache
|
||||||
|
dnl sharing (which also wants CCACHE_BASEDIR=<build top> in the environment at
|
||||||
|
dnl build time; see the README). Off by default: it relativizes debug paths, so
|
||||||
|
dnl gdb then needs `set substitute-path . <srcdir>`. Requires GCC 8+/clang, so
|
||||||
|
dnl the flag is probed before use. Same-tree cache hits do NOT need this (the
|
||||||
|
dnl command-line paths already match); it is purely for cross-tree correctness.
|
||||||
|
CCACHE_PREFIX_MAP_FLAG=""
|
||||||
|
AC_ARG_ENABLE(ccache-prefix-map,
|
||||||
|
[ --enable-ccache-prefix-map relativize embedded source paths for cross-tree ccache (needs ccache; makes debug paths relative)],
|
||||||
|
[
|
||||||
|
if test "x$CCACHE" = "x"; then
|
||||||
|
AC_MSG_WARN([--enable-ccache-prefix-map ignored: ccache is not in use])
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING([whether $CC accepts -ffile-prefix-map])
|
||||||
|
magic_save_cflags="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS -ffile-prefix-map=/nonexistent=."
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
|
||||||
|
[AC_MSG_RESULT([yes]); CCACHE_PREFIX_MAP_FLAG="-ffile-prefix-map"],
|
||||||
|
[AC_MSG_RESULT([no]); AC_MSG_WARN([compiler lacks -ffile-prefix-map; not relativizing paths])])
|
||||||
|
CFLAGS="$magic_save_cflags"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
AC_SUBST(CCACHE_PREFIX_MAP_FLAG)
|
||||||
|
|
||||||
AC_PATH_PROG(PERL, perl, no)
|
AC_PATH_PROG(PERL, perl, no)
|
||||||
AC_SUBST(PERL)
|
AC_SUBST(PERL)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,15 @@ DFLAGS_NOSTUB = @extra_defs@ @DEFS@ -DGCORE=\"@GCORE@\"
|
||||||
DFLAGS_NOSTUB += -DSHDLIB_EXT=\"@SHDLIB_EXT@\" @NDEBUG_defs@ @DEBUG_defs@ ${FEATURE_FLAGS}
|
DFLAGS_NOSTUB += -DSHDLIB_EXT=\"@SHDLIB_EXT@\" @NDEBUG_defs@ @DEBUG_defs@ ${FEATURE_FLAGS}
|
||||||
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@
|
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@
|
||||||
|
|
||||||
|
# Set only by configure --enable-ccache-prefix-map (empty otherwise). Maps the
|
||||||
|
# absolute source root to "." in the compiled output so a cached object carries
|
||||||
|
# no tree-specific paths -- required for correct cross-tree ccache sharing (pair
|
||||||
|
# with CCACHE_BASEDIR=<build top> in the environment for cross-tree *hits*).
|
||||||
|
CCACHE_PREFIX_MAP_FLAG = @CCACHE_PREFIX_MAP_FLAG@
|
||||||
|
ifneq (${CCACHE_PREFIX_MAP_FLAG},)
|
||||||
|
CFLAGS += ${CCACHE_PREFIX_MAP_FLAG}=${MAGICSRC}=.
|
||||||
|
endif
|
||||||
|
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
|
|
||||||
READLINE_DEFS = @rl_defs@
|
READLINE_DEFS = @rl_defs@
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue