summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2025-12-04 11:23:23 +0100
committerPeter Eisentraut <peter@eisentraut.org>2025-12-04 11:23:23 +0100
commit40bdd839f52a3e18a0e003f556cab3512510f633 (patch)
tree9371873d752809d199e1fbff97cc6e4fcb369738 /src
parentd0b7a0b4c8f49ea96f171883d09e902483083d98 (diff)
headerscheck ccache support
Currently, headerscheck and cpluspluscheck are very slow, and they defeat use of ccache. This fixes that, and now they are much faster. The problem was that the test files are created in a randomly-named directory (`mktemp -d /tmp/$me.XXXXXX`), and this directory is mentioned on the compiler command line, which is part of the cache key. The solution is to create the test files in the build directory. For example, for src/include/storage/ipc.h, we generate tmp_headerscheck_c/src_include_storage_ipc_h.c (or .cpp) Now ccache works. (And it's also a bit easier to debug everything with this naming.) (The subdirectory is used to keep the cleanup trap simple.) The observed speedup on Cirrus CI for headerscheck plus cpluspluscheck is from about 1min 20s to only 20s. In local use, the speedups are similar. Co-authored-by: Thomas Munro <thomas.munro@gmail.com> Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://www.postgresql.org/message-id/flat/b49e74d4-3cf9-4d1c-9dce-09f75e55d026%40eisentraut.org
Diffstat (limited to 'src')
-rwxr-xr-xsrc/tools/pginclude/headerscheck15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index bf4992e33ae..0c260788b6c 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -73,8 +73,10 @@ else
COMPILER_FLAGS="$CPPFLAGS $CFLAGS $ICU_CFLAGS $LLVM_CPPFLAGS"
fi
-# Create temp directory.
-tmp=`mktemp -d /tmp/$me.XXXXXX`
+# Create temp directory. Help ccache by using a stable name. Include
+# extension to allow running C and C++ checks in parallel.
+tmp="tmp_${me}_${ext}"
+mkdir -p "$tmp"
trap "ret=$?; rm -rf $tmp; exit $ret" 0 1 2 3 15
@@ -200,6 +202,9 @@ do
test "$f" = src/bin/pg_dump/pg_dump.h && continue
fi
+ # Help ccache by using a stable name. Remove slashes and dots.
+ test_file_name=$(printf '%s' "$f" | tr '/.' '__')
+
# OK, create .c file to include this .h file.
{
$cplusplus && echo 'extern "C" {'
@@ -232,7 +237,7 @@ do
esac
echo "#include \"$f\""
$cplusplus && echo '};'
- } >$tmp/test.$ext
+ } >$tmp/$test_file_name.$ext
# Some subdirectories need extra -I switches.
case "$f" in
@@ -254,10 +259,12 @@ do
if ! $COMPILER $COMPILER_FLAGS -I $builddir -I $srcdir \
-I $builddir/src/include -I $srcdir/src/include \
-I $builddir/src/interfaces/libpq -I $srcdir/src/interfaces/libpq \
- $EXTRAINCLUDES $EXTRAFLAGS -c $tmp/test.$ext -o $tmp/test.o
+ $EXTRAINCLUDES $EXTRAFLAGS -c "$tmp/$test_file_name.$ext" -o "$tmp/$test_file_name.o"
then
exit_status=1
fi
+
+ rm -f "$tmp/$test_file_name.$ext" "$tmp/$test_file_name.o"
done
exit $exit_status