Skip to content

Instantly share code, notes, and snippets.

@kspalaiologos
Created June 9, 2025 15:02
Show Gist options
  • Save kspalaiologos/540392b9dc7d1a2d7c3335189629823a to your computer and use it in GitHub Desktop.
Save kspalaiologos/540392b9dc7d1a2d7c3335189629823a to your computer and use it in GitHub Desktop.
Cache autotools configurations.
#!/bin/bash
if [ "$#" -lt 1 ]; then
echo "Usage: $0 <mode> [configure-args...]"
exit 1
fi
SCRIPT="$0"
case "$SCRIPT" in
/*) DIR=$(dirname "$SCRIPT") ;;
*) DIR=$(cd "$(dirname "$SCRIPT")" && pwd) ;;
esac
MODE="$1"
shift
CFG_HASH=$(md5sum ${DIR}/configure | cut -d' ' -f1)
RESTORE_SCRIPT="${DIR}/configure.${MODE}"
BEFORE=$(mktemp)
AFTER=$(mktemp)
CHANGED=$(mktemp)
find ${DIR}/ -type f -printf '%P\t%T@\n' | sort > "$BEFORE"
${DIR}/configure "$@"
find ${DIR}/ -type f -printf '%P\t%T@\n' | sort > "$AFTER"
comm -13 "$BEFORE" "$AFTER" | cut -f1 > "$CHANGED"
sort -u "$CHANGED" -o "$CHANGED"
if [ ! -s "$CHANGED" ]; then
echo "No files changed by ./configure"
rm -f "$BEFORE" "$AFTER" "$CHANGED"
exit 0
fi
[ -f "$RESTORE_SCRIPT" ] && rm -f "$RESTORE_SCRIPT"
{
echo '#!/bin/sh'
echo "CFG_HASH='${CFG_HASH}'"
cat <<'EOF'
SCRIPT="$0"
case "$SCRIPT" in
/*) DIR=$(dirname "$SCRIPT") ;;
*) DIR=$(cd "$(dirname "$SCRIPT")" && pwd) ;;
esac
HASH=$(md5sum "$DIR/configure" | cut -d' ' -f1)
if [ "$HASH" != "$CFG_HASH" ]; then
echo "Warning: configure script has changed, aborting restore."
exit 1
fi
EOF
} > "$RESTORE_SCRIPT"
shar -VQx $(cat "$CHANGED") >> "$RESTORE_SCRIPT" 2>/dev/null
TMPSED=$(mktemp)
sed 's/then ${echo} "x - removed lock directory ${lock_dir}."/then :/g' "$RESTORE_SCRIPT" > "$TMPSED"
mv "$TMPSED" "$RESTORE_SCRIPT"
chmod +x "$RESTORE_SCRIPT"
rm "$BEFORE" "$AFTER" "$CHANGED"
@kspalaiologos
Copy link
Author

Usage instructions:

Instead of:

% # Slow (7s):
% ./configure "CXX=clang" "CXXFLAGS=-mavx -Ofast -fno-rtti -flto -fvisibility=hidden" \
            "CC=clang" "CFLAGS=-mavx -Ofast -fno-rtti -flto -fvisibility=hidden"

consider doing

% # Slow (8s):
% ./autocache release-linux "CXX=clang" "CXXFLAGS=-mavx -Ofast -fno-rtti -flto -fvisibility=hidden" \
            "CC=clang" "CFLAGS=-mavx -Ofast -fno-rtti -flto -fvisibility=hidden"
% # Fast (0.5s):
% ./configure.release-linux

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment