From aaa13e57396ba5eecf31ef5f925a73f4cf31518a Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Sun, 2 Aug 2020 22:05:45 +0200 Subject: [PATCH] Meta: Provide a way to only update a file if the output changes This is only useful for build commands that update their destination in all cases and thus sometimes confuse cmake into rebuilding everything needlessly. --- Meta/write-only-on-difference.sh | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100755 Meta/write-only-on-difference.sh diff --git a/Meta/write-only-on-difference.sh b/Meta/write-only-on-difference.sh new file mode 100755 index 0000000000..a6485e79a9 --- /dev/null +++ b/Meta/write-only-on-difference.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e + +if [ "$#" -lt "2" ]; then + echo "USAGE: $0 " + exit 1 +fi + +DST_FILE="$1" +shift + +# Just in case: +mkdir -p -- "$(dirname -- "${DST_FILE}")" + +cleanup() +{ + rm -f -- "${DST_FILE}.tmp" +} +trap cleanup 0 1 2 3 6 + +"$@" > "${DST_FILE}.tmp" +# If we get here, the command was successful, and we can overwrite the destination. + +if ! cmp --quiet -- "${DST_FILE}.tmp" "${DST_FILE}"; then + # File changed, need to overwrite: + mv -f -- "${DST_FILE}.tmp" "${DST_FILE}" +fi