[tz] [PROPOSED 04/12] Avoid subshells when possible

Paul Eggert eggert at cs.ucla.edu
Sat Jun 1 18:33:49 UTC 2024


This speeds up builds a bit.  These changes are safe now
that Makefile assumes POSIX.2-1992 or later.
* Makefile (GNUTARFLAGS): Omit now-harmful quoting.
(SETUP_TAR): New macro, replacing TARFLAGS.  All uses changed.
(SETUP_DIFF_TZS): New macro, replacing DIFF_TZS.  All uses changed.
(install): Assume POSIXRULES is nonempty, which it must be nowadays.
(version, tzdata.zi, version.h, tzselect, tarballs)
(rearguard_tarballs, tailored_tarballs, traditional_tarballs)
(signatures, rearguard_signatures, traditional_signatures):
Use ‘read -r’ rather than a subshell.
(version, white-space.ck, set-timestamps.out):
Simplify by using ${var%...}.
(tzdata$(VERSION)-tailored.tar.gz): Redo to avoid subshell.
---
 Makefile | 76 +++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 45 insertions(+), 31 deletions(-)

diff --git a/Makefile b/Makefile
index 624cb461..0ca3edda 100644
--- a/Makefile
+++ b/Makefile
@@ -539,21 +539,28 @@ OK_LINE=	'^'$(OK_CHAR)'*$$'
 
 # Flags to give 'tar' when making a distribution.
 # Try to use flags appropriate for GNU tar.
-GNUTARFLAGS= --format=pax --pax-option='delete=atime,delete=ctime' \
+GNUTARFLAGS= --format=pax --pax-option=delete=atime,delete=ctime \
   --numeric-owner --owner=0 --group=0 \
   --mode=go+u,go-w --sort=name
-TARFLAGS=	$$(if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; \
-		   then echo $(GNUTARFLAGS); \
-		   else :; \
-		   fi)
+SETUP_TAR= \
+  LC_ALL=C && export LC_ALL && \
+  if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; then \
+    TAR='tar $(GNUTARFLAGS)'; \
+  else \
+    TAR=tar; \
+  fi
 
 # Flags to give 'gzip' when making a distribution.
 GZIPFLAGS=	-9n
 
 # When comparing .tzs files, use GNU diff's -F'^TZ=' option if supported.
 # This makes it easier to see which Zone has been affected.
-DIFF_TZS=	 diff -u$$(! diff -u -F'^TZ=' - - <>/dev/null >&0 2>&1 \
-			   || echo ' -F^TZ=')
+SETUP_DIFF_TZS = \
+  if diff -u -F'^TZ=' - - <>/dev/null >&0 2>&1; then \
+    DIFF_TZS='diff -u -F^TZ='; \
+  else \
+    DIFF_TZS='diff -u'; \
+  fi
 
 # ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
 RANLIB=		:
@@ -646,8 +653,7 @@ install:	all $(DATA) $(REDO) $(MANS)
 			'$(DESTDIR)$(MANDIR)/man3' '$(DESTDIR)$(MANDIR)/man5' \
 			'$(DESTDIR)$(MANDIR)/man8'
 		$(ZIC_INSTALL) -l $(LOCALTIME) \
-			$$(case '$(POSIXRULES)' in ?*) echo ' -p';; esac) \
-			$(POSIXRULES) \
+			-p $(POSIXRULES) \
 			-t '$(DESTDIR)$(TZDEFAULT)'
 		cp -f $(TABDATA) '$(DESTDIR)$(TZDIR)/.'
 		cp tzselect '$(DESTDIR)$(BINDIR)/.'
@@ -672,8 +678,8 @@ version:	$(VERSION_DEPS)
 		{ (type git) >/dev/null 2>&1 && \
 		  V=$$(git describe --match '[0-9][0-9][0-9][0-9][a-z]*' \
 				--abbrev=7 --dirty) || \
-		  if test '$(VERSION)' = unknown && V=$$(cat $@); then \
-		    case $$V in *-dirty);; *) V=$$V-dirty;; esac; \
+		  if test '$(VERSION)' = unknown && read -r V <$@; then \
+		    V=$${V%-dirty}-dirty; \
 		  else \
 		    V='$(VERSION)'; \
 		  fi; } && \
@@ -692,7 +698,7 @@ vanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS)
 # This file has a version comment that attempts to capture any tailoring
 # via BACKWARD, DATAFORM, PACKRATDATA, PACKRATLIST, and REDO.
 tzdata.zi:	$(DATAFORM).zi version zishrink.awk
-		version=$$(sed 1q version) && \
+		read -r version <version && \
 		  LC_ALL=C $(AWK) \
 		    -v dataform='$(DATAFORM)' \
 		    -v deps='$(DSTDATA_ZI_DEPS) zishrink.awk' \
@@ -713,7 +719,7 @@ tzdir.h:
 		mv $@.out $@
 
 version.h:	version
-		VERSION=$$(cat version) && printf '%s\n' \
+		read -r VERSION <version && printf '%s\n' \
 		  'static char const PKGVERSION[]="($(PACKAGE)) ";' \
 		  "static char const TZVERSION[]=\"$$VERSION\";" \
 		  'static char const REPORT_BUGS_TO[]="$(BUGEMAIL)";' \
@@ -845,7 +851,7 @@ date:		$(DATEOBJS)
 		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
 
 tzselect:	tzselect.ksh version
-		VERSION=$$(cat version) && sed \
+		read -r VERSION <version && sed \
 		  -e "s'#!/bin/bash'#!"'$(KSHELL)'\' \
 		  -e s\''\(AWK\)=[^}]*'\''\1=\'\''$(AWK)\'\'\' \
 		  -e s\''\(PKGVERSION\)=.*'\''\1=\'\''($(PACKAGE)) \'\'\' \
@@ -887,9 +893,11 @@ character-set.ck: $(ENCHILADA)
 
 white-space.ck: $(ENCHILADA)
 	$(UTF8_LOCALE_MISSING) || { \
+		enchilada='$(ENCHILADA)' && \
 		patfmt=' \t|[\f\r\v]' && pat=$$(printf "$$patfmt\\n") && \
 		! grep -En "$$pat|[$s]\$$" \
-			$$(ls $(ENCHILADA) | grep -Fvx leap-seconds.list); \
+		    $${enchilada%leap-seconds.list*} \
+		    $${enchilada#*leap-seconds.list}; \
 	}
 	touch $@
 
@@ -979,7 +987,7 @@ tables.ck: checktab.awk $(YDATA) backward zone.tab zone1970.tab
 
 tzs.ck: $(TZS) $(TZS_NEW)
 		if test -s $(TZS); then \
-		  $(DIFF_TZS) $(TZS) $(TZS_NEW); \
+		  $(SETUP_DIFF_TZS) && $$DIFF_TZS $(TZS) $(TZS_NEW); \
 		else \
 		  cp $(TZS_NEW) $(TZS); \
 		fi
@@ -1115,8 +1123,8 @@ set-timestamps.out: $(EIGHT_YARDS)
 		  done; \
 		fi
 		$(SET_TIMESTAMP_DEP) leapseconds $(LEAP_DEPS)
-		for file in $$(ls $(MANTXTS) | sed 's/\.txt$$//'); do \
-		  $(SET_TIMESTAMP_DEP) $$file.txt $$file workman.sh || \
+		for file in $(MANTXTS); do \
+		  $(SET_TIMESTAMP_DEP) $$file $${file%.txt} workman.sh || \
 		    exit; \
 		done
 		$(SET_TIMESTAMP_DEP) version $(VERSION_DEPS)
@@ -1187,7 +1195,8 @@ $(TIME_T_ALTERNATIVES): $(VERSION_DEPS)
 		      TZS_YEAR="$$range" TZS_CUTOFF_FLAG="-t $$range" \
 		      D="$$wd/$@d" \
 		      to$$range.tzs) && \
-		  $(DIFF_TZS) $(TIME_T_ALTERNATIVES_HEAD)d/to$$range.tzs \
+		  $(SETUP_DIFF_TZS) && \
+		  $$DIFF_TZS $(TIME_T_ALTERNATIVES_HEAD)d/to$$range.tzs \
 			  $@d/to$$range.tzs && \
 		  if diff -q Makefile Makefile 2>/dev/null; then \
 		    quiet_option='-q'; \
@@ -1213,7 +1222,7 @@ ALL_ASC = $(TRADITIONAL_ASC) $(REARGUARD_ASC) \
 tarballs rearguard_tarballs tailored_tarballs traditional_tarballs \
 signatures rearguard_signatures traditional_signatures: \
   version set-timestamps.out rearguard.zi vanguard.zi
-		VERSION=$$(cat version) && \
+		read -r VERSION <version && \
 		$(MAKE) AWK='$(AWK)' VERSION="$$VERSION" $@_version
 
 # These *_version rules are intended for use if VERSION is set by some
@@ -1232,15 +1241,15 @@ rearguard_signatures_version: $(REARGUARD_ASC)
 traditional_signatures_version: $(TRADITIONAL_ASC)
 
 tzcode$(VERSION).tar.gz: set-timestamps.out
-		LC_ALL=C && export LC_ALL && \
-		tar $(TARFLAGS) -cf - \
+		$(SETUP_TAR) && \
+		$$TAR -cf - \
 		    $(COMMON) $(DOCS) $(SOURCES) | \
 		  gzip $(GZIPFLAGS) >$@.out
 		mv $@.out $@
 
 tzdata$(VERSION).tar.gz: set-timestamps.out
-		LC_ALL=C && export LC_ALL && \
-		tar $(TARFLAGS) -cf - $(TZDATA_DIST) | \
+		$(SETUP_TAR) && \
+		$$TAR -cf - $(TZDATA_DIST) | \
 		  gzip $(GZIPFLAGS) >$@.out
 		mv $@.out $@
 
@@ -1265,9 +1274,9 @@ tzdata$(VERSION)-rearguard.tar.gz: rearguard.zi set-timestamps.out
 		: The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
 		$(CREATE_EMPTY) $@.dir/pacificnew
 		touch -mr version $@.dir/version
-		LC_ALL=C && export LC_ALL && \
+		$(SETUP_TAR) && \
 		  (cd $@.dir && \
-		   tar $(TARFLAGS) -cf - \
+		   $$TAR -cf - \
 			$(TZDATA_DIST) pacificnew | \
 		     gzip $(GZIPFLAGS)) >$@.out
 		mv $@.out $@
@@ -1283,9 +1292,14 @@ tzdata$(VERSION)-tailored.tar.gz: set-timestamps.out
 		rm -fr $@.dir
 		mkdir $@.dir
 		: The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
+		if test $(DATAFORM) = vanguard; then \
+		  pacificnew=; \
+		else \
+		  pacificnew=pacificnew; \
+		fi && \
 		cd $@.dir && \
 		  $(CREATE_EMPTY) $(PRIMARY_YDATA) $(NDATA) backward \
-		  $$(test $(DATAFORM) = vanguard || echo pacificnew)
+		  $$pacificnew
 		(grep '^#' tzdata.zi && echo && cat $(DATAFORM).zi) \
 		  >$@.dir/etcetera
 		touch -mr tzdata.zi $@.dir/etcetera
@@ -1305,9 +1319,9 @@ tzdata$(VERSION)-tailored.tar.gz: set-timestamps.out
 		    test -f $@.dir/$$file || links="$$links $$file"; \
 		  done && \
 		  ln $$links $@.dir
-		LC_ALL=C && export LC_ALL && \
+		$(SETUP_TAR) && \
 		  (cd $@.dir && \
-		   tar $(TARFLAGS) -cf - * | gzip $(GZIPFLAGS)) >$@.out
+		   $$TAR -cf - * | gzip $(GZIPFLAGS)) >$@.out
 		mv $@.out $@
 
 tzdb-$(VERSION).tar.lz: set-timestamps.out set-tzs-timestamp.out
@@ -1315,8 +1329,8 @@ tzdb-$(VERSION).tar.lz: set-timestamps.out set-tzs-timestamp.out
 		mkdir tzdb-$(VERSION)
 		ln $(ENCHILADA) tzdb-$(VERSION)
 		$(SET_TIMESTAMP) tzdb-$(VERSION) tzdb-$(VERSION)/*
-		LC_ALL=C && export LC_ALL && \
-		tar $(TARFLAGS) -cf - tzdb-$(VERSION) | lzip -9 >$@.out
+		$(SETUP_TAR) && \
+		$$TAR -cf - tzdb-$(VERSION) | lzip -9 >$@.out
 		mv $@.out $@
 
 tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz
-- 
2.45.1



More information about the tz mailing list