glibc/timezone/Makefile
Mike Frysinger 3cc652e951 timezone: fix parallel check failures
The XT testdata install rules expect the testdata dir to already exist in
the build tree, but it doesn't actually create it.  Instead, it relies on
the build-testdata define happening to be executed before it (which runs
zic which creates the dir).  When we run in parallel though, it's easy to
hit a failure:
$ cd timezone
$ rm -rf $objdir/timezone/testdata
$ make check -j
...
cp testdata/XT1 .../timezone/testdata/XT1
cp: cannot create regular file '.../timezone/testdata/XT1': No such file or directory
Makefile:116: recipe for target '.../timezone/testdata/XT1' failed
make: *** [.../timezone/testdata/XT1] Error 1
make: *** Waiting for unfinished jobs....
2015-09-18 16:03:42 -04:00

128 lines
4.2 KiB
Makefile

# Copyright (C) 1998-2015 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.
#
# Makefile for timezone information
#
subdir := timezone
include ../Makeconfig
extra-objs := scheck.o ialloc.o
others := zdump zic
tests := test-tz tst-timezone tst-tzset
install-sbin := zic zdump
generated-dirs += testdata
install-bin-script = tzselect
generated += tzselect
testdata = $(objpfx)testdata
ifeq ($(run-built-tests),yes)
# List zones generated by separate commands running zic on the host.
# Each such zic run counts as a separate test.
test-zones := America/New_York Etc/UTC UTC Europe/Berlin \
Australia/Melbourne America/Sao_Paulo Asia/Tokyo
tests-special += $(addprefix $(testdata)/, $(test-zones))
endif
include ../Rules
$(objpfx)zic: $(objpfx)scheck.o $(objpfx)ialloc.o
$(objpfx)zic.o $(objpfx)zdump.o: $(objpfx)version.h
$(objpfx)version.h: $(common-objpfx)config.make
echo 'static char const TZVERSION[]="$(version)";' \
> $@.new
mv -f $@.new $@
tz-cflags = -DTZDIR='"$(zonedir)"' \
-DTZDEFAULT='"$(localtime-file)"' \
-DTZDEFRULES='"$(posixrules-file)"' \
-DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone
CFLAGS-zdump.c = -fwrapv -DNOID $(tz-cflags) -DHAVE_GETTEXT
CFLAGS-zic.c = -DNOID $(tz-cflags) -DHAVE_GETTEXT
CFLAGS-ialloc.c = -DNOID -DHAVE_GETTEXT
CFLAGS-scheck.c = -DNOID -DHAVE_GETTEXT
# We have to make sure the data for testing the tz functions is available.
# Don't add leapseconds here since test-tz made checks that work only without
# leapseconds.
define build-testdata
$(built-program-cmd) -d $(testdata) -y ./yearistype $<; \
$(evaluate-test)
endef
$(objpfx)test-tz.out: $(addprefix $(testdata)/, America/New_York Etc/UTC UTC)
$(objpfx)tst-timezone.out: $(addprefix $(testdata)/, \
Europe/Berlin Universal \
Australia/Melbourne \
America/Sao_Paulo Asia/Tokyo \
Europe/London)
$(objpfx)tst-tzset.out: $(addprefix $(testdata)/XT, 1 2 3 4)
test-tz-ENV = TZDIR=$(testdata)
tst-timezone-ENV = TZDIR=$(testdata)
tst-tzset-ENV = TZDIR=$(testdata)
# Note this must come second in the deps list for $(built-program-cmd) to work.
zic-deps = $(objpfx)zic $(leapseconds) yearistype
$(testdata)/America/New_York: northamerica $(zic-deps)
$(build-testdata)
$(testdata)/Etc/UTC: etcetera $(zic-deps)
$(build-testdata)
# Use a pattern rule to indicate the command produces both targets at once.
# Two separate targets built separately can collide if in parallel.
%/UTC %/Universal: simplebackw $(zic-deps) %/Etc/UTC
$(build-testdata)
{ test -r $(@D)/Universal.test-result \
&& cp $(@D)/Universal.test-result $(@D)/UTC.test-result \
&& sed -i 's/Universal/UTC/' $(@D)/UTC.test-result ; exit 0; }
{ test -r $(@D)/UTC.test-result \
&& cp $(@D)/UTC.test-result $(@D)/Universal.test-result \
&& sed -i 's/UTC/Universal/' $(@D)/Universal.test-result ; exit 0; }
$(testdata)/%/Berlin $(testdata)/%/London: europe $(zic-deps)
$(build-testdata)
$(testdata)/Australia/Melbourne: australasia $(zic-deps)
$(build-testdata)
$(testdata)/America/Sao_Paulo: southamerica $(zic-deps)
$(build-testdata)
$(testdata)/Asia/Tokyo: asia $(zic-deps)
$(build-testdata)
$(testdata)/XT%: testdata/XT%
$(make-target-directory)
cp $< $@
$(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make
sed -e 's|/bin/bash|$(BASH)|' \
-e 's|TZDIR=[^}]*|TZDIR=$(zonedir)|' \
-e '/TZVERSION=/s|see_Makefile|"$(version)"|' \
-e '/PKGVERSION=/s|=.*|="$(PKGVERSION)"|' \
-e '/REPORT_BUGS_TO=/s|=.*|="$(REPORT_BUGS_TO)"|' \
< $< > $@.new
chmod 555 $@.new
mv -f $@.new $@