[PROPOSED] Parallelize the main part of 'make to2050new.tzs'
This improves real-time performance of 'make -j4 to2050new.tzs' by a factor of about 3.5 (from 120 s to 34 s) on my old 4-core desktop, which runs Fedora 27 x86-64 atop an AMD Phenom II X4 910e. * Makefile (ZDS): New macro. ($(ZDS)): New rule. All targets are phony. ($(TZS_NEW)): Use it in a submake that is parallelized by GNU make -j. (check_links): Depend on tzdata.zi, fixing a dependency bug. * NEWS: Mention this. --- Makefile | 29 ++++++++++++++++++++--------- NEWS | 4 ++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index fc15c3e..835f34b 100644 --- a/Makefile +++ b/Makefile @@ -640,19 +640,29 @@ posix_packrat: zones: $(REDO) +# dummy.zd is not a real file; it is mentioned here only so that the +# top-level 'make' does not have a syntax error. +ZDS = dummy.zd +# Rule used only by submakes invoked by the $(TZS_NEW) rule. +# It is separate so that GNU 'make -j' can run instances in parallel. +$(ZDS): zdump + ./zdump -i -c $(TZS_YEAR) '$(wd)/'$$(expr $@ : '\(.*\).zd') >$@ + $(TZS_NEW): tzdata.zi zdump zic - mkdir -p tzs.dir + rm -fr tzs.dir + mkdir tzs.dir $(zic) -d tzs.dir tzdata.zi $(AWK) '/^L/{print "Link\t" $$2 "\t" $$3}' \ tzdata.zi | LC_ALL=C sort >$@.out wd=`pwd` && \ - zones=`$(AWK) -v wd="$$wd" \ - '/^Z/{print wd "/tzs.dir/" $$2}' tzdata.zi \ - | LC_ALL=C sort` && \ - ./zdump -i -c $(TZS_YEAR) $$zones >>$@.out - sed 's,^TZ=".*tzs\.dir/,TZ=",' $@.out >$@.sed.out - rm -fr tzs.dir $@.out - mv $@.sed.out $@ + set x `$(AWK) '/^Z/{print "tzs.dir/" $$2 ".zd"}' tzdata.zi \ + | LC_ALL=C sort -t . -k 2,2` && \ + shift && \ + ZDS=$$* && \ + $(MAKE) wd="$$wd" TZS_YEAR=$(TZS_YEAR) ZDS="$$ZDS" $$ZDS && \ + sed 's,^TZ=".*tzs\.dir/,TZ=",' $$ZDS >>$@.out + rm -fr tzs.dir + mv $@.out $@ # If $(TZS) does not already exist (e.g., old-format tarballs), create it. # If it exists but 'make check_tzs' fails, a maintainer should inspect the @@ -730,7 +740,7 @@ check_sorted: backward backzone iso3166.tab zone.tab zone1970.tab $(AWK) '/^[^#]/ $(CHECK_CC_LIST)' zone1970.tab | \ LC_ALL=C sort -cu -check_links: checklinks.awk $(TDATA_TO_CHECK) +check_links: checklinks.awk $(TDATA_TO_CHECK) tzdata.zi $(AWK) -f checklinks.awk $(TDATA_TO_CHECK) $(AWK) -f checklinks.awk tzdata.zi @@ -964,3 +974,4 @@ zic.o: private.h tzfile.h version.h .PHONY: public right_only right_posix signatures signatures_version .PHONY: tarballs tarballs_version typecheck .PHONY: zonenames zones +.PHONY: $(ZDS) diff --git a/NEWS b/NEWS index 3d18e89..1d2827e 100644 --- a/NEWS +++ b/NEWS @@ -79,6 +79,10 @@ Unreleased, experimental changes already can use vanguard.zi; in this respect, current tzcode is bleeding-edge. + The Makefile should now be safe for parallelized builds, and 'make + -j to2050new.tzs' is now much faster on a multiprocoessor host + with GNU Make. + When built with -DSUPPRESS_TZDIR, the tzcode library no longer prepends TZDIR/ to file names that do not begin with '/'. This is not recommended for general use, due to its security implications. -- 2.14.3
participants (1)
-
Paul Eggert