[tz] [PATCH] Port to downstream HP-UX-style ‘make’

Paul Eggert eggert at cs.ucla.edu
Thu Oct 22 19:35:54 UTC 2020


HP-UX ‘make’ considers a target to be out-of-date if its timestamp
equals that of a dependency, and POSIX allows this ‘make’ behavior.
So, when putting timestamps on files in tarballs, add 1 to a
file’s timestamp if it depends on some other file with the same
timestamp.  That way, when someone unpackages a tarball on an
HP-UX host, its ‘make’ will avoid rebuilding files like ‘version’
that are up-to-date in the tarball.
* Makefile (SET_TIMESTAMP_N, SET_TIMESTAMP, SET_TIMESTAMP_DEP):
New macros.
(set-timestamps.out, set-tzs-timestamp.out)
(tzdata$(VERSION)-rearguard.tar.gz, tzdb-$(VERSION).tar.lz):
Use them instead of invoking ‘touch’ by hand.
(set-timestamps.out): Set the timestamp of tzdata.zi after that
of version, since the former depends on the latter.
---
 Makefile | 43 +++++++++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/Makefile b/Makefile
index 40b81d1..3b9d59e 100644
--- a/Makefile
+++ b/Makefile
@@ -872,11 +872,34 @@ $(MANTXTS):	workman.sh
 		LC_ALL=C sh workman.sh `expr $@ : '\(.*\)\.txt$$'` >$@.out
 		mv $@.out $@
 
+# Set file timestamps deterministically if possible,
+# so that tarballs containing the timestamps are reproducible.
+#
+# '$(SET_TIMESTAMP_N) N DEST A B C ...' sets the timestamp of the
+# file DEST to the maximum of the timestamps of the files A B C ...,
+# plus N if GNU ls and touch are available.
+SET_TIMESTAMP_N = sh -c '\
+  n=$$0 dest=$$1; shift; \
+  touch -cmr `ls -t "$$@" | sed 1q` "$$dest" && \
+  if test $$n != 0 && \
+     lsout=`ls -n --time-style="+%s" "$$dest" 2>/dev/null`; then \
+    set x $$lsout && \
+    touch -cmd @`expr $$7 + $$n` "$$dest"; \
+  else :; fi'
+# If DEST depends on A B C ... in this Makefile, callers should use
+# $(SET_TIMESTAMP_DEP) DEST A B C ..., for the benefit of any
+# downstream 'make' that considers equal timestamps to be out of date.
+# POSIX allows this 'make' behavior, and HP-UX 'make' does it.
+# If all that matters is that the timestamp be reproducible
+# and plausible, use $(SET_TIMESTAMP).
+SET_TIMESTAMP = $(SET_TIMESTAMP_N) 0
+SET_TIMESTAMP_DEP = $(SET_TIMESTAMP_N) 1
+
 # Set the timestamps to those of the git repository, if available,
 # and if the files have not changed since then.
-# This uses GNU 'touch' syntax 'touch -d at N FILE',
-# where N is the number of seconds since 1970.
-# If git or GNU 'touch' is absent, don't bother to sync with git timestamps.
+# This uses GNU 'ls --time-style=+%s', which outputs the seconds count,
+# and GNU 'touch -d at N FILE', where N is the number of seconds since 1970.
+# If git or GNU is absent, don't bother to sync with git timestamps.
 # Also, set the timestamp of each prebuilt file like 'leapseconds'
 # to be the maximum of the files it depends on.
 set-timestamps.out: $(EIGHT_YARDS)
@@ -894,16 +917,16 @@ set-timestamps.out: $(EIGHT_YARDS)
 		    fi || exit; \
 		  done; \
 		fi
-		touch -cmr `ls -t $(LEAP_DEPS) | sed 1q` leapseconds
+		$(SET_TIMESTAMP_DEP) leapseconds $(LEAP_DEPS)
 		for file in `ls $(MANTXTS) | sed 's/\.txt$$//'`; do \
-		  touch -cmr `ls -t $$file workman.sh | sed 1q` $$file.txt || \
+		  $(SET_TIMESTAMP_DEP) $$file.txt $$file workman.sh || \
 		    exit; \
 		done
-		touch -cmr `ls -t $(TZDATA_ZI_DEPS) | sed 1q` tzdata.zi
-		touch -cmr `ls -t $(VERSION_DEPS) | sed 1q` version
+		$(SET_TIMESTAMP_DEP) version $(VERSION_DEPS)
+		$(SET_TIMESTAMP_DEP) tzdata.zi $(TZDATA_ZI_DEPS)
 		touch $@
 set-tzs-timestamp.out: $(TZS)
-		touch -cmr `ls -t $(TZS_DEPS) | sed 1q` $(TZS)
+		$(SET_TIMESTAMP_DEP) $(TZS) $(TZS_DEPS)
 		touch $@
 
 # The zics below ensure that each data file can stand on its own.
@@ -1018,7 +1041,7 @@ tzdata$(VERSION)-rearguard.tar.gz: rearguard.zi set-timestamps.out
 		for f in $(TDATA) $(PACKRATDATA); do \
 		  rearf=tzdata$(VERSION)-rearguard.dir/$$f; \
 		  $(AWK) -v DATAFORM=rearguard -f ziguard.awk $$f >$$rearf && \
-		  touch -cmr `ls -t ziguard.awk $$f` $$rearf || exit; \
+		  $(SET_TIMESTAMP_DEP) $$rearf ziguard.awk $$f || exit; \
 		done
 		sed '1s/$$/-rearguard/' \
 		  <version >tzdata$(VERSION)-rearguard.dir/version
@@ -1037,7 +1060,7 @@ tzdb-$(VERSION).tar.lz: set-timestamps.out set-tzs-timestamp.out
 		rm -fr tzdb-$(VERSION)
 		mkdir tzdb-$(VERSION)
 		ln $(ENCHILADA) tzdb-$(VERSION)
-		touch -cmr `ls -t tzdb-$(VERSION)/* | sed 1q` tzdb-$(VERSION)
+		$(SET_TIMESTAMP) tzdb-$(VERSION) tzdb-$(VERSION)/*
 		LC_ALL=C && export LC_ALL && \
 		tar $(TARFLAGS) -cf - tzdb-$(VERSION) | lzip -9 >$@.out
 		mv $@.out $@
-- 
2.25.1



More information about the tz mailing list