xref: /freebsd/contrib/tzcode/Makefile (revision 212e3524943222650688bd1f49d5eb4c9326de7f)
1bc421551SDag-Erling Smørgrav# Make and install tzdb code and data.
2bc421551SDag-Erling Smørgrav# This file is in the public domain, so clarified as of
3bc421551SDag-Erling Smørgrav# 2009-05-17 by Arthur David Olson.
446c59934SDag-Erling Smørgrav# Request POSIX conformance; this must be the first non-comment line.
546c59934SDag-Erling Smørgrav.POSIX:
6ff2c98b3SDag-Erling Smørgrav# By default, builds of code and data assume POSIX.1-2001 or later;
7ff2c98b3SDag-Erling Smørgrav# this assumption can be relaxed by tailoring the build as described below.
8a979394aSDag-Erling Smørgrav# On older platforms you may need to scrounge for POSIX conformance.
9a979394aSDag-Erling Smørgrav# For example, on Solaris 10 (2005) with Sun Studio 12 aka Sun C 5.9 (2007),
10a979394aSDag-Erling Smørgrav# use 'PATH=/usr/xpg4/bin:$PATH make CC=c99'.
11ff2c98b3SDag-Erling Smørgrav# Reproducible builds of distribution tarballs also need a copy of the
12ff2c98b3SDag-Erling Smørgrav# Git repository, and assume the behavior of the following programs
13ff2c98b3SDag-Erling Smørgrav# (or later versions):
14ff2c98b3SDag-Erling Smørgrav#	Git 2.7.0 (2016)
15ff2c98b3SDag-Erling Smørgrav#	GNU Coreutils 6.3 (2006)
16ff2c98b3SDag-Erling Smørgrav#	GNU Tar 1.14 (2004)
17ff2c98b3SDag-Erling Smørgrav#	GnuPG 1.4 (2004)
18ff2c98b3SDag-Erling Smørgrav# Although tzdb does not come with a software bill of materials,
19ff2c98b3SDag-Erling Smørgrav# you should be able to construct one based on the above information,
20ff2c98b3SDag-Erling Smørgrav# your platform, and the way you use this Makefile.
2146c59934SDag-Erling Smørgrav
2246c59934SDag-Erling Smørgrav# To affect how this Makefile works, you can run a shell script like this:
2346c59934SDag-Erling Smørgrav#
2446c59934SDag-Erling Smørgrav#	#!/bin/sh
25ff2c98b3SDag-Erling Smørgrav#	make CFLAGS='-O2 -DHAVE_GETTEXT=0' "$@"
2646c59934SDag-Erling Smørgrav#
27ff2c98b3SDag-Erling Smørgrav# This example script is appropriate for a GNU/Linux system
28ff2c98b3SDag-Erling Smørgrav# which needs more optimization than default, and which does not want
29ff2c98b3SDag-Erling Smørgrav# gettext's internationalization of diagnostics.
3046c59934SDag-Erling Smørgrav#
3146c59934SDag-Erling Smørgrav# Alternatively, you can simply edit this Makefile to tailor the following
3246c59934SDag-Erling Smørgrav# macro definitions.
3346c59934SDag-Erling Smørgrav
3446c59934SDag-Erling Smørgrav###############################################################################
3546c59934SDag-Erling Smørgrav# Start of macros that one plausibly might want to tailor.
36bc421551SDag-Erling Smørgrav
37bc421551SDag-Erling Smørgrav# Package name for the code distribution.
38bc421551SDag-Erling SmørgravPACKAGE=	tzcode
39bc421551SDag-Erling Smørgrav
40bc421551SDag-Erling Smørgrav# Version number for the distribution, overridden in the 'tarballs' rule below.
41bc421551SDag-Erling SmørgravVERSION=	unknown
42bc421551SDag-Erling Smørgrav
43bc421551SDag-Erling Smørgrav# Email address for bug reports.
44bc421551SDag-Erling SmørgravBUGEMAIL=	tz@iana.org
45bc421551SDag-Erling Smørgrav
46bc421551SDag-Erling Smørgrav# DATAFORM selects the data format.
47bc421551SDag-Erling Smørgrav# Available formats represent essentially the same data, albeit
48bc421551SDag-Erling Smørgrav# possibly with minor discrepancies that users are not likely to notice.
49bc421551SDag-Erling Smørgrav# To get new features and the best data right away, use:
50bc421551SDag-Erling Smørgrav#	DATAFORM=	vanguard
51bc421551SDag-Erling Smørgrav# To wait a while before using new features, to give downstream users
52bc421551SDag-Erling Smørgrav# time to upgrade zic (the default), use:
53bc421551SDag-Erling Smørgrav#	DATAFORM=	main
54bc421551SDag-Erling Smørgrav# To wait even longer for new features, use:
55bc421551SDag-Erling Smørgrav#	DATAFORM=	rearguard
56bc421551SDag-Erling Smørgrav# Rearguard users might also want "ZFLAGS = -b fat"; see below.
57bc421551SDag-Erling SmørgravDATAFORM=		main
58bc421551SDag-Erling Smørgrav
59bc421551SDag-Erling Smørgrav# Change the line below for your timezone (after finding the one you want in
60bc421551SDag-Erling Smørgrav# one of the $(TDATA) source files, or adding it to a source file).
61bc421551SDag-Erling Smørgrav# Alternatively, if you discover you've got the wrong timezone, you can just
62bc421551SDag-Erling Smørgrav# 'zic -l -' to remove it, or 'zic -l rightzone' to change it.
63bc421551SDag-Erling Smørgrav# Use the command
64bc421551SDag-Erling Smørgrav#	make zonenames
65bc421551SDag-Erling Smørgrav# to get a list of the values you can use for LOCALTIME.
66bc421551SDag-Erling Smørgrav
67bc421551SDag-Erling SmørgravLOCALTIME=	Factory
68bc421551SDag-Erling Smørgrav
69bc421551SDag-Erling Smørgrav
70bc421551SDag-Erling Smørgrav# Installation locations.
71bc421551SDag-Erling Smørgrav#
72bc421551SDag-Erling Smørgrav# The defaults are suitable for Debian, except that if REDO is
73bc421551SDag-Erling Smørgrav# posix_right or right_posix then files that Debian puts under
74bc421551SDag-Erling Smørgrav# /usr/share/zoneinfo/posix and /usr/share/zoneinfo/right are instead
75bc421551SDag-Erling Smørgrav# put under /usr/share/zoneinfo-posix and /usr/share/zoneinfo-leaps,
76bc421551SDag-Erling Smørgrav# respectively.  Problems with the Debian approach are discussed in
77bc421551SDag-Erling Smørgrav# the commentary for the right_posix rule (below).
78bc421551SDag-Erling Smørgrav
79bc421551SDag-Erling Smørgrav# Destination directory, which can be used for staging.
80bc421551SDag-Erling Smørgrav# 'make DESTDIR=/stage install' installs under /stage (e.g., to
81bc421551SDag-Erling Smørgrav# /stage/etc/localtime instead of to /etc/localtime).  Files under
82bc421551SDag-Erling Smørgrav# /stage are not intended to work as-is, but can be copied by hand to
83bc421551SDag-Erling Smørgrav# the root directory later.  If DESTDIR is empty, 'make install' does
84bc421551SDag-Erling Smørgrav# not stage, but installs directly into production locations.
85bc421551SDag-Erling SmørgravDESTDIR =
86bc421551SDag-Erling Smørgrav
87bc421551SDag-Erling Smørgrav# Everything is installed into subdirectories of TOPDIR, and used there.
88bc421551SDag-Erling Smørgrav# TOPDIR should be empty (meaning the root directory),
89bc421551SDag-Erling Smørgrav# or a directory name that does not end in "/".
90bc421551SDag-Erling Smørgrav# TOPDIR should be empty or an absolute name unless you're just testing.
91bc421551SDag-Erling SmørgravTOPDIR =
92bc421551SDag-Erling Smørgrav
93bc421551SDag-Erling Smørgrav# The default local timezone is taken from the file TZDEFAULT.
94bc421551SDag-Erling SmørgravTZDEFAULT = $(TOPDIR)/etc/localtime
95bc421551SDag-Erling Smørgrav
96bc421551SDag-Erling Smørgrav# The subdirectory containing installed program and data files, and
97bc421551SDag-Erling Smørgrav# likewise for installed files that can be shared among architectures.
98bc421551SDag-Erling Smørgrav# These should be relative file names.
99bc421551SDag-Erling SmørgravUSRDIR = usr
100bc421551SDag-Erling SmørgravUSRSHAREDIR = $(USRDIR)/share
101bc421551SDag-Erling Smørgrav
102bc421551SDag-Erling Smørgrav# "Compiled" timezone information is placed in the "TZDIR" directory
103bc421551SDag-Erling Smørgrav# (and subdirectories).
104bc421551SDag-Erling Smørgrav# TZDIR_BASENAME should not contain "/" and should not be ".", ".." or empty.
105bc421551SDag-Erling SmørgravTZDIR_BASENAME=	zoneinfo
106bc421551SDag-Erling SmørgravTZDIR = $(TOPDIR)/$(USRSHAREDIR)/$(TZDIR_BASENAME)
107bc421551SDag-Erling Smørgrav
108bc421551SDag-Erling Smørgrav# The "tzselect" and (if you do "make INSTALL") "date" commands go in:
109bc421551SDag-Erling SmørgravBINDIR = $(TOPDIR)/$(USRDIR)/bin
110bc421551SDag-Erling Smørgrav
111bc421551SDag-Erling Smørgrav# The "zdump" command goes in:
112bc421551SDag-Erling SmørgravZDUMPDIR = $(BINDIR)
113bc421551SDag-Erling Smørgrav
114bc421551SDag-Erling Smørgrav# The "zic" command goes in:
115bc421551SDag-Erling SmørgravZICDIR = $(TOPDIR)/$(USRDIR)/sbin
116bc421551SDag-Erling Smørgrav
11728f617deSDag-Erling Smørgrav# Manual pages go in subdirectories of:
118bc421551SDag-Erling SmørgravMANDIR = $(TOPDIR)/$(USRSHAREDIR)/man
119bc421551SDag-Erling Smørgrav
120bc421551SDag-Erling Smørgrav# Library functions are put in an archive in LIBDIR.
121bc421551SDag-Erling SmørgravLIBDIR = $(TOPDIR)/$(USRDIR)/lib
122bc421551SDag-Erling Smørgrav
123bc421551SDag-Erling Smørgrav
124bc421551SDag-Erling Smørgrav# Types to try, as an alternative to time_t.
125bc421551SDag-Erling SmørgravTIME_T_ALTERNATIVES = $(TIME_T_ALTERNATIVES_HEAD) $(TIME_T_ALTERNATIVES_TAIL)
126a979394aSDag-Erling SmørgravTIME_T_ALTERNATIVES_HEAD = int_least64_t.ck
127a979394aSDag-Erling SmørgravTIME_T_ALTERNATIVES_TAIL = int_least32_t.ck uint_least32_t.ck \
128a979394aSDag-Erling Smørgrav  uint_least64_t.ck
129bc421551SDag-Erling Smørgrav
130bc421551SDag-Erling Smørgrav# What kind of TZif data files to generate.  (TZif is the binary time
131967a49a2SDag-Erling Smørgrav# zone data format that zic generates; see Internet RFC 9636.)
132bc421551SDag-Erling Smørgrav# If you want only POSIX time, with time values interpreted as
133bc421551SDag-Erling Smørgrav# seconds since the epoch (not counting leap seconds), use
134bc421551SDag-Erling Smørgrav#	REDO=		posix_only
135bc421551SDag-Erling Smørgrav# below.  If you want only "right" time, with values interpreted
136bc421551SDag-Erling Smørgrav# as seconds since the epoch (counting leap seconds), use
137bc421551SDag-Erling Smørgrav#	REDO=		right_only
138bc421551SDag-Erling Smørgrav# below.  If you want both sets of data available, with leap seconds not
139bc421551SDag-Erling Smørgrav# counted normally, use
140bc421551SDag-Erling Smørgrav#	REDO=		posix_right
141bc421551SDag-Erling Smørgrav# below.  If you want both sets of data available, with leap seconds counted
142bc421551SDag-Erling Smørgrav# normally, use
143bc421551SDag-Erling Smørgrav#	REDO=		right_posix
144ff2c98b3SDag-Erling Smørgrav# below.  POSIX mandates that leap seconds not be counted, and a
145ff2c98b3SDag-Erling Smørgrav# nonnegative TZ_CHANGE_INTERVAL also assumes this, so to be compatible with
146ff2c98b3SDag-Erling Smørgrav# these, use "posix_only" or "posix_right".  Use POSIX time on systems with
147bc421551SDag-Erling Smørgrav# leap smearing; this can work better than unsmeared "right" time with
14828f617deSDag-Erling Smørgrav# applications that are not aware of leap seconds, and is closer to unsmeared
149bc421551SDag-Erling Smørgrav# "right" time than unsmeared POSIX time is (e.g., 0.5 vs 1.0 s max error).
150bc421551SDag-Erling Smørgrav
151ff2c98b3SDag-Erling SmørgravREDO=		posix_only
152bc421551SDag-Erling Smørgrav
153bc421551SDag-Erling Smørgrav# Whether to put an "Expires" line in the leapseconds file.
154bc421551SDag-Erling Smørgrav# Use EXPIRES_LINE=1 to put the line in, 0 to omit it.
155bc421551SDag-Erling Smørgrav# The EXPIRES_LINE value matters only if REDO's value contains "right".
156bc421551SDag-Erling Smørgrav# If you change EXPIRES_LINE, remove the leapseconds file before running "make".
157bc421551SDag-Erling Smørgrav# zic's support for the Expires line was introduced in tzdb 2020a,
158bc421551SDag-Erling Smørgrav# and was modified in tzdb 2021b to generate version 4 TZif files.
159bc421551SDag-Erling Smørgrav# EXPIRES_LINE defaults to 0 for now so that the leapseconds file
160bc421551SDag-Erling Smørgrav# can be given to pre-2020a zic implementations and so that TZif files
161bc421551SDag-Erling Smørgrav# built by newer zic implementations can be read by pre-2021b libraries.
162bc421551SDag-Erling SmørgravEXPIRES_LINE=	0
163bc421551SDag-Erling Smørgrav
164bc421551SDag-Erling Smørgrav# To install data in text form that has all the information of the TZif data,
165bc421551SDag-Erling Smørgrav# (optionally incorporating leap second information), use
166bc421551SDag-Erling Smørgrav#	TZDATA_TEXT=	tzdata.zi leapseconds
167bc421551SDag-Erling Smørgrav# To install text data without leap second information (e.g., because
168bc421551SDag-Erling Smørgrav# REDO='posix_only'), use
169bc421551SDag-Erling Smørgrav#	TZDATA_TEXT=	tzdata.zi
170bc421551SDag-Erling Smørgrav# To avoid installing text data, use
171bc421551SDag-Erling Smørgrav#	TZDATA_TEXT=
172bc421551SDag-Erling Smørgrav
173bc421551SDag-Erling SmørgravTZDATA_TEXT=	leapseconds tzdata.zi
174bc421551SDag-Erling Smørgrav
175*212e3524SDag-Erling Smørgrav# For backward-compatibility links and zones for old names, use
176bc421551SDag-Erling Smørgrav#	BACKWARD=	backward
177*212e3524SDag-Erling Smørgrav# To omit these links and zones, use
178bc421551SDag-Erling Smørgrav#	BACKWARD=
179bc421551SDag-Erling Smørgrav
180bc421551SDag-Erling SmørgravBACKWARD=	backward
181bc421551SDag-Erling Smørgrav
182bc421551SDag-Erling Smørgrav# If you want out-of-scope and often-wrong data from the file 'backzone',
183bc421551SDag-Erling Smørgrav# but only for entries listed in the backward-compatibility file zone.tab, use
184bc421551SDag-Erling Smørgrav#	PACKRATDATA=	backzone
185bc421551SDag-Erling Smørgrav#	PACKRATLIST=	zone.tab
186bc421551SDag-Erling Smørgrav# If you want all the 'backzone' data, use
187bc421551SDag-Erling Smørgrav#	PACKRATDATA=	backzone
188bc421551SDag-Erling Smørgrav#	PACKRATLIST=
189bc421551SDag-Erling Smørgrav# To omit this data, use
190bc421551SDag-Erling Smørgrav#	PACKRATDATA=
191bc421551SDag-Erling Smørgrav#	PACKRATLIST=
192bc421551SDag-Erling Smørgrav
193bc421551SDag-Erling SmørgravPACKRATDATA=
194bc421551SDag-Erling SmørgravPACKRATLIST=
195bc421551SDag-Erling Smørgrav
196bc421551SDag-Erling Smørgrav# The name of a locale using the UTF-8 encoding, used during self-tests.
197bc421551SDag-Erling Smørgrav# The tests are skipped if the name does not appear to work on this system.
198bc421551SDag-Erling Smørgrav
199bc421551SDag-Erling SmørgravUTF8_LOCALE=	en_US.utf8
200bc421551SDag-Erling Smørgrav
201ff2c98b3SDag-Erling Smørgrav# Extra flags for producing man page files like tzfile.5.txt.
202ff2c98b3SDag-Erling Smørgrav# These flags are used only if groff (or mandoc) is present.
203ff2c98b3SDag-Erling Smørgrav# Each option should begin with "-" and should lack shell metacharacters.
204ff2c98b3SDag-Erling Smørgrav# Plausible options include -Tascii and -Tutf8.
205ff2c98b3SDag-Erling SmørgravMANFLAGS=	-Tutf8
206ff2c98b3SDag-Erling Smørgrav
207bc421551SDag-Erling Smørgrav# Non-default libraries needed to link.
208bc421551SDag-Erling Smørgrav# On some hosts, this should have -lintl unless CFLAGS has -DHAVE_GETTEXT=0.
209bc421551SDag-Erling SmørgravLDLIBS=
210bc421551SDag-Erling Smørgrav
21146c59934SDag-Erling Smørgrav# Add the following to an uncommented "CFLAGS=" line as needed
21246c59934SDag-Erling Smørgrav# to override defaults specified in the source code or by the system.
21346c59934SDag-Erling Smørgrav# "-DFOO" is equivalent to "-DFOO=1".
214bc421551SDag-Erling Smørgrav#  -DDEPRECATE_TWO_DIGIT_YEARS for optional runtime warnings about strftime
215bc421551SDag-Erling Smørgrav#	formats that generate only the last two digits of year numbers
216bc421551SDag-Erling Smørgrav#  -DEPOCH_LOCAL if the 'time' function returns local time not UT
217bc421551SDag-Erling Smørgrav#  -DEPOCH_OFFSET=N if the 'time' function returns a value N greater
218bc421551SDag-Erling Smørgrav#	than what POSIX specifies, assuming local time is UT.
219bc421551SDag-Erling Smørgrav#	For example, N is 252460800 on AmigaOS.
220ff2c98b3SDag-Erling Smørgrav#  -DFREE_PRESERVES_ERRNO=[01] if the 'free' function munges or preserves errno
221ff2c98b3SDag-Erling Smørgrav#	(default is guessed)
222bc421551SDag-Erling Smørgrav#  -DHAVE_DECL_ASCTIME_R=0 if <time.h> does not declare asctime_r
223a979394aSDag-Erling Smørgrav#	on POSIX platforms predating POSIX.1-2024
224bc421551SDag-Erling Smørgrav#  -DHAVE_DECL_ENVIRON if <unistd.h> declares 'environ'
225bc421551SDag-Erling Smørgrav#  -DHAVE_DECL_TIMEGM=0 if <time.h> does not declare timegm
226bc421551SDag-Erling Smørgrav#  -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
227ff2c98b3SDag-Erling Smørgrav#  -DHAVE_FCHMOD=0 if your system lacks the fchmod function
22875411d15SDag-Erling Smørgrav#  -DHAVE__GENERIC=0 if _Generic does not work*
229ff2c98b3SDag-Erling Smørgrav#  -DHAVE_GETEUID=0 if gete?[ug]id do not work
230bc421551SDag-Erling Smørgrav#  -DHAVE_GETRANDOM if getrandom works (e.g., GNU/Linux),
231bc421551SDag-Erling Smørgrav#	-DHAVE_GETRANDOM=0 to avoid using getrandom
232ff2c98b3SDag-Erling Smørgrav#  -DHAVE_GETRESUID=0 if getres[ug]id do not work
233bc421551SDag-Erling Smørgrav#  -DHAVE_GETTEXT if gettext works (e.g., GNU/Linux, FreeBSD, Solaris),
234bc421551SDag-Erling Smørgrav#	where LDLIBS also needs to contain -lintl on some hosts;
235bc421551SDag-Erling Smørgrav#	-DHAVE_GETTEXT=0 to avoid using gettext
236bc421551SDag-Erling Smørgrav#  -DHAVE_INCOMPATIBLE_CTIME_R if your system's time.h declares
237a979394aSDag-Erling Smørgrav#	ctime_r and asctime_r incompatibly with POSIX.1-2017 and earlier
238bc421551SDag-Erling Smørgrav#	(Solaris when _POSIX_PTHREAD_SEMANTICS is not defined).
23975411d15SDag-Erling Smørgrav#  -DHAVE_INTTYPES_H=0 if <inttypes.h> does not work*+
240ff2c98b3SDag-Erling Smørgrav#  -DHAVE_ISSETUGID=1 if issetugid works, 0 otherwise (default is guessed)
241ff2c98b3SDag-Erling Smørgrav#	If 0, you may also use -DHAVE_SYS_AUXV_H=1 if <sys/auxv.h> works,
242ff2c98b3SDag-Erling Smørgrav#	0 otherwise (default is guessed).
243bc421551SDag-Erling Smørgrav#  -DHAVE_LINK=0 if your system lacks a link function
244bc421551SDag-Erling Smørgrav#  -DHAVE_LOCALTIME_R=0 if your system lacks a localtime_r function
245bc421551SDag-Erling Smørgrav#  -DHAVE_LOCALTIME_RZ=0 if you do not want zdump to use localtime_rz
246bc421551SDag-Erling Smørgrav#	localtime_rz can make zdump significantly faster, but is nonstandard.
247bc421551SDag-Erling Smørgrav#  -DHAVE_MALLOC_ERRNO=0 if malloc etc. do not set errno on failure.
248ff2c98b3SDag-Erling Smørgrav#  -DHAVE_MEMPCPY=1 if your system has mempcpy, 0 if not (default is guessed)
249bc421551SDag-Erling Smørgrav#  -DHAVE_POSIX_DECLS=0 if your system's include files do not declare
250ff2c98b3SDag-Erling Smørgrav#	variables like 'tzname' required by POSIX
251ff2c98b3SDag-Erling Smørgrav#  -DHAVE_PWD_H=0 if your system lacks pwd.h, grp.h and corresponding functions
252ff2c98b3SDag-Erling Smørgrav#	If 0, you may also need -Dgid_t=G -Duid_t=U
253ff2c98b3SDag-Erling Smørgrav#	to define gid_t and uid_t to be types G and U.
254bc421551SDag-Erling Smørgrav#  -DHAVE_SETENV=0 if your system lacks the setenv function
255ff2c98b3SDag-Erling Smørgrav#  -DHAVE_SETMODE=[01] if your system lacks or has the setmode and getmode
256ff2c98b3SDag-Erling Smørgrav#	functions (default is guessed)
25775411d15SDag-Erling Smørgrav#  -DHAVE_SNPRINTF=0 if your system lacks the snprintf function+
258bc421551SDag-Erling Smørgrav#  -DHAVE_STDCKDINT_H=0 if neither <stdckdint.h> nor substitutes like
259bc421551SDag-Erling Smørgrav#	__builtin_add_overflow work*
26075411d15SDag-Erling Smørgrav#  -DHAVE_STDINT_H=0 if <stdint.h> does not work*+
261bc421551SDag-Erling Smørgrav#  -DHAVE_STRFTIME_L if <time.h> declares locale_t and strftime_l
262bc421551SDag-Erling Smørgrav#  -DHAVE_STRDUP=0 if your system lacks the strdup function
263ff2c98b3SDag-Erling Smørgrav#  -DHAVE_STRNLEN=0 if your system lacks the strnlen function+
26475411d15SDag-Erling Smørgrav#  -DHAVE_STRTOLL=0 if your system lacks the strtoll function+
265ff2c98b3SDag-Erling Smørgrav#  -DHAVE_STRUCT_STAT_ST_CTIM=0 if struct stat lacks a status-change member
266ff2c98b3SDag-Erling Smørgrav#	of type struct timespec, so code should use st_ctime instead;
267ff2c98b3SDag-Erling Smørgrav#	but if the status-change member name is st_ctimespec,
268ff2c98b3SDag-Erling Smørgrav#	use -Dst_ctim=st_ctimespec instead (default is guessed)+
269ff2c98b3SDag-Erling Smørgrav#  -DHAVE_STRUCT_TIMESPEC=0 if your system lacks struct timespec+
270bc421551SDag-Erling Smørgrav#  -DHAVE_SYMLINK=0 if your system lacks the symlink function
271bc421551SDag-Erling Smørgrav#  -DHAVE_SYS_STAT_H=0 if <sys/stat.h> does not work*
272ff2c98b3SDag-Erling Smørgrav#	If 0, you may also need -Dmode_t=M to define mode_t to be type M.
273bc421551SDag-Erling Smørgrav#  -DHAVE_TZSET=0 if your system lacks a tzset function
274bc421551SDag-Erling Smørgrav#  -DHAVE_UNISTD_H=0 if <unistd.h> does not work*
275bc421551SDag-Erling Smørgrav#  -DHAVE_UTMPX_H=0 if <utmpx.h> does not work*
276bc421551SDag-Erling Smørgrav#  -Dlocale_t=XXX if your system uses XXX instead of locale_t
277967a49a2SDag-Erling Smørgrav#  -DMKTIME_MIGHT_OVERFLOW if mktime might fail due to time_t overflow
278ff2c98b3SDag-Erling Smørgrav#  -DOPENAT_TZDIR if tzset should use openat on TZDIR then a relative open.
279ff2c98b3SDag-Erling Smørgrav#	See localtime.c for details.
28046c59934SDag-Erling Smørgrav#  -DPORT_TO_C89 if tzcode should also run on mostly-C89 platforms+
28146c59934SDag-Erling Smørgrav#	Typically it is better to use a later standard.  For example,
28246c59934SDag-Erling Smørgrav#	with GCC 4.9.4 (2016), prefer '-std=gnu11' to '-DPORT_TO_C89'.
28346c59934SDag-Erling Smørgrav#	Even with -DPORT_TO_C89, the code needs at least one C99
28446c59934SDag-Erling Smørgrav#	feature (integers at least 64 bits wide) and maybe more.
285bc421551SDag-Erling Smørgrav#  -DRESERVE_STD_EXT_IDS if your platform reserves standard identifiers
286bc421551SDag-Erling Smørgrav#	with external linkage, e.g., applications cannot define 'localtime'.
287967a49a2SDag-Erling Smørgrav#  -Dssize_t=int on hosts like MS-Windows that lack ssize_t
288a979394aSDag-Erling Smørgrav#  -DSUPPORT_C89=0 if the tzcode library should not support C89 callers
289a979394aSDag-Erling Smørgrav#	Although -DSUPPORT_C89=0 might work around latent bugs in callers,
290a979394aSDag-Erling Smørgrav#	it does not conform to POSIX.
291a979394aSDag-Erling Smørgrav#  -DSUPPORT_POSIX2008 if the library should support older POSIX callers+
292a979394aSDag-Erling Smørgrav#	However, this might cause problems in POSIX.1-2024-or-later callers.
293bc421551SDag-Erling Smørgrav#  -DSUPPRESS_TZDIR to not prepend TZDIR to file names; this has
294bc421551SDag-Erling Smørgrav#	security implications and is not recommended for general use
295bc421551SDag-Erling Smørgrav#  -DTHREAD_SAFE to make localtime.c thread-safe, as POSIX requires;
296bc421551SDag-Erling Smørgrav#	not needed by the main-program tz code, which is single-threaded.
297bc421551SDag-Erling Smørgrav#	Append other compiler flags as needed, e.g., -pthread on GNU/Linux.
29828f617deSDag-Erling Smørgrav#	With -DTHREAD_SAFE the following options can also be used:
299ff2c98b3SDag-Erling Smørgrav#	  -DTHREAD_PREFER_SINGLE to prefer speed in single-threaded apps,
300ff2c98b3SDag-Erling Smørgrav#	    at some cost in CPU time and energy in multi-threaded apps.
30128f617deSDag-Erling Smørgrav#	    With -DTHREAD_PREFER_SINGLE the following options can also be used:
302ff2c98b3SDag-Erling Smørgrav#	      -DHAVE___ISTHREADED=1 if there is an extern int __isthreaded
303ff2c98b3SDag-Erling Smørgrav#		variable, 0 otherwise (default is guessed)
304ff2c98b3SDag-Erling Smørgrav#	      -DHAVE_SYS_SINGLE_THREADED_H=0 if <sys/single_threaded.h> works,
305ff2c98b3SDag-Erling Smørgrav#		0 otherwise (default is guessed)
306ff2c98b3SDag-Erling Smørgrav#	  -DTHREAD_RWLOCK to use read-write locks instead of mutexes.
307ff2c98b3SDag-Erling Smørgrav#	    This can improve parallelism and thus save real time
308ff2c98b3SDag-Erling Smørgrav#	    if many threads call tzcode functions simultaneously.
309ff2c98b3SDag-Erling Smørgrav#	    It also costs CPU time and thus energy.
310ff2c98b3SDag-Erling Smørgrav#	  -DTHREAD_TM_MULTI to have gmtime, localtime, and offtime
311ff2c98b3SDag-Erling Smørgrav#	    return different struct tm * addresses in different threads.
312ff2c98b3SDag-Erling Smørgrav#	    This supports nonportable programs that call
313ff2c98b3SDag-Erling Smørgrav#	    gmtime/localtime/offtime when they should call
314ff2c98b3SDag-Erling Smørgrav#	    gmtime_r/localtime_r/offtime_r to avoid races.
315ff2c98b3SDag-Erling Smørgrav#	    Because the corresponding storage is freed on thread exit,
316ff2c98b3SDag-Erling Smørgrav#	    this option is incompatible with POSIX.1-2024 and earlier.
317ff2c98b3SDag-Erling Smørgrav#	    It also costs CPU time and memory.
318bc421551SDag-Erling Smørgrav#  -Dtime_tz=\"T\" to use T as the time_t type, rather than the system time_t
319bc421551SDag-Erling Smørgrav#	This is intended for internal use only; it mangles external names.
320ff2c98b3SDag-Erling Smørgrav#  -DTZ_CHANGE_INTERVAL=N if functions depending on TZ should check
321ff2c98b3SDag-Erling Smørgrav#	no more often than every N seconds for TZif file changes.
322ff2c98b3SDag-Erling Smørgrav#	If N is negative (the default), no such checking is done.
323ff2c98b3SDag-Erling Smørgrav#	This option is intended for platforms that want localtime etc.
324ff2c98b3SDag-Erling Smørgrav#	to respond to changes to a file selected by TZ, including to
325ff2c98b3SDag-Erling Smørgrav#	TZDEFAULT (normally /etc/localtime) if TZ is unset.
326ff2c98b3SDag-Erling Smørgrav#	On these platforms, REDO should be "posix_only" or "posix_right".
327ff2c98b3SDag-Erling Smørgrav#	This option does not affect tzalloc-allocated objects.
328bc421551SDag-Erling Smørgrav#  -DTZ_DOMAIN=\"foo\" to use "foo" for gettext domain name; default is "tz"
329bc421551SDag-Erling Smørgrav#  -DTZ_DOMAINDIR=\"/path\" to use "/path" for gettext directory;
330bc421551SDag-Erling Smørgrav#	the default is system-supplied, typically "/usr/lib/locale"
331ff2c98b3SDag-Erling Smørgrav#  -DTZ_RUNTIME_LEAPS=0 to disable runtime support for leap seconds.
332ff2c98b3SDag-Erling Smørgrav#	This conforms to POSIX, shrinks tzcode's attack surface,
333ff2c98b3SDag-Erling Smørgrav#	and is more efficient.  However, it fails to support Internet
334ff2c98b3SDag-Erling Smørgrav#	RFC 9636's leap seconds.
335bc421551SDag-Erling Smørgrav#  -DTZDEFRULESTRING=\",date/time,date/time\" to default to the specified
336ff2c98b3SDag-Erling Smørgrav#	DST transitions for proleptic format TZ strings lacking them.
337ff2c98b3SDag-Erling Smørgrav#	If not specified, it defaults to US rules for future DST transitions.
33875411d15SDag-Erling Smørgrav#	This mishandles some past timestamps, as US DST rules have changed.
33975411d15SDag-Erling Smørgrav#	It also mishandles settings like TZ='EET-2EEST' for eastern Europe,
34075411d15SDag-Erling Smørgrav#	as Europe and US DST rules differ.
341967a49a2SDag-Erling Smørgrav#  -DTZNAME_MAXIMUM=N to limit time zone abbreviations to N bytes (default 254)
342bc421551SDag-Erling Smørgrav#  -DUNINIT_TRAP if reading uninitialized storage can cause problems
343bc421551SDag-Erling Smørgrav#	other than simply getting garbage data
344bc421551SDag-Erling Smørgrav#  -DUSE_LTZ=0 to build zdump with the system time zone library
345bc421551SDag-Erling Smørgrav#	Also set TZDOBJS=zdump.o and CHECK_TIME_T_ALTERNATIVES= below.
346bc421551SDag-Erling Smørgrav#  -DZIC_BLOAT_DEFAULT=\"fat\" to default zic's -b option to "fat", and
347bc421551SDag-Erling Smørgrav#	similarly for "slim".  Fat TZif files work around incompatibilities
348bc421551SDag-Erling Smørgrav#	and bugs in some TZif readers, notably older ones that
349bc421551SDag-Erling Smørgrav#	ignore or otherwise mishandle 64-bit data in TZif files;
350bc421551SDag-Erling Smørgrav#	however, fat TZif files may trigger bugs in newer TZif readers.
351bc421551SDag-Erling Smørgrav#	Slim TZif files are more efficient, and are the default.
352bc421551SDag-Erling Smørgrav#  -DZIC_MAX_ABBR_LEN_WO_WARN=3
353bc421551SDag-Erling Smørgrav#	(or some other number) to set the maximum time zone abbreviation length
354bc421551SDag-Erling Smørgrav#	that zic will accept without a warning (the default is 6)
35546c59934SDag-Erling Smørgrav#  -g to generate symbolic debugging info
35646c59934SDag-Erling Smørgrav#  -Idir to include from directory 'dir'
35746c59934SDag-Erling Smørgrav#  -O0 to disable optimization; other -O options to enable more optimization
35846c59934SDag-Erling Smørgrav#  -Uname to remove any definition of the macro 'name'
359bc421551SDag-Erling Smørgrav#  $(GCC_DEBUG_FLAGS) if you are using recent GCC and want lots of checking
360bc421551SDag-Erling Smørgrav#
361bc421551SDag-Erling Smørgrav# * Options marked "*" can be omitted if your compiler is C23 compatible.
36275411d15SDag-Erling Smørgrav# * Options marked "+" are obsolescent and are planned to be removed
363a979394aSDag-Erling Smørgrav#   once the code assumes C99 or later (say in the year 2029)
364a979394aSDag-Erling Smørgrav#   and POSIX.1-2024 or later (say in the year 2034).
365bc421551SDag-Erling Smørgrav#
366bc421551SDag-Erling Smørgrav# Select instrumentation via "make GCC_INSTRUMENT='whatever'".
367bc421551SDag-Erling SmørgravGCC_INSTRUMENT = \
368bc421551SDag-Erling Smørgrav  -fsanitize=undefined -fsanitize-address-use-after-scope \
369ff2c98b3SDag-Erling Smørgrav  -fsanitize-trap=all -fstack-protector
370bc421551SDag-Erling Smørgrav# Omit -fanalyzer from GCC_DEBUG_FLAGS, as it makes GCC too slow.
371a979394aSDag-Erling SmørgravGCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 \
372bc421551SDag-Erling Smørgrav  $(GCC_INSTRUMENT) \
373bc421551SDag-Erling Smørgrav  -Wall -Wextra \
374bc421551SDag-Erling Smørgrav  -Walloc-size-larger-than=100000 -Warray-bounds=2 \
375967a49a2SDag-Erling Smørgrav  -Wbad-function-cast -Wbidi-chars=any,ucn -Wcast-align=strict -Wcast-qual \
376967a49a2SDag-Erling Smørgrav  -Wdate-time \
377bc421551SDag-Erling Smørgrav  -Wdeclaration-after-statement -Wdouble-promotion \
378a979394aSDag-Erling Smørgrav  -Wduplicated-branches -Wduplicated-cond -Wflex-array-member-not-at-end \
379bc421551SDag-Erling Smørgrav  -Wformat=2 -Wformat-overflow=2 -Wformat-signedness -Wformat-truncation \
38028f617deSDag-Erling Smørgrav  -Wfree-labels -Wimplicit-fallthrough=5 -Winit-self \
38128f617deSDag-Erling Smørgrav  -Wkeyword-macro -Wlogical-op \
382a979394aSDag-Erling Smørgrav  -Wmissing-declarations -Wmissing-prototypes \
383a979394aSDag-Erling Smørgrav  -Wmissing-variable-declarations -Wnested-externs \
384bc421551SDag-Erling Smørgrav  -Wnull-dereference \
385bc421551SDag-Erling Smørgrav  -Wold-style-definition -Woverlength-strings -Wpointer-arith \
38628f617deSDag-Erling Smørgrav  -Wshadow -Wshift-overflow=2 \
387bc421551SDag-Erling Smørgrav  -Wstrict-prototypes -Wstringop-overflow=4 \
388ff2c98b3SDag-Erling Smørgrav  -Wsuggest-attribute=cold \
389bc421551SDag-Erling Smørgrav  -Wsuggest-attribute=const -Wsuggest-attribute=format \
390bc421551SDag-Erling Smørgrav  -Wsuggest-attribute=malloc \
391bc421551SDag-Erling Smørgrav  -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure \
392a979394aSDag-Erling Smørgrav  -Wtrampolines -Wundef -Wunused-macros -Wuse-after-free=3 \
393bc421551SDag-Erling Smørgrav  -Wvariadic-macros -Wvla -Wwrite-strings \
394ff2c98b3SDag-Erling Smørgrav  -Wzero-as-null-pointer-constant \
395967a49a2SDag-Erling Smørgrav  -Wno-format-nonliteral -Wno-sign-compare -Wno-type-limits
396bc421551SDag-Erling Smørgrav#
397bc421551SDag-Erling Smørgrav# If your system has a "GMT offset" field in its "struct tm"s
398bc421551SDag-Erling Smørgrav# (or if you decide to add such a field in your system's "time.h" file),
399bc421551SDag-Erling Smørgrav# add the name to a define such as
400bc421551SDag-Erling Smørgrav#	-DTM_GMTOFF=tm_gmtoff
401bc421551SDag-Erling Smørgrav# to the end of the "CFLAGS=" line.  If not defined, the code attempts to
402bc421551SDag-Erling Smørgrav# guess TM_GMTOFF from other macros; define NO_TM_GMTOFF to suppress this.
403bc421551SDag-Erling Smørgrav# Similarly, if your system has a "zone abbreviation" field, define
404bc421551SDag-Erling Smørgrav#	-DTM_ZONE=tm_zone
40546c59934SDag-Erling Smørgrav# and define NO_TM_ZONE to suppress any guessing.
406a979394aSDag-Erling Smørgrav# Although POSIX.1-2024 requires these fields and they are widely available
407a979394aSDag-Erling Smørgrav# on GNU/Linux and BSD systems, some older systems lack them.
408bc421551SDag-Erling Smørgrav#
409bc421551SDag-Erling Smørgrav# The next batch of options control support for external variables
410bc421551SDag-Erling Smørgrav# exported by tzcode.  In practice these variables are less useful
411bc421551SDag-Erling Smørgrav# than TM_GMTOFF and TM_ZONE.  However, most of them are standardized.
412bc421551SDag-Erling Smørgrav# #
413bc421551SDag-Erling Smørgrav# # To omit or support the external variable "tzname", add one of:
414bc421551SDag-Erling Smørgrav# #	-DHAVE_TZNAME=0 # do not support "tzname"
415bc421551SDag-Erling Smørgrav# #	-DHAVE_TZNAME=1 # support "tzname", which is defined by system library
416bc421551SDag-Erling Smørgrav# #	-DHAVE_TZNAME=2 # support and define "tzname"
417a979394aSDag-Erling Smørgrav# # to the "CFLAGS=" line.  Although "tzname" is required by POSIX.1-1988
418a979394aSDag-Erling Smørgrav# # and later, its contents are unspecified if you use a geographical TZ
419a979394aSDag-Erling Smørgrav# # and the variable is planned to be removed in a future POSIX edition.
420bc421551SDag-Erling Smørgrav# # If not defined, the code attempts to guess HAVE_TZNAME from other macros.
421bc421551SDag-Erling Smørgrav# # Warning: unless time_tz is also defined, HAVE_TZNAME=1 can cause
422bc421551SDag-Erling Smørgrav# # crashes when combined with some platforms' standard libraries,
423bc421551SDag-Erling Smørgrav# # presumably due to memory allocation issues.
424bc421551SDag-Erling Smørgrav# #
425bc421551SDag-Erling Smørgrav# # To omit or support the external variables "timezone" and "daylight", add
426bc421551SDag-Erling Smørgrav# #	-DUSG_COMPAT=0 # do not support
427bc421551SDag-Erling Smørgrav# #	-DUSG_COMPAT=1 # support, and variables are defined by system library
428bc421551SDag-Erling Smørgrav# #	-DUSG_COMPAT=2 # support and define variables
42946c59934SDag-Erling Smørgrav# # to the "CFLAGS=" line; "timezone" and "daylight" are inspired by Unix
430a979394aSDag-Erling Smørgrav# # Systems Group code and are required by POSIX.1-2008 and later (with XSI),
431a979394aSDag-Erling Smørgrav# # although their contents are unspecified if you use a geographical TZ
432a979394aSDag-Erling Smørgrav# # and the variables are planned to be removed in a future edition of POSIX.
433bc421551SDag-Erling Smørgrav# # If not defined, the code attempts to guess USG_COMPAT from other macros.
434bc421551SDag-Erling Smørgrav# #
435bc421551SDag-Erling Smørgrav# # To support the external variable "altzone", add
436bc421551SDag-Erling Smørgrav# #	-DALTZONE=0 # do not support
437bc421551SDag-Erling Smørgrav# #	-DALTZONE=1 # support "altzone", which is defined by system library
438bc421551SDag-Erling Smørgrav# #	-DALTZONE=2 # support and define "altzone"
439bc421551SDag-Erling Smørgrav# # to the end of the "CFLAGS=" line; although "altzone" appeared in
440bc421551SDag-Erling Smørgrav# # System V Release 3.1 it has not been standardized.
441bc421551SDag-Erling Smørgrav# # If not defined, the code attempts to guess ALTZONE from other macros.
442bc421551SDag-Erling Smørgrav#
443bc421551SDag-Erling Smørgrav# If you want functions that were inspired by early versions of X3J11's work,
444bc421551SDag-Erling Smørgrav# add
445bc421551SDag-Erling Smørgrav#	-DSTD_INSPIRED
446bc421551SDag-Erling Smørgrav# to the end of the "CFLAGS=" line.  This arranges for the following
447bc421551SDag-Erling Smørgrav# functions to be added to the time conversion library.
448bc421551SDag-Erling Smørgrav# "offtime" is like "gmtime" except that it accepts a second (long) argument
449bc421551SDag-Erling Smørgrav# that gives an offset to add to the time_t when converting it.
450ff2c98b3SDag-Erling Smørgrav# "offtime_r" is to "offtime" what "gmtime_r" is to "gmtime".
451ff2c98b3SDag-Erling Smørgrav# I.e., "offtime" and "offtime_r" are like calling "localtime_rz"
452ff2c98b3SDag-Erling Smørgrav# with a fixed-offset zone.
45346c59934SDag-Erling Smørgrav# "timelocal" is nearly equivalent to "mktime".
454bc421551SDag-Erling Smørgrav# "timeoff" is like "timegm" except that it accepts a second (long) argument
455bc421551SDag-Erling Smørgrav# that gives an offset to use when converting to a time_t.
45646c59934SDag-Erling Smørgrav# I.e., "timeoff" is like calling "mktime_z" with a fixed-offset zone.
457bc421551SDag-Erling Smørgrav# "posix2time" and "time2posix" are described in an included manual page.
458bc421551SDag-Erling Smørgrav# X3J11's work does not describe any of these functions.
459bc421551SDag-Erling Smørgrav# These functions may well disappear in future releases of the time
460bc421551SDag-Erling Smørgrav# conversion package.
461bc421551SDag-Erling Smørgrav#
462bc421551SDag-Erling Smørgrav# If you don't want functions that were inspired by NetBSD, add
463bc421551SDag-Erling Smørgrav#	-DNETBSD_INSPIRED=0
464bc421551SDag-Erling Smørgrav# to the end of the "CFLAGS=" line.  Otherwise, the functions
465bc421551SDag-Erling Smørgrav# "localtime_rz", "mktime_z", "tzalloc", and "tzfree" are added to the
46675411d15SDag-Erling Smørgrav# time library, and if STD_INSPIRED is also defined to nonzero the functions
467bc421551SDag-Erling Smørgrav# "posix2time_z" and "time2posix_z" are added as well.
468bc421551SDag-Erling Smørgrav# The functions ending in "_z" (or "_rz") are like their unsuffixed
469bc421551SDag-Erling Smørgrav# (or suffixed-by-"_r") counterparts, except with an extra first
470bc421551SDag-Erling Smørgrav# argument of opaque type timezone_t that specifies the timezone.
471bc421551SDag-Erling Smørgrav# "tzalloc" allocates a timezone_t value, and "tzfree" frees it.
472bc421551SDag-Erling Smørgrav#
473bc421551SDag-Erling Smørgrav# If you want to allocate state structures in localtime, add
474bc421551SDag-Erling Smørgrav#	-DALL_STATE
475bc421551SDag-Erling Smørgrav# to the end of the "CFLAGS=" line.  Storage is obtained by calling malloc.
476bc421551SDag-Erling Smørgrav#
477bc421551SDag-Erling Smørgrav# NIST-PCTS:151-2, Version 1.4, (1993-12-03) is a test suite put
478bc421551SDag-Erling Smørgrav# out by the National Institute of Standards and Technology
47946c59934SDag-Erling Smørgrav# which claims to test C and POSIX conformance.  If you want to pass PCTS, add
480bc421551SDag-Erling Smørgrav#	-DPCTS
481bc421551SDag-Erling Smørgrav# to the end of the "CFLAGS=" line.
482bc421551SDag-Erling Smørgrav#
483bc421551SDag-Erling Smørgrav# If you want strict compliance with XPG4 as of 1994-04-09, add
484bc421551SDag-Erling Smørgrav#	-DXPG4_1994_04_09
485bc421551SDag-Erling Smørgrav# to the end of the "CFLAGS=" line.  This causes "strftime" to always return
486bc421551SDag-Erling Smørgrav# 53 as a week number (rather than 52 or 53) for January days before
487bc421551SDag-Erling Smørgrav# January's first Monday when a "%V" format is used and January 1
488bc421551SDag-Erling Smørgrav# falls on a Friday, Saturday, or Sunday.
48946c59934SDag-Erling Smørgrav#
49046c59934SDag-Erling Smørgrav# POSIX says CFLAGS defaults to "-O 1".
49146c59934SDag-Erling Smørgrav# Uncomment the following line and edit its contents as needed.
492bc421551SDag-Erling Smørgrav
49346c59934SDag-Erling Smørgrav#CFLAGS= -O 1
494bc421551SDag-Erling Smørgrav
495bc421551SDag-Erling Smørgrav
49646c59934SDag-Erling Smørgrav# The name of a POSIX-like library archiver, its flags, C compiler,
49746c59934SDag-Erling Smørgrav# linker flags, and 'make' utility.  Ordinarily the defaults suffice.
498a979394aSDag-Erling Smørgrav# The commented-out values are the defaults specified by POSIX.1-2024.
49946c59934SDag-Erling Smørgrav#AR = ar
50046c59934SDag-Erling Smørgrav#ARFLAGS = -rv
50146c59934SDag-Erling Smørgrav#CC = c17
50246c59934SDag-Erling Smørgrav#LDFLAGS =
50346c59934SDag-Erling Smørgrav#MAKE = make
504bc421551SDag-Erling Smørgrav
50546c59934SDag-Erling Smørgrav# Where to fetch leap-seconds.list from.
50646c59934SDag-Erling Smørgravleaplist_URI = \
50746c59934SDag-Erling Smørgrav  https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list
50846c59934SDag-Erling Smørgrav# The file is generated by the IERS Earth Orientation Centre, in Paris.
50946c59934SDag-Erling Smørgravleaplist_TZ = Europe/Paris
510ff2c98b3SDag-Erling Smørgrav#
511ff2c98b3SDag-Erling Smørgrav# To fetch leap-seconds.list from NIST via a less-secure protocol
512ff2c98b3SDag-Erling Smørgrav# and with less-volatile metadata, use these settings:
513ff2c98b3SDag-Erling Smørgrav#leaplist_URI = ftp://ftp.boulder.nist.gov/pub/time/leap-seconds.list
514ff2c98b3SDag-Erling Smørgrav#leaplist_TZ = America/Denver
51546c59934SDag-Erling Smørgrav
516bc421551SDag-Erling Smørgrav# The zic command and its arguments.
517bc421551SDag-Erling Smørgrav
518bc421551SDag-Erling Smørgravzic=		./zic
519bc421551SDag-Erling SmørgravZIC=		$(zic) $(ZFLAGS)
520bc421551SDag-Erling Smørgrav
521bc421551SDag-Erling Smørgrav# To shrink the size of installed TZif files,
522bc421551SDag-Erling Smørgrav# append "-r @N" to omit data before N-seconds-after-the-Epoch.
523bc421551SDag-Erling Smørgrav# To grow the files and work around bugs in older applications,
524bc421551SDag-Erling Smørgrav# possibly at the expense of introducing bugs in newer ones,
525bc421551SDag-Erling Smørgrav# append "-b fat"; see ZIC_BLOAT_DEFAULT above.
526bc421551SDag-Erling Smørgrav# See the zic man page for more about -b and -r.
527bc421551SDag-Erling SmørgravZFLAGS=
528bc421551SDag-Erling Smørgrav
529bc421551SDag-Erling Smørgrav# How to use zic to install TZif files.
530bc421551SDag-Erling Smørgrav
531a979394aSDag-Erling SmørgravZIC_INSTALL=	$(ZIC) -d '$(DESTDIR)$(TZDIR)'
532bc421551SDag-Erling Smørgrav
53346c59934SDag-Erling Smørgrav# The name of a POSIX-compliant 'awk' on your system.
534bc421551SDag-Erling Smørgrav# mawk 1.3.3 and Solaris 10 /usr/bin/awk do not work.
535bc421551SDag-Erling Smørgrav# Also, it is better (though not essential) if 'awk' supports UTF-8,
536bc421551SDag-Erling Smørgrav# and unfortunately mawk and busybox awk do not support UTF-8.
53728f617deSDag-Erling Smørgrav# Try AWK=gawk or AWK=nawk if your awk has the problems mentioned above.
538bc421551SDag-Erling SmørgravAWK=		awk
539bc421551SDag-Erling Smørgrav
54046c59934SDag-Erling Smørgrav# The full path name of a POSIX-compliant shell, preferably one that supports
541bc421551SDag-Erling Smørgrav# the Korn shell's 'select' statement as an extension.
542bc421551SDag-Erling Smørgrav# These days, Bash is the most popular.
543bc421551SDag-Erling Smørgrav# It should be OK to set this to /bin/sh, on platforms where /bin/sh
54446c59934SDag-Erling Smørgrav# lacks 'select' or doesn't completely conform to POSIX, but /bin/bash
545bc421551SDag-Erling Smørgrav# is typically nicer if it works.
546bc421551SDag-Erling SmørgravKSHELL=		/bin/bash
547bc421551SDag-Erling Smørgrav
54846c59934SDag-Erling Smørgrav# Name of curl <https://curl.haxx.se/>, used for HTML validation
54946c59934SDag-Erling Smørgrav# and to fetch leap-seconds.list from upstream.
550a979394aSDag-Erling Smørgrav# Set CURL=: to disable use of the Internet.
551bc421551SDag-Erling SmørgravCURL=		curl
552bc421551SDag-Erling Smørgrav
553bc421551SDag-Erling Smørgrav# Name of GNU Privacy Guard <https://gnupg.org/>, used to sign distributions.
554bc421551SDag-Erling SmørgravGPG=		gpg
555bc421551SDag-Erling Smørgrav
556bc421551SDag-Erling Smørgrav# This expensive test requires USE_LTZ.
557bc421551SDag-Erling Smørgrav# To suppress it, define this macro to be empty.
558bc421551SDag-Erling SmørgravCHECK_TIME_T_ALTERNATIVES = check_time_t_alternatives
559bc421551SDag-Erling Smørgrav
560bc421551SDag-Erling Smørgrav# SAFE_CHAR is a regular expression that matches a safe character.
561bc421551SDag-Erling Smørgrav# Some parts of this distribution are limited to safe characters;
562bc421551SDag-Erling Smørgrav# others can use any UTF-8 character.
563bc421551SDag-Erling Smørgrav# For now, the safe characters are a safe subset of ASCII.
564bc421551SDag-Erling Smørgrav# The caller must set the shell variable 'sharp' to the character '#',
565bc421551SDag-Erling Smørgrav# since Makefile macros cannot contain '#'.
566bc421551SDag-Erling Smørgrav# TAB_CHAR is a single tab character, in single quotes.
567bc421551SDag-Erling SmørgravTAB_CHAR=	'	'
568bc421551SDag-Erling SmørgravSAFE_CHARSET1=	$(TAB_CHAR)' !\"'$$sharp'$$%&'\''()*+,./0123456789:;<=>?@'
569bc421551SDag-Erling SmørgravSAFE_CHARSET2=	'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_`'
570bc421551SDag-Erling SmørgravSAFE_CHARSET3=	'abcdefghijklmnopqrstuvwxyz{|}~'
571bc421551SDag-Erling SmørgravSAFE_CHARSET=	$(SAFE_CHARSET1)$(SAFE_CHARSET2)$(SAFE_CHARSET3)
572bc421551SDag-Erling SmørgravSAFE_CHAR=	'[]'$(SAFE_CHARSET)'-]'
573bc421551SDag-Erling Smørgrav
574ff2c98b3SDag-Erling Smørgrav# These non-alphabetic, non-ASCII printable characters are
575ff2c98b3SDag-Erling Smørgrav# used in commentary or in generated *.txt files
576ff2c98b3SDag-Erling Smørgrav# and are not likely to cause confusion.
577*212e3524SDag-Erling SmørgravUNUSUAL_OK_CHARSET= §«°±»½¾¿×–‘’“”•→−≤★⟨⟩⯪
578bc421551SDag-Erling Smørgrav
579bc421551SDag-Erling Smørgrav# Put this in a bracket expression to match spaces.
580bc421551SDag-Erling Smørgravs = [:space:]
581bc421551SDag-Erling Smørgrav
582bc421551SDag-Erling Smørgrav# OK_CHAR matches any character allowed in the distributed files.
583bc421551SDag-Erling Smørgrav# This is the same as SAFE_CHAR, except that UNUSUAL_OK_CHARSET and
584bc421551SDag-Erling Smørgrav# multibyte letters are also allowed so that commentary can contain a
585bc421551SDag-Erling Smørgrav# few safe symbols and people's names and can quote non-English sources.
586bc421551SDag-Erling SmørgravOK_CHAR=	'[][:alpha:]$(UNUSUAL_OK_CHARSET)'$(SAFE_CHARSET)'-]'
587bc421551SDag-Erling Smørgrav
588bc421551SDag-Erling Smørgrav# SAFE_LINE matches a line of safe characters.
589bc421551SDag-Erling Smørgrav# SAFE_SHARP_LINE is similar, except any OK character can follow '#';
590bc421551SDag-Erling Smørgrav# this is so that comments can contain non-ASCII characters.
591bc421551SDag-Erling Smørgrav# OK_LINE matches a line of OK characters.
592bc421551SDag-Erling SmørgravSAFE_LINE=	'^'$(SAFE_CHAR)'*$$'
593bc421551SDag-Erling SmørgravSAFE_SHARP_LINE='^'$(SAFE_CHAR)'*('$$sharp$(OK_CHAR)'*)?$$'
594bc421551SDag-Erling SmørgravOK_LINE=	'^'$(OK_CHAR)'*$$'
595bc421551SDag-Erling Smørgrav
596bc421551SDag-Erling Smørgrav# Flags to give 'tar' when making a distribution.
597bc421551SDag-Erling Smørgrav# Try to use flags appropriate for GNU tar.
598a979394aSDag-Erling SmørgravGNUTARFLAGS= --format=pax --pax-option=delete=atime,delete=ctime \
599bc421551SDag-Erling Smørgrav  --numeric-owner --owner=0 --group=0 \
600bc421551SDag-Erling Smørgrav  --mode=go+u,go-w --sort=name
601a979394aSDag-Erling SmørgravSETUP_TAR= \
602a979394aSDag-Erling Smørgrav  export LC_ALL=C && \
603a979394aSDag-Erling Smørgrav  if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; then \
604a979394aSDag-Erling Smørgrav    TAR='tar $(GNUTARFLAGS)'; \
605a979394aSDag-Erling Smørgrav  else \
606a979394aSDag-Erling Smørgrav    TAR=tar; \
607a979394aSDag-Erling Smørgrav  fi
608bc421551SDag-Erling Smørgrav
609bc421551SDag-Erling Smørgrav# Flags to give 'gzip' when making a distribution.
610bc421551SDag-Erling SmørgravGZIPFLAGS=	-9n
611bc421551SDag-Erling Smørgrav
612bc421551SDag-Erling Smørgrav# When comparing .tzs files, use GNU diff's -F'^TZ=' option if supported.
613bc421551SDag-Erling Smørgrav# This makes it easier to see which Zone has been affected.
614a979394aSDag-Erling SmørgravSETUP_DIFF_TZS = \
615a979394aSDag-Erling Smørgrav  if diff -u -F'^TZ=' - - <>/dev/null >&0 2>&1; then \
616a979394aSDag-Erling Smørgrav    DIFF_TZS='diff -u -F^TZ='; \
617a979394aSDag-Erling Smørgrav  else \
618a979394aSDag-Erling Smørgrav    DIFF_TZS='diff -u'; \
619a979394aSDag-Erling Smørgrav  fi
620bc421551SDag-Erling Smørgrav
621bc421551SDag-Erling Smørgrav# ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
622bc421551SDag-Erling SmørgravRANLIB=		:
623bc421551SDag-Erling Smørgrav
62446c59934SDag-Erling Smørgrav# POSIX prohibits defining or using SHELL.  However, csh users on systems
62546c59934SDag-Erling Smørgrav# that use the user shell for Makefile commands may need to define SHELL.
62646c59934SDag-Erling Smørgrav#SHELL=		/bin/sh
62746c59934SDag-Erling Smørgrav
62846c59934SDag-Erling Smørgrav# End of macros that one plausibly might want to tailor.
62946c59934SDag-Erling Smørgrav###############################################################################
63046c59934SDag-Erling Smørgrav
63146c59934SDag-Erling Smørgrav
632bc421551SDag-Erling SmørgravTZCOBJS=	zic.o
633a979394aSDag-Erling SmørgravTZDOBJS=	zdump.o localtime.o strftime.o
634a979394aSDag-Erling SmørgravDATEOBJS=	date.o localtime.o strftime.o
635bc421551SDag-Erling SmørgravLIBSRCS=	localtime.c asctime.c difftime.c strftime.c
636bc421551SDag-Erling SmørgravLIBOBJS=	localtime.o asctime.o difftime.o strftime.o
637bc421551SDag-Erling SmørgravHEADERS=	tzfile.h private.h
638bc421551SDag-Erling SmørgravNONLIBSRCS=	zic.c zdump.c
639bc421551SDag-Erling SmørgravNEWUCBSRCS=	date.c
640bc421551SDag-Erling SmørgravSOURCES=	$(HEADERS) $(LIBSRCS) $(NONLIBSRCS) $(NEWUCBSRCS) \
641bc421551SDag-Erling Smørgrav			tzselect.ksh workman.sh
642bc421551SDag-Erling SmørgravMANS=		newctime.3 newstrftime.3 newtzset.3 time2posix.3 \
643bc421551SDag-Erling Smørgrav			tzfile.5 tzselect.8 zic.8 zdump.8
644bc421551SDag-Erling SmørgravMANTXTS=	newctime.3.txt newstrftime.3.txt newtzset.3.txt \
645bc421551SDag-Erling Smørgrav			time2posix.3.txt \
646bc421551SDag-Erling Smørgrav			tzfile.5.txt tzselect.8.txt zic.8.txt zdump.8.txt \
647bc421551SDag-Erling Smørgrav			date.1.txt
648bc421551SDag-Erling SmørgravCOMMON=		calendars CONTRIBUTING LICENSE Makefile \
649bc421551SDag-Erling Smørgrav			NEWS README SECURITY theory.html version
650bc421551SDag-Erling SmørgravWEB_PAGES=	tz-art.html tz-how-to.html tz-link.html
651a979394aSDag-Erling SmørgravCHECK_WEB_PAGES=theory.ck tz-art.ck tz-how-to.ck tz-link.ck
652bc421551SDag-Erling SmørgravDOCS=		$(MANS) date.1 $(MANTXTS) $(WEB_PAGES)
653bc421551SDag-Erling SmørgravPRIMARY_YDATA=	africa antarctica asia australasia \
654bc421551SDag-Erling Smørgrav		europe northamerica southamerica
655bc421551SDag-Erling SmørgravYDATA=		$(PRIMARY_YDATA) etcetera
656bc421551SDag-Erling SmørgravNDATA=		factory
657bc421551SDag-Erling SmørgravTDATA_TO_CHECK=	$(YDATA) $(NDATA) backward
658bc421551SDag-Erling SmørgravTDATA=		$(YDATA) $(NDATA) $(BACKWARD)
65946c59934SDag-Erling SmørgravZONETABLES=	zone.tab zone1970.tab zonenow.tab
660bc421551SDag-Erling SmørgravTABDATA=	iso3166.tab $(TZDATA_TEXT) $(ZONETABLES)
661bc421551SDag-Erling SmørgravLEAP_DEPS=	leapseconds.awk leap-seconds.list
662bc421551SDag-Erling SmørgravTZDATA_ZI_DEPS=	ziguard.awk zishrink.awk version $(TDATA) \
663bc421551SDag-Erling Smørgrav		  $(PACKRATDATA) $(PACKRATLIST)
664bc421551SDag-Erling SmørgravDSTDATA_ZI_DEPS= ziguard.awk $(TDATA) $(PACKRATDATA) $(PACKRATLIST)
665bc421551SDag-Erling SmørgravDATA=		$(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \
666bc421551SDag-Erling Smørgrav			leapseconds $(ZONETABLES)
66746c59934SDag-Erling SmørgravAWK_SCRIPTS=	checklinks.awk checknow.awk checktab.awk leapseconds.awk \
668bc421551SDag-Erling Smørgrav			ziguard.awk zishrink.awk
669bc421551SDag-Erling SmørgravMISC=		$(AWK_SCRIPTS)
670bc421551SDag-Erling SmørgravTZS_YEAR=	2050
671bc421551SDag-Erling SmørgravTZS_CUTOFF_FLAG=	-c $(TZS_YEAR)
672bc421551SDag-Erling SmørgravTZS=		to$(TZS_YEAR).tzs
673bc421551SDag-Erling SmørgravTZS_NEW=	to$(TZS_YEAR)new.tzs
674967a49a2SDag-Erling SmørgravTZS_DEPS=	$(YDATA) localtime.c private.h \
675967a49a2SDag-Erling Smørgrav			strftime.c tzfile.h zdump.c zic.c
676bc421551SDag-Erling SmørgravTZDATA_DIST = $(COMMON) $(DATA) $(MISC)
677bc421551SDag-Erling Smørgrav# EIGHT_YARDS is just a yard short of the whole ENCHILADA.
678bc421551SDag-Erling SmørgravEIGHT_YARDS = $(TZDATA_DIST) $(DOCS) $(SOURCES) tzdata.zi
679bc421551SDag-Erling SmørgravENCHILADA = $(EIGHT_YARDS) $(TZS)
680bc421551SDag-Erling Smørgrav
681bc421551SDag-Erling Smørgrav# Consult these files when deciding whether to rebuild the 'version' file.
682bc421551SDag-Erling Smørgrav# This list is not the same as the output of 'git ls-files', since
683bc421551SDag-Erling Smørgrav# .gitignore is not distributed.
684bc421551SDag-Erling SmørgravVERSION_DEPS= \
685bc421551SDag-Erling Smørgrav		calendars CONTRIBUTING LICENSE Makefile NEWS README SECURITY \
686bc421551SDag-Erling Smørgrav		africa antarctica asctime.c asia australasia \
687bc421551SDag-Erling Smørgrav		backward backzone \
68846c59934SDag-Erling Smørgrav		checklinks.awk checknow.awk checktab.awk \
689bc421551SDag-Erling Smørgrav		date.1 date.c difftime.c \
690bc421551SDag-Erling Smørgrav		etcetera europe factory iso3166.tab \
691bc421551SDag-Erling Smørgrav		leap-seconds.list leapseconds.awk localtime.c \
692bc421551SDag-Erling Smørgrav		newctime.3 newstrftime.3 newtzset.3 northamerica \
693bc421551SDag-Erling Smørgrav		private.h southamerica strftime.c theory.html \
694bc421551SDag-Erling Smørgrav		time2posix.3 tz-art.html tz-how-to.html tz-link.html \
695bc421551SDag-Erling Smørgrav		tzfile.5 tzfile.h tzselect.8 tzselect.ksh \
696bc421551SDag-Erling Smørgrav		workman.sh zdump.8 zdump.c zic.8 zic.c \
697bc421551SDag-Erling Smørgrav		ziguard.awk zishrink.awk \
69846c59934SDag-Erling Smørgrav		zone.tab zone1970.tab zonenow.tab
699bc421551SDag-Erling Smørgrav
700bc421551SDag-Erling Smørgravall:		tzselect zic zdump libtz.a $(TABDATA) \
701bc421551SDag-Erling Smørgrav		  vanguard.zi main.zi rearguard.zi
702bc421551SDag-Erling Smørgrav
703bc421551SDag-Erling SmørgravALL:		all date $(ENCHILADA)
704bc421551SDag-Erling Smørgrav
705bc421551SDag-Erling Smørgravinstall:	all $(DATA) $(REDO) $(MANS)
706bc421551SDag-Erling Smørgrav		mkdir -p '$(DESTDIR)$(BINDIR)' \
707bc421551SDag-Erling Smørgrav			'$(DESTDIR)$(ZDUMPDIR)' '$(DESTDIR)$(ZICDIR)' \
708bc421551SDag-Erling Smørgrav			'$(DESTDIR)$(LIBDIR)' \
709bc421551SDag-Erling Smørgrav			'$(DESTDIR)$(MANDIR)/man3' '$(DESTDIR)$(MANDIR)/man5' \
710bc421551SDag-Erling Smørgrav			'$(DESTDIR)$(MANDIR)/man8'
711bc421551SDag-Erling Smørgrav		$(ZIC_INSTALL) -l $(LOCALTIME) \
712bc421551SDag-Erling Smørgrav			-t '$(DESTDIR)$(TZDEFAULT)'
713bc421551SDag-Erling Smørgrav		cp -f $(TABDATA) '$(DESTDIR)$(TZDIR)/.'
714bc421551SDag-Erling Smørgrav		cp tzselect '$(DESTDIR)$(BINDIR)/.'
715bc421551SDag-Erling Smørgrav		cp zdump '$(DESTDIR)$(ZDUMPDIR)/.'
716bc421551SDag-Erling Smørgrav		cp zic '$(DESTDIR)$(ZICDIR)/.'
717bc421551SDag-Erling Smørgrav		cp libtz.a '$(DESTDIR)$(LIBDIR)/.'
718bc421551SDag-Erling Smørgrav		$(RANLIB) '$(DESTDIR)$(LIBDIR)/libtz.a'
719bc421551SDag-Erling Smørgrav		cp -f newctime.3 newtzset.3 '$(DESTDIR)$(MANDIR)/man3/.'
720bc421551SDag-Erling Smørgrav		cp -f tzfile.5 '$(DESTDIR)$(MANDIR)/man5/.'
721bc421551SDag-Erling Smørgrav		cp -f tzselect.8 zdump.8 zic.8 '$(DESTDIR)$(MANDIR)/man8/.'
722bc421551SDag-Erling Smørgrav
723bc421551SDag-Erling SmørgravINSTALL:	ALL install date.1
724bc421551SDag-Erling Smørgrav		mkdir -p '$(DESTDIR)$(BINDIR)' '$(DESTDIR)$(MANDIR)/man1'
725bc421551SDag-Erling Smørgrav		cp date '$(DESTDIR)$(BINDIR)/.'
726bc421551SDag-Erling Smørgrav		cp -f date.1 '$(DESTDIR)$(MANDIR)/man1/.'
727bc421551SDag-Erling Smørgrav
728bc421551SDag-Erling Smørgrav# Calculate version number from git, if available.
729bc421551SDag-Erling Smørgrav# Otherwise, use $(VERSION) unless it is "unknown" and there is already
730bc421551SDag-Erling Smørgrav# a 'version' file, in which case reuse the existing 'version' contents
731bc421551SDag-Erling Smørgrav# and append "-dirty" if the contents do not already end in "-dirty".
732bc421551SDag-Erling Smørgravversion:	$(VERSION_DEPS)
733bc421551SDag-Erling Smørgrav		{ (type git) >/dev/null 2>&1 && \
734a979394aSDag-Erling Smørgrav		  V=$$(git describe --match '[0-9][0-9][0-9][0-9][a-z]*' \
735a979394aSDag-Erling Smørgrav				--abbrev=7 --dirty) || \
736a979394aSDag-Erling Smørgrav		  if test '$(VERSION)' = unknown && read -r V <$@; then \
737a979394aSDag-Erling Smørgrav		    V=$${V%-dirty}-dirty; \
738bc421551SDag-Erling Smørgrav		  else \
739bc421551SDag-Erling Smørgrav		    V='$(VERSION)'; \
740bc421551SDag-Erling Smørgrav		  fi; } && \
741bc421551SDag-Erling Smørgrav		printf '%s\n' "$$V" >$@.out
742bc421551SDag-Erling Smørgrav		mv $@.out $@
743bc421551SDag-Erling Smørgrav
744bc421551SDag-Erling Smørgrav# These files can be tailored by setting BACKWARD, PACKRATDATA, PACKRATLIST.
745bc421551SDag-Erling Smørgravvanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS)
746bc421551SDag-Erling Smørgrav		$(AWK) \
747a979394aSDag-Erling Smørgrav		  -v DATAFORM=$(@:.zi=) \
748bc421551SDag-Erling Smørgrav		  -v PACKRATDATA='$(PACKRATDATA)' \
749bc421551SDag-Erling Smørgrav		  -v PACKRATLIST='$(PACKRATLIST)' \
750bc421551SDag-Erling Smørgrav		  -f ziguard.awk \
751bc421551SDag-Erling Smørgrav		  $(TDATA) $(PACKRATDATA) >$@.out
752bc421551SDag-Erling Smørgrav		mv $@.out $@
753bc421551SDag-Erling Smørgrav# This file has a version comment that attempts to capture any tailoring
754bc421551SDag-Erling Smørgrav# via BACKWARD, DATAFORM, PACKRATDATA, PACKRATLIST, and REDO.
755bc421551SDag-Erling Smørgravtzdata.zi:	$(DATAFORM).zi version zishrink.awk
756a979394aSDag-Erling Smørgrav		read -r version <version && \
757bc421551SDag-Erling Smørgrav		  LC_ALL=C $(AWK) \
758bc421551SDag-Erling Smørgrav		    -v dataform='$(DATAFORM)' \
759bc421551SDag-Erling Smørgrav		    -v deps='$(DSTDATA_ZI_DEPS) zishrink.awk' \
760bc421551SDag-Erling Smørgrav		    -v redo='$(REDO)' \
761bc421551SDag-Erling Smørgrav		    -v version="$$version" \
762bc421551SDag-Erling Smørgrav		    -f zishrink.awk \
763bc421551SDag-Erling Smørgrav		    $(DATAFORM).zi >$@.out
764bc421551SDag-Erling Smørgrav		mv $@.out $@
765bc421551SDag-Erling Smørgrav
76646c59934SDag-Erling Smørgravtzdir.h:
76746c59934SDag-Erling Smørgrav		printf '%s\n' >$@.out \
76846c59934SDag-Erling Smørgrav		  '#ifndef TZDEFAULT' \
76946c59934SDag-Erling Smørgrav		  '# define TZDEFAULT "$(TZDEFAULT)" /* default zone */' \
77046c59934SDag-Erling Smørgrav		  '#endif' \
77146c59934SDag-Erling Smørgrav		  '#ifndef TZDIR' \
77246c59934SDag-Erling Smørgrav		  '# define TZDIR "$(TZDIR)" /* TZif directory */' \
77346c59934SDag-Erling Smørgrav		  '#endif'
77446c59934SDag-Erling Smørgrav		mv $@.out $@
77546c59934SDag-Erling Smørgrav
776bc421551SDag-Erling Smørgravversion.h:	version
777a979394aSDag-Erling Smørgrav		read -r VERSION <version && printf '%s\n' \
778bc421551SDag-Erling Smørgrav		  'static char const PKGVERSION[]="($(PACKAGE)) ";' \
779bc421551SDag-Erling Smørgrav		  "static char const TZVERSION[]=\"$$VERSION\";" \
780bc421551SDag-Erling Smørgrav		  'static char const REPORT_BUGS_TO[]="$(BUGEMAIL)";' \
781bc421551SDag-Erling Smørgrav		  >$@.out
782bc421551SDag-Erling Smørgrav		mv $@.out $@
783bc421551SDag-Erling Smørgrav
784bc421551SDag-Erling Smørgravzdump:		$(TZDOBJS)
785bc421551SDag-Erling Smørgrav		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZDOBJS) $(LDLIBS)
786bc421551SDag-Erling Smørgrav
787bc421551SDag-Erling Smørgravzic:		$(TZCOBJS)
788bc421551SDag-Erling Smørgrav		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS)
789bc421551SDag-Erling Smørgrav
790bc421551SDag-Erling Smørgravleapseconds:	$(LEAP_DEPS)
791bc421551SDag-Erling Smørgrav		$(AWK) -v EXPIRES_LINE=$(EXPIRES_LINE) \
792bc421551SDag-Erling Smørgrav		  -f leapseconds.awk leap-seconds.list >$@.out
793bc421551SDag-Erling Smørgrav		mv $@.out $@
794bc421551SDag-Erling Smørgrav
79546c59934SDag-Erling Smørgrav# Awk script to extract a Git-style author from leap-seconds.list comments.
79646c59934SDag-Erling SmørgravEXTRACT_AUTHOR = \
79746c59934SDag-Erling Smørgrav  author_line { sub(/^.[[:space:]]*/, ""); \
79846c59934SDag-Erling Smørgrav      sub(/:[[:space:]]*/, " <"); \
79946c59934SDag-Erling Smørgrav      printf "%s>\n", $$0; \
80046c59934SDag-Erling Smørgrav      success = 1; \
80146c59934SDag-Erling Smørgrav      exit \
80246c59934SDag-Erling Smørgrav  } \
80346c59934SDag-Erling Smørgrav  /Questions or comments to:/ { author_line = 1 } \
80446c59934SDag-Erling Smørgrav  END { exit !success }
80546c59934SDag-Erling Smørgrav
80646c59934SDag-Erling Smørgrav# Fetch leap-seconds.list from upstream.
80746c59934SDag-Erling Smørgravfetch-leap-seconds.list:
80846c59934SDag-Erling Smørgrav		$(CURL) -OR $(leaplist_URI)
80946c59934SDag-Erling Smørgrav
81046c59934SDag-Erling Smørgrav# Fetch leap-seconds.list from upstream and commit it to the local repository.
81146c59934SDag-Erling Smørgravcommit-leap-seconds.list: fetch-leap-seconds.list
81246c59934SDag-Erling Smørgrav		author=$$($(AWK) '$(EXTRACT_AUTHOR)' leap-seconds.list) && \
81346c59934SDag-Erling Smørgrav		date=$$(TZ=$(leaplist_TZ) stat -c%y leap-seconds.list) && \
81446c59934SDag-Erling Smørgrav		git commit --author="$$author" --date="$$date" -m'make $@' \
81546c59934SDag-Erling Smørgrav		  leap-seconds.list
81646c59934SDag-Erling Smørgrav
817a979394aSDag-Erling Smørgrav# Arguments to pass to submakes.
818bc421551SDag-Erling Smørgrav# They can be overridden by later submake arguments.
819bc421551SDag-Erling SmørgravINSTALLARGS = \
820bc421551SDag-Erling Smørgrav BACKWARD='$(BACKWARD)' \
821bc421551SDag-Erling Smørgrav DESTDIR='$(DESTDIR)' \
822bc421551SDag-Erling Smørgrav PACKRATDATA='$(PACKRATDATA)' \
823bc421551SDag-Erling Smørgrav PACKRATLIST='$(PACKRATLIST)' \
824bc421551SDag-Erling Smørgrav TZDEFAULT='$(TZDEFAULT)' \
825bc421551SDag-Erling Smørgrav TZDIR='$(TZDIR)' \
826bc421551SDag-Erling Smørgrav ZIC='$(ZIC)'
827bc421551SDag-Erling Smørgrav
828bc421551SDag-Erling SmørgravINSTALL_DATA_DEPS = zic leapseconds tzdata.zi
829bc421551SDag-Erling Smørgrav
830a979394aSDag-Erling Smørgravposix_only: $(INSTALL_DATA_DEPS)
831bc421551SDag-Erling Smørgrav		$(ZIC_INSTALL) tzdata.zi
832bc421551SDag-Erling Smørgrav
833bc421551SDag-Erling Smørgravright_only: $(INSTALL_DATA_DEPS)
834a979394aSDag-Erling Smørgrav		$(ZIC_INSTALL) -L leapseconds tzdata.zi
835bc421551SDag-Erling Smørgrav
836bc421551SDag-Erling Smørgrav# In earlier versions of this makefile, the other two directories were
837bc421551SDag-Erling Smørgrav# subdirectories of $(TZDIR).  However, this led to configuration errors.
838bc421551SDag-Erling Smørgrav# For example, with posix_right under the earlier scheme,
839bc421551SDag-Erling Smørgrav# TZ='right/Australia/Adelaide' got you localtime with leap seconds,
840bc421551SDag-Erling Smørgrav# but gmtime without leap seconds, which led to problems with applications
841bc421551SDag-Erling Smørgrav# like sendmail that subtract gmtime from localtime.
842bc421551SDag-Erling Smørgrav# Therefore, the other two directories are now siblings of $(TZDIR).
843bc421551SDag-Erling Smørgrav# You must replace all of $(TZDIR) to switch from not using leap seconds
844bc421551SDag-Erling Smørgrav# to using them, or vice versa.
845bc421551SDag-Erling Smørgravright_posix:	right_only
846bc421551SDag-Erling Smørgrav		rm -fr '$(DESTDIR)$(TZDIR)-leaps'
847bc421551SDag-Erling Smørgrav		ln -s '$(TZDIR_BASENAME)' '$(DESTDIR)$(TZDIR)-leaps' || \
848bc421551SDag-Erling Smørgrav		  $(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-leaps' right_only
849bc421551SDag-Erling Smørgrav		$(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-posix' posix_only
850bc421551SDag-Erling Smørgrav
851bc421551SDag-Erling Smørgravposix_right:	posix_only
852bc421551SDag-Erling Smørgrav		rm -fr '$(DESTDIR)$(TZDIR)-posix'
853bc421551SDag-Erling Smørgrav		ln -s '$(TZDIR_BASENAME)' '$(DESTDIR)$(TZDIR)-posix' || \
854bc421551SDag-Erling Smørgrav		  $(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-posix' posix_only
855bc421551SDag-Erling Smørgrav		$(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-leaps' right_only
856bc421551SDag-Erling Smørgrav
857bc421551SDag-Erling Smørgravzones:		$(REDO)
858bc421551SDag-Erling Smørgrav
859bc421551SDag-Erling Smørgrav# dummy.zd is not a real file; it is mentioned here only so that the
860bc421551SDag-Erling Smørgrav# top-level 'make' does not have a syntax error.
861bc421551SDag-Erling SmørgravZDS = dummy.zd
862bc421551SDag-Erling Smørgrav# Rule used only by submakes invoked by the $(TZS_NEW) rule.
863bc421551SDag-Erling Smørgrav# It is separate so that GNU 'make -j' can run instances in parallel.
864bc421551SDag-Erling Smørgrav$(ZDS): zdump
865a979394aSDag-Erling Smørgrav		./zdump -i $(TZS_CUTOFF_FLAG) "$$PWD/$(@:.zd=)" >$@
866bc421551SDag-Erling Smørgrav
867bc421551SDag-Erling SmørgravTZS_NEW_DEPS = tzdata.zi zdump zic
868bc421551SDag-Erling Smørgrav$(TZS_NEW): $(TZS_NEW_DEPS)
869bc421551SDag-Erling Smørgrav		rm -fr tzs$(TZS_YEAR).dir
870bc421551SDag-Erling Smørgrav		mkdir tzs$(TZS_YEAR).dir
871bc421551SDag-Erling Smørgrav		$(zic) -d tzs$(TZS_YEAR).dir tzdata.zi
872bc421551SDag-Erling Smørgrav		$(AWK) '/^L/{print "Link\t" $$2 "\t" $$3}' \
873bc421551SDag-Erling Smørgrav		   tzdata.zi | LC_ALL=C sort >$@.out
874a979394aSDag-Erling Smørgrav		x=$$($(AWK) '/^Z/{print "tzs$(TZS_YEAR).dir/" $$2 ".zd"}' \
875bc421551SDag-Erling Smørgrav				tzdata.zi \
876a979394aSDag-Erling Smørgrav		     | LC_ALL=C sort -t . -k 2,2) && \
877bc421551SDag-Erling Smørgrav		set x $$x && \
878bc421551SDag-Erling Smørgrav		shift && \
879bc421551SDag-Erling Smørgrav		ZDS=$$* && \
880a979394aSDag-Erling Smørgrav		$(MAKE) TZS_CUTOFF_FLAG="$(TZS_CUTOFF_FLAG)" \
881bc421551SDag-Erling Smørgrav		  ZDS="$$ZDS" $$ZDS && \
882bc421551SDag-Erling Smørgrav		sed 's,^TZ=".*\.dir/,TZ=",' $$ZDS >>$@.out
883bc421551SDag-Erling Smørgrav		rm -fr tzs$(TZS_YEAR).dir
884bc421551SDag-Erling Smørgrav		mv $@.out $@
885bc421551SDag-Erling Smørgrav
886a979394aSDag-Erling Smørgrav# If $(TZS) exists but 'make tzs.ck' fails, a maintainer should inspect the
887bc421551SDag-Erling Smørgrav# failed output and fix the inconsistency, perhaps by running 'make force_tzs'.
888bc421551SDag-Erling Smørgrav$(TZS):
889bc421551SDag-Erling Smørgrav		touch $@
890bc421551SDag-Erling Smørgrav
891bc421551SDag-Erling Smørgravforce_tzs:	$(TZS_NEW)
892bc421551SDag-Erling Smørgrav		cp $(TZS_NEW) $(TZS)
893bc421551SDag-Erling Smørgrav
894bc421551SDag-Erling Smørgravlibtz.a:	$(LIBOBJS)
895bc421551SDag-Erling Smørgrav		rm -f $@
89646c59934SDag-Erling Smørgrav		$(AR) $(ARFLAGS) $@ $(LIBOBJS)
897bc421551SDag-Erling Smørgrav		$(RANLIB) $@
898bc421551SDag-Erling Smørgrav
899bc421551SDag-Erling Smørgravdate:		$(DATEOBJS)
900bc421551SDag-Erling Smørgrav		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
901bc421551SDag-Erling Smørgrav
902bc421551SDag-Erling Smørgravtzselect:	tzselect.ksh version
903a979394aSDag-Erling Smørgrav		read -r VERSION <version && sed \
90446c59934SDag-Erling Smørgrav		  -e "s'#!/bin/bash'#!"'$(KSHELL)'\' \
90546c59934SDag-Erling Smørgrav		  -e s\''\(AWK\)=[^}]*'\''\1=\'\''$(AWK)\'\'\' \
90646c59934SDag-Erling Smørgrav		  -e s\''\(PKGVERSION\)=.*'\''\1=\'\''($(PACKAGE)) \'\'\' \
90746c59934SDag-Erling Smørgrav		  -e s\''\(REPORT_BUGS_TO\)=.*'\''\1=\'\''$(BUGEMAIL)\'\'\' \
90846c59934SDag-Erling Smørgrav		  -e s\''\(TZDIR\)=[^}]*'\''\1=\'\''$(TZDIR)\'\'\' \
90946c59934SDag-Erling Smørgrav		  -e s\''\(TZVERSION\)=.*'\''\1=\'"'$$VERSION\\''" \
910bc421551SDag-Erling Smørgrav		  <$@.ksh >$@.out
911bc421551SDag-Erling Smørgrav		chmod +x $@.out
912bc421551SDag-Erling Smørgrav		mv $@.out $@
913bc421551SDag-Erling Smørgrav
914967a49a2SDag-Erling Smørgravcheck: check_mild back.ck now.ck
915a979394aSDag-Erling Smørgravcheck_mild: check_web check_zishrink \
916a979394aSDag-Erling Smørgrav  character-set.ck white-space.ck links.ck mainguard.ck \
91728f617deSDag-Erling Smørgrav  name-lengths.ck news.ck slashed-abbrs.ck sorted.ck \
918a979394aSDag-Erling Smørgrav  tables.ck ziguard.ck tzs.ck
919bc421551SDag-Erling Smørgrav
92046c59934SDag-Erling Smørgrav# True if UTF8_LOCALE does not work;
92146c59934SDag-Erling Smørgrav# otherwise, false but with LC_ALL set to $(UTF8_LOCALE).
92246c59934SDag-Erling SmørgravUTF8_LOCALE_MISSING = \
92346c59934SDag-Erling Smørgrav  { test ! '$(UTF8_LOCALE)' \
92446c59934SDag-Erling Smørgrav    || ! printf 'A\304\200B\n' \
925*212e3524SDag-Erling Smørgrav         | LC_ALL='$(UTF8_LOCALE)' grep -q '^A[[:alpha:]]B$$' >/dev/null 2>&1 \
926a979394aSDag-Erling Smørgrav    || { export LC_ALL='$(UTF8_LOCALE)'; false; }; }
92746c59934SDag-Erling Smørgrav
928a979394aSDag-Erling Smørgravcharacter-set.ck: $(ENCHILADA)
92946c59934SDag-Erling Smørgrav	$(UTF8_LOCALE_MISSING) || { \
930bc421551SDag-Erling Smørgrav		sharp='#' && \
931ff2c98b3SDag-Erling Smørgrav		! grep -Env $(SAFE_LINE) $(MANS) date.1 \
932ff2c98b3SDag-Erling Smørgrav			$(MISC) $(SOURCES) \
933ff2c98b3SDag-Erling Smørgrav			LICENSE \
934bc421551SDag-Erling Smørgrav			version tzdata.zi && \
935bc421551SDag-Erling Smørgrav		! grep -Env $(SAFE_LINE)'|^UNUSUAL_OK_'$(OK_CHAR)'*$$' \
936bc421551SDag-Erling Smørgrav			Makefile && \
937bc421551SDag-Erling Smørgrav		! grep -Env $(SAFE_SHARP_LINE) $(TDATA_TO_CHECK) backzone \
938bc421551SDag-Erling Smørgrav			leapseconds zone.tab && \
939bc421551SDag-Erling Smørgrav		! grep -Env $(OK_LINE) $(ENCHILADA); \
940bc421551SDag-Erling Smørgrav	}
941bc421551SDag-Erling Smørgrav	touch $@
942bc421551SDag-Erling Smørgrav
943a979394aSDag-Erling Smørgravwhite-space.ck: $(ENCHILADA)
94446c59934SDag-Erling Smørgrav	$(UTF8_LOCALE_MISSING) || { \
945a979394aSDag-Erling Smørgrav		patfmt=' \t|[\f\r\v]' && pat=$$(printf "$$patfmt\\n") && \
94646c59934SDag-Erling Smørgrav		! grep -En "$$pat|[$s]\$$" \
947ff2c98b3SDag-Erling Smørgrav		    $(ENCHILADA:leap-seconds.list=); \
94846c59934SDag-Erling Smørgrav	}
949bc421551SDag-Erling Smørgrav	touch $@
950bc421551SDag-Erling Smørgrav
951bc421551SDag-Erling SmørgravPRECEDES_FILE_NAME = ^(Zone|Link[$s]+[^$s]+)[$s]+
952bc421551SDag-Erling SmørgravFILE_NAME_COMPONENT_TOO_LONG = $(PRECEDES_FILE_NAME)[^$s]*[^/$s]{15}
953bc421551SDag-Erling Smørgrav
954a979394aSDag-Erling Smørgravname-lengths.ck: $(TDATA_TO_CHECK) backzone
955a979394aSDag-Erling Smørgrav		:;! grep -En '$(FILE_NAME_COMPONENT_TOO_LONG)' \
956bc421551SDag-Erling Smørgrav			$(TDATA_TO_CHECK) backzone
957bc421551SDag-Erling Smørgrav		touch $@
958bc421551SDag-Erling Smørgrav
959a979394aSDag-Erling Smørgravmainguard.ck: main.zi
960a979394aSDag-Erling Smørgrav		test '$(PACKRATLIST)' || \
961a979394aSDag-Erling Smørgrav		  cat $(TDATA) $(PACKRATDATA) | diff -u - main.zi
962a979394aSDag-Erling Smørgrav		touch $@
963a979394aSDag-Erling Smørgrav
964bc421551SDag-Erling SmørgravPRECEDES_STDOFF = ^(Zone[$s]+[^$s]+)?[$s]+
965bc421551SDag-Erling SmørgravSTDOFF = [-+]?[0-9:.]+
966bc421551SDag-Erling SmørgravRULELESS_SAVE = (-|$(STDOFF)[sd]?)
967bc421551SDag-Erling SmørgravRULELESS_SLASHED_ABBRS = \
968bc421551SDag-Erling Smørgrav  $(PRECEDES_STDOFF)$(STDOFF)[$s]+$(RULELESS_SAVE)[$s]+[^$s]*/
969bc421551SDag-Erling Smørgrav
970a979394aSDag-Erling Smørgravslashed-abbrs.ck: $(TDATA_TO_CHECK)
971a979394aSDag-Erling Smørgrav		:;! grep -En '$(RULELESS_SLASHED_ABBRS)' $(TDATA_TO_CHECK)
972bc421551SDag-Erling Smørgrav		touch $@
973bc421551SDag-Erling Smørgrav
974bc421551SDag-Erling SmørgravCHECK_CC_LIST = { n = split($$1,a,/,/); for (i=2; i<=n; i++) print a[1], a[i]; }
975bc421551SDag-Erling Smørgrav
976a979394aSDag-Erling Smørgravsorted.ck: backward backzone
977bc421551SDag-Erling Smørgrav		$(AWK) '/^Link/ {printf "%.5d %s\n", g, $$3} !/./ {g++}' \
978bc421551SDag-Erling Smørgrav		  backward | LC_ALL=C sort -cu
979a979394aSDag-Erling Smørgrav		$(AWK) '/^Zone.*\// {print $$2}' backzone | LC_ALL=C sort -cu
980bc421551SDag-Erling Smørgrav		touch $@
981bc421551SDag-Erling Smørgrav
982a979394aSDag-Erling Smørgravback.ck: checklinks.awk $(TDATA_TO_CHECK)
983bc421551SDag-Erling Smørgrav		$(AWK) \
984bc421551SDag-Erling Smørgrav		  -v DATAFORM=$(DATAFORM) \
985bc421551SDag-Erling Smørgrav		  -v backcheck=backward \
986bc421551SDag-Erling Smørgrav		  -f checklinks.awk $(TDATA_TO_CHECK)
987bc421551SDag-Erling Smørgrav		touch $@
988bc421551SDag-Erling Smørgrav
989a979394aSDag-Erling Smørgravlinks.ck: checklinks.awk tzdata.zi
990bc421551SDag-Erling Smørgrav		$(AWK) \
991bc421551SDag-Erling Smørgrav		  -v DATAFORM=$(DATAFORM) \
992bc421551SDag-Erling Smørgrav		  -f checklinks.awk tzdata.zi
993bc421551SDag-Erling Smørgrav		touch $@
994bc421551SDag-Erling Smørgrav
99546c59934SDag-Erling Smørgrav# Check timestamps from now through 28 years from now, to make sure
99646c59934SDag-Erling Smørgrav# that zonenow.tab contains all sequences of planned timestamps,
99746c59934SDag-Erling Smørgrav# without any duplicate sequences.  In theory this might require
998a979394aSDag-Erling Smørgrav# 2800+ years but that would take a long time to check.
999a979394aSDag-Erling SmørgravCHECK_NOW_TIMESTAMP = $$(./date +%s)
100046c59934SDag-Erling SmørgravCHECK_NOW_FUTURE_YEARS = 28
1001a979394aSDag-Erling SmørgravCHECK_NOW_FUTURE_SECS = $(CHECK_NOW_FUTURE_YEARS) * 366 * 24 * 60 * 60
1002a979394aSDag-Erling Smørgravnow.ck: checknow.awk date tzdata.zi zdump zic zone1970.tab zonenow.tab
1003a979394aSDag-Erling Smørgrav		rm -fr $@d
1004a979394aSDag-Erling Smørgrav		mkdir $@d
1005a979394aSDag-Erling Smørgrav		./zic -d $@d tzdata.zi
100646c59934SDag-Erling Smørgrav		now=$(CHECK_NOW_TIMESTAMP) && \
1007a979394aSDag-Erling Smørgrav		  future=$$(($(CHECK_NOW_FUTURE_SECS) + $$now)) && \
100846c59934SDag-Erling Smørgrav		  ./zdump -i -t $$now,$$future \
1009*212e3524SDag-Erling Smørgrav		     $$(find "$$PWD/$@d"/????*/ -type f -o -type l) \
1010a979394aSDag-Erling Smørgrav		     >$@d/zdump-now.tab && \
1011a979394aSDag-Erling Smørgrav		  ./zdump -i -t 0,$$future \
1012a979394aSDag-Erling Smørgrav		     $$(find "$$PWD/$@d" -name Etc -prune \
1013*212e3524SDag-Erling Smørgrav			  -o \( -type f -o -type l \) ! -name '*.tab' -print) \
1014ff2c98b3SDag-Erling Smørgrav		     >$@d/zdump-1970.tab && \
101546c59934SDag-Erling Smørgrav		$(AWK) \
1016ff2c98b3SDag-Erling Smørgrav		  -v now=$$now \
1017ff2c98b3SDag-Erling Smørgrav		  -v now_out=$@.out \
1018a979394aSDag-Erling Smørgrav		  -v zdump_table=$@d/zdump-now.tab \
101946c59934SDag-Erling Smørgrav		  -f checknow.awk zonenow.tab
1020a979394aSDag-Erling Smørgrav		$(AWK) \
1021*212e3524SDag-Erling Smørgrav		  'BEGIN { \
1022*212e3524SDag-Erling Smørgrav		     SysVzone["EST5EDT"] = 1; SysVzone["CST6CDT"] = 1; \
1023*212e3524SDag-Erling Smørgrav		     SysVzone["MST7MDT"] = 1; SysVzone["PST8PDT"] = 1; \
1024*212e3524SDag-Erling Smørgrav		     print "-\t-\tUTC" \
1025*212e3524SDag-Erling Smørgrav		   } \
1026*212e3524SDag-Erling Smørgrav		   $$1 == "Zone" && !SysVzone[$$2] {print "-\t-\t" $$2}' \
1027a979394aSDag-Erling Smørgrav		  $(PRIMARY_YDATA) backward factory | \
1028a979394aSDag-Erling Smørgrav		 $(AWK) \
1029a979394aSDag-Erling Smørgrav		   -v zdump_table=$@d/zdump-1970.tab \
1030a979394aSDag-Erling Smørgrav		   -f checknow.awk
1031a979394aSDag-Erling Smørgrav		rm -fr $@d
1032ff2c98b3SDag-Erling Smørgrav		touch $@.out
1033ff2c98b3SDag-Erling Smørgrav		mv $@.out $@
103446c59934SDag-Erling Smørgrav
1035a979394aSDag-Erling Smørgravtables.ck: checktab.awk $(YDATA) backward zone.tab zone1970.tab
1036bc421551SDag-Erling Smørgrav		for tab in $(ZONETABLES); do \
1037bc421551SDag-Erling Smørgrav		  test "$$tab" = zone.tab && links='$(BACKWARD)' || links=''; \
1038bc421551SDag-Erling Smørgrav		  $(AWK) -f checktab.awk -v zone_table=$$tab $(YDATA) $$links \
1039bc421551SDag-Erling Smørgrav		    || exit; \
1040bc421551SDag-Erling Smørgrav		done
1041bc421551SDag-Erling Smørgrav		touch $@
1042bc421551SDag-Erling Smørgrav
1043a979394aSDag-Erling Smørgravtzs.ck: $(TZS) $(TZS_NEW)
1044bc421551SDag-Erling Smørgrav		if test -s $(TZS); then \
1045a979394aSDag-Erling Smørgrav		  $(SETUP_DIFF_TZS) && $$DIFF_TZS $(TZS) $(TZS_NEW); \
1046bc421551SDag-Erling Smørgrav		else \
1047bc421551SDag-Erling Smørgrav		  cp $(TZS_NEW) $(TZS); \
1048bc421551SDag-Erling Smørgrav		fi
1049bc421551SDag-Erling Smørgrav		touch $@
1050bc421551SDag-Erling Smørgrav
1051bc421551SDag-Erling Smørgravcheck_web:	$(CHECK_WEB_PAGES)
1052a979394aSDag-Erling Smørgrav.SUFFIXES: .ck .html
1053a979394aSDag-Erling Smørgrav.html.ck:
1054a979394aSDag-Erling Smørgrav		{ ! ($(CURL) --version) >/dev/null 2>&1 || \
1055bc421551SDag-Erling Smørgrav		    $(CURL) -sS --url https://validator.w3.org/nu/ -F out=gnu \
1056a979394aSDag-Erling Smørgrav		          -F file=@$<; } >$@.out && \
1057bc421551SDag-Erling Smørgrav		  test ! -s $@.out || { cat $@.out; exit 1; }
1058bc421551SDag-Erling Smørgrav		mv $@.out $@
1059bc421551SDag-Erling Smørgrav
1060a979394aSDag-Erling Smørgravziguard.ck: rearguard.zi vanguard.zi ziguard.awk
1061bc421551SDag-Erling Smørgrav		$(AWK) -v DATAFORM=rearguard -f ziguard.awk vanguard.zi | \
1062bc421551SDag-Erling Smørgrav		  diff -u rearguard.zi -
1063bc421551SDag-Erling Smørgrav		$(AWK) -v DATAFORM=vanguard -f ziguard.awk rearguard.zi | \
1064bc421551SDag-Erling Smørgrav		  diff -u vanguard.zi -
1065bc421551SDag-Erling Smørgrav		touch $@
1066bc421551SDag-Erling Smørgrav
1067bc421551SDag-Erling Smørgrav# Check that zishrink.awk does not alter the data, and that ziguard.awk
1068bc421551SDag-Erling Smørgrav# preserves main-format data.
1069a979394aSDag-Erling Smørgravcheck_zishrink: zishrink-posix.ck zishrink-right.ck
1070a979394aSDag-Erling Smørgravzishrink-posix.ck zishrink-right.ck: \
1071bc421551SDag-Erling Smørgrav  zic leapseconds $(PACKRATDATA) $(PACKRATLIST) \
1072bc421551SDag-Erling Smørgrav  $(TDATA) $(DATAFORM).zi tzdata.zi
1073a979394aSDag-Erling Smørgrav		rm -fr $@d t-$@d shrunk-$@d
1074a979394aSDag-Erling Smørgrav		mkdir $@d t-$@d shrunk-$@d
1075bc421551SDag-Erling Smørgrav		case $@ in \
1076a979394aSDag-Erling Smørgrav		  *right*) leap='-L leapseconds';; \
1077bc421551SDag-Erling Smørgrav		  *) leap=;; \
1078bc421551SDag-Erling Smørgrav		esac && \
1079a979394aSDag-Erling Smørgrav		  $(ZIC) $$leap -d $@d $(DATAFORM).zi && \
1080a979394aSDag-Erling Smørgrav		  $(ZIC) $$leap -d shrunk-$@d tzdata.zi && \
1081bc421551SDag-Erling Smørgrav		  case $(DATAFORM),$(PACKRATLIST) in \
1082bc421551SDag-Erling Smørgrav		    main,) \
1083a979394aSDag-Erling Smørgrav		      $(ZIC) $$leap -d t-$@d $(TDATA) && \
1084bc421551SDag-Erling Smørgrav		      $(AWK) '/^Rule/' $(TDATA) | \
1085a979394aSDag-Erling Smørgrav			$(ZIC) $$leap -d t-$@d - $(PACKRATDATA) && \
1086a979394aSDag-Erling Smørgrav		      diff -r $@d t-$@d;; \
1087bc421551SDag-Erling Smørgrav		  esac
1088a979394aSDag-Erling Smørgrav		diff -r $@d shrunk-$@d
1089a979394aSDag-Erling Smørgrav		rm -fr $@d t-$@d shrunk-$@d
1090bc421551SDag-Erling Smørgrav		touch $@
1091bc421551SDag-Erling Smørgrav
109228f617deSDag-Erling Smørgrav# Check that NEWS has data release versions and dates in reverse order.
109328f617deSDag-Erling Smørgravnews.ck: NEWS
109428f617deSDag-Erling Smørgrav		grep '^Release [0-9][0-9][0-9][0-9]' NEWS | LC_ALL=C sort -cru
109528f617deSDag-Erling Smørgrav		sed -n '/ -0000$$/!s/^Release [^ ]*//p' NEWS|LC_ALL=C sort -cru
109628f617deSDag-Erling Smørgrav		touch $@
109728f617deSDag-Erling Smørgrav
1098bc421551SDag-Erling Smørgravclean_misc:
1099a979394aSDag-Erling Smørgrav		rm -fr *.ckd *.dir
1100ff2c98b3SDag-Erling Smørgrav		rm -f *.ck *.core *.o *.out *.t core core.* \
110146c59934SDag-Erling Smørgrav		  date tzdir.h tzselect version.h zdump zic libtz.a
1102bc421551SDag-Erling Smørgravclean:		clean_misc
1103a979394aSDag-Erling Smørgrav		rm -fr tzdb-*/
1104bc421551SDag-Erling Smørgrav		rm -f *.zi $(TZS_NEW)
1105bc421551SDag-Erling Smørgrav
1106bc421551SDag-Erling Smørgravmaintainer-clean: clean
1107bc421551SDag-Erling Smørgrav		@echo 'This command is intended for maintainers to use; it'
1108bc421551SDag-Erling Smørgrav		@echo 'deletes files that may need special tools to rebuild.'
1109bc421551SDag-Erling Smørgrav		rm -f leapseconds version $(MANTXTS) $(TZS) *.asc *.tar.*
1110bc421551SDag-Erling Smørgrav
1111bc421551SDag-Erling Smørgravnames:
1112bc421551SDag-Erling Smørgrav		@echo $(ENCHILADA)
1113bc421551SDag-Erling Smørgrav
1114a979394aSDag-Erling Smørgravpublic: check public.ck $(CHECK_TIME_T_ALTERNATIVES) \
1115bc421551SDag-Erling Smørgrav		tarballs signatures
1116bc421551SDag-Erling Smørgrav
1117bc421551SDag-Erling Smørgravdate.1.txt:	date.1
1118bc421551SDag-Erling Smørgravnewctime.3.txt:	newctime.3
1119bc421551SDag-Erling Smørgravnewstrftime.3.txt: newstrftime.3
1120bc421551SDag-Erling Smørgravnewtzset.3.txt:	newtzset.3
1121bc421551SDag-Erling Smørgravtime2posix.3.txt: time2posix.3
1122bc421551SDag-Erling Smørgravtzfile.5.txt:	tzfile.5
1123bc421551SDag-Erling Smørgravtzselect.8.txt:	tzselect.8
1124bc421551SDag-Erling Smørgravzdump.8.txt:	zdump.8
1125bc421551SDag-Erling Smørgravzic.8.txt:	zic.8
1126bc421551SDag-Erling Smørgrav
1127bc421551SDag-Erling Smørgrav$(MANTXTS):	workman.sh
1128ff2c98b3SDag-Erling Smørgrav		LC_ALL=C sh workman.sh $(MANFLAGS) $(@:.txt=) >$@.out
1129bc421551SDag-Erling Smørgrav		mv $@.out $@
1130bc421551SDag-Erling Smørgrav
1131bc421551SDag-Erling Smørgrav# Set file timestamps deterministically if possible,
1132bc421551SDag-Erling Smørgrav# so that tarballs containing the timestamps are reproducible.
1133bc421551SDag-Erling Smørgrav#
1134bc421551SDag-Erling Smørgrav# '$(SET_TIMESTAMP_N) N DEST A B C ...' sets the timestamp of the
1135bc421551SDag-Erling Smørgrav# file DEST to the maximum of the timestamps of the files A B C ...,
1136bc421551SDag-Erling Smørgrav# plus N if GNU ls and touch are available.
1137bc421551SDag-Erling SmørgravSET_TIMESTAMP_N = sh -c '\
1138bc421551SDag-Erling Smørgrav  n=$$0 dest=$$1; shift; \
113946c59934SDag-Erling Smørgrav  <"$$dest" && \
1140bc421551SDag-Erling Smørgrav  if test $$n != 0 && \
1141a979394aSDag-Erling Smørgrav     lsout=$$(ls -nt --time-style="+%s" "$$@" 2>/dev/null); then \
1142bc421551SDag-Erling Smørgrav    set x $$lsout && \
1143a979394aSDag-Erling Smørgrav    timestamp=$$(($$7 + $$n)) && \
114446c59934SDag-Erling Smørgrav    echo "+ touch -md @$$timestamp $$dest" && \
114546c59934SDag-Erling Smørgrav    touch -md @$$timestamp "$$dest"; \
114646c59934SDag-Erling Smørgrav  else \
1147a979394aSDag-Erling Smørgrav    newest=$$(ls -t "$$@" | sed 1q) && \
114846c59934SDag-Erling Smørgrav    echo "+ touch -mr $$newest $$dest" && \
114946c59934SDag-Erling Smørgrav    touch -mr "$$newest" "$$dest"; \
115046c59934SDag-Erling Smørgrav  fi'
1151bc421551SDag-Erling Smørgrav# If DEST depends on A B C ... in this Makefile, callers should use
1152bc421551SDag-Erling Smørgrav# $(SET_TIMESTAMP_DEP) DEST A B C ..., for the benefit of any
1153bc421551SDag-Erling Smørgrav# downstream 'make' that considers equal timestamps to be out of date.
115428f617deSDag-Erling Smørgrav# POSIX allows this 'make' behavior, although only HP-UX 'make'
115528f617deSDag-Erling Smørgrav# (which is no longer supported) did things that way.
1156bc421551SDag-Erling Smørgrav# If all that matters is that the timestamp be reproducible
1157bc421551SDag-Erling Smørgrav# and plausible, use $(SET_TIMESTAMP).
1158bc421551SDag-Erling SmørgravSET_TIMESTAMP = $(SET_TIMESTAMP_N) 0
1159bc421551SDag-Erling SmørgravSET_TIMESTAMP_DEP = $(SET_TIMESTAMP_N) 1
1160bc421551SDag-Erling Smørgrav
1161bc421551SDag-Erling Smørgrav# Set the timestamps to those of the git repository, if available,
1162bc421551SDag-Erling Smørgrav# and if the files have not changed since then.
1163bc421551SDag-Erling Smørgrav# This uses GNU 'ls --time-style=+%s', which outputs the seconds count,
1164bc421551SDag-Erling Smørgrav# and GNU 'touch -d@N FILE', where N is the number of seconds since 1970.
1165bc421551SDag-Erling Smørgrav# If git or GNU is absent, don't bother to sync with git timestamps.
1166bc421551SDag-Erling Smørgrav# Also, set the timestamp of each prebuilt file like 'leapseconds'
1167bc421551SDag-Erling Smørgrav# to be the maximum of the files it depends on.
1168bc421551SDag-Erling Smørgravset-timestamps.out: $(EIGHT_YARDS)
1169bc421551SDag-Erling Smørgrav		rm -f $@
1170bc421551SDag-Erling Smørgrav		if (type git) >/dev/null 2>&1 && \
1171a979394aSDag-Erling Smørgrav		   files=$$(git ls-files $(EIGHT_YARDS)) && \
1172bc421551SDag-Erling Smørgrav		   touch -md @1 test.out; then \
1173bc421551SDag-Erling Smørgrav		  rm -f test.out && \
1174bc421551SDag-Erling Smørgrav		  for file in $$files; do \
1175967a49a2SDag-Erling Smørgrav		    if git diff --quiet HEAD $$file; then \
1176a979394aSDag-Erling Smørgrav		      time=$$(TZ=UTC0 git log -1 \
117746c59934SDag-Erling Smørgrav			--format='tformat:%cd' \
1178ff2c98b3SDag-Erling Smørgrav			--date='format-local:%Y-%m-%dT%H:%M:%SZ' \
1179a979394aSDag-Erling Smørgrav			$$file) && \
118046c59934SDag-Erling Smørgrav		      echo "+ touch -md $$time $$file" && \
118146c59934SDag-Erling Smørgrav		      touch -md $$time $$file; \
1182bc421551SDag-Erling Smørgrav		    else \
1183bc421551SDag-Erling Smørgrav		      echo >&2 "$$file: warning: does not match repository"; \
1184bc421551SDag-Erling Smørgrav		    fi || exit; \
1185bc421551SDag-Erling Smørgrav		  done; \
1186bc421551SDag-Erling Smørgrav		fi
1187bc421551SDag-Erling Smørgrav		$(SET_TIMESTAMP_DEP) leapseconds $(LEAP_DEPS)
1188a979394aSDag-Erling Smørgrav		for file in $(MANTXTS); do \
1189a979394aSDag-Erling Smørgrav		  $(SET_TIMESTAMP_DEP) $$file $${file%.txt} workman.sh || \
1190bc421551SDag-Erling Smørgrav		    exit; \
1191bc421551SDag-Erling Smørgrav		done
1192bc421551SDag-Erling Smørgrav		$(SET_TIMESTAMP_DEP) version $(VERSION_DEPS)
1193bc421551SDag-Erling Smørgrav		$(SET_TIMESTAMP_DEP) tzdata.zi $(TZDATA_ZI_DEPS)
1194bc421551SDag-Erling Smørgrav		touch $@
1195bc421551SDag-Erling Smørgravset-tzs-timestamp.out: $(TZS)
1196bc421551SDag-Erling Smørgrav		$(SET_TIMESTAMP_DEP) $(TZS) $(TZS_DEPS)
1197bc421551SDag-Erling Smørgrav		touch $@
1198bc421551SDag-Erling Smørgrav
1199bc421551SDag-Erling Smørgrav# The zics below ensure that each data file can stand on its own.
1200bc421551SDag-Erling Smørgrav# We also do an all-files run to catch links to links.
1201bc421551SDag-Erling Smørgrav
1202a979394aSDag-Erling Smørgravpublic.ck: $(VERSION_DEPS)
1203a979394aSDag-Erling Smørgrav		rm -fr $@d
1204a979394aSDag-Erling Smørgrav		mkdir $@d
1205a979394aSDag-Erling Smørgrav		ln $(VERSION_DEPS) $@d
1206a979394aSDag-Erling Smørgrav		cd $@d \
120746c59934SDag-Erling Smørgrav		  && $(MAKE) CFLAGS='$(GCC_DEBUG_FLAGS)' TZDIR='$(TZDIR)' ALL
1208a979394aSDag-Erling Smørgrav		for i in $(TDATA_TO_CHECK) \
1209a979394aSDag-Erling Smørgrav		    tzdata.zi vanguard.zi main.zi rearguard.zi; \
1210bc421551SDag-Erling Smørgrav		do \
1211a979394aSDag-Erling Smørgrav		  $@d/zic -v -d $@d/zoneinfo $@d/$$i || exit; \
1212bc421551SDag-Erling Smørgrav		done
1213a979394aSDag-Erling Smørgrav		$@d/zic -v -d $@d/zoneinfo-all $(TDATA_TO_CHECK)
1214bc421551SDag-Erling Smørgrav		:
1215bc421551SDag-Erling Smørgrav		: Also check 'backzone' syntax.
1216a979394aSDag-Erling Smørgrav		rm $@d/main.zi
1217a979394aSDag-Erling Smørgrav		cd $@d && $(MAKE) PACKRATDATA=backzone main.zi
1218a979394aSDag-Erling Smørgrav		$@d/zic -d $@d/zoneinfo main.zi
1219a979394aSDag-Erling Smørgrav		rm $@d/main.zi
1220a979394aSDag-Erling Smørgrav		cd $@d && \
1221bc421551SDag-Erling Smørgrav		  $(MAKE) PACKRATDATA=backzone PACKRATLIST=zone.tab main.zi
1222a979394aSDag-Erling Smørgrav		$@d/zic -d $@d/zoneinfo main.zi
1223bc421551SDag-Erling Smørgrav		:
1224a979394aSDag-Erling Smørgrav		rm -fr $@d
1225bc421551SDag-Erling Smørgrav		touch $@
1226bc421551SDag-Erling Smørgrav
1227bc421551SDag-Erling Smørgrav# Check that the code works under various alternative
1228bc421551SDag-Erling Smørgrav# implementations of time_t.
1229bc421551SDag-Erling Smørgravcheck_time_t_alternatives: $(TIME_T_ALTERNATIVES)
1230bc421551SDag-Erling Smørgrav$(TIME_T_ALTERNATIVES_TAIL): $(TIME_T_ALTERNATIVES_HEAD)
1231bc421551SDag-Erling Smørgrav$(TIME_T_ALTERNATIVES): $(VERSION_DEPS)
1232a979394aSDag-Erling Smørgrav		rm -fr $@d
1233a979394aSDag-Erling Smørgrav		mkdir $@d
1234a979394aSDag-Erling Smørgrav		ln $(VERSION_DEPS) $@d
1235bc421551SDag-Erling Smørgrav		case $@ in \
1236a979394aSDag-Erling Smørgrav		  *32_t*) range=-2147483648,2147483648;; \
1237bc421551SDag-Erling Smørgrav		  u*) range=0,4294967296;; \
1238bc421551SDag-Erling Smørgrav		  *) range=-4294967296,4294967296;; \
1239bc421551SDag-Erling Smørgrav		esac && \
1240a979394aSDag-Erling Smørgrav		wd=$$PWD && \
1241a979394aSDag-Erling Smørgrav		zones=$$($(AWK) '/^[^#]/ { print $$3 }' <zone1970.tab) && \
1242bc421551SDag-Erling Smørgrav		if test $@ = $(TIME_T_ALTERNATIVES_HEAD); then \
1243bc421551SDag-Erling Smørgrav		  range_target=; \
1244bc421551SDag-Erling Smørgrav		else \
1245bc421551SDag-Erling Smørgrav		  range_target=to$$range.tzs; \
1246bc421551SDag-Erling Smørgrav		fi && \
1247a979394aSDag-Erling Smørgrav		(cd $@d && \
1248a979394aSDag-Erling Smørgrav		  $(MAKE) TOPDIR="$$wd/$@d" \
1249a979394aSDag-Erling Smørgrav		    CFLAGS='$(CFLAGS) -Dtime_tz='"'$(@:.ck=)'" \
1250bc421551SDag-Erling Smørgrav		    REDO='$(REDO)' \
1251a979394aSDag-Erling Smørgrav		    D="$$wd/$@d" \
1252bc421551SDag-Erling Smørgrav		    TZS_YEAR="$$range" TZS_CUTOFF_FLAG="-t $$range" \
1253bc421551SDag-Erling Smørgrav		    install $$range_target) && \
1254bc421551SDag-Erling Smørgrav		test $@ = $(TIME_T_ALTERNATIVES_HEAD) || { \
1255a979394aSDag-Erling Smørgrav		  (cd $(TIME_T_ALTERNATIVES_HEAD)d && \
1256a979394aSDag-Erling Smørgrav		    $(MAKE) TOPDIR="$$wd/$@d" \
1257bc421551SDag-Erling Smørgrav		      TZS_YEAR="$$range" TZS_CUTOFF_FLAG="-t $$range" \
1258a979394aSDag-Erling Smørgrav		      D="$$wd/$@d" \
1259bc421551SDag-Erling Smørgrav		      to$$range.tzs) && \
1260a979394aSDag-Erling Smørgrav		  $(SETUP_DIFF_TZS) && \
1261a979394aSDag-Erling Smørgrav		  $$DIFF_TZS $(TIME_T_ALTERNATIVES_HEAD)d/to$$range.tzs \
1262a979394aSDag-Erling Smørgrav			  $@d/to$$range.tzs && \
1263bc421551SDag-Erling Smørgrav		  if diff -q Makefile Makefile 2>/dev/null; then \
1264bc421551SDag-Erling Smørgrav		    quiet_option='-q'; \
1265bc421551SDag-Erling Smørgrav		  else \
1266bc421551SDag-Erling Smørgrav		    quiet_option=''; \
1267bc421551SDag-Erling Smørgrav		  fi && \
1268a979394aSDag-Erling Smørgrav		    diff $$quiet_option -r $(TIME_T_ALTERNATIVES_HEAD)d/etc \
1269a979394aSDag-Erling Smørgrav					   $@d/etc && \
1270bc421551SDag-Erling Smørgrav		    diff $$quiet_option -r \
1271a979394aSDag-Erling Smørgrav		      $(TIME_T_ALTERNATIVES_HEAD)d/usr/share \
1272a979394aSDag-Erling Smørgrav		      $@d/usr/share; \
1273bc421551SDag-Erling Smørgrav		}
1274bc421551SDag-Erling Smørgrav		touch $@
1275bc421551SDag-Erling Smørgrav
1276bc421551SDag-Erling SmørgravTRADITIONAL_ASC = \
1277ff2c98b3SDag-Erling Smørgrav  tzcode$(VERSION).tar.gz.asc.t \
1278ff2c98b3SDag-Erling Smørgrav  tzdata$(VERSION).tar.gz.asc.t
1279bc421551SDag-Erling SmørgravREARGUARD_ASC = \
1280ff2c98b3SDag-Erling Smørgrav  tzdata$(VERSION)-rearguard.tar.gz.asc.t
1281bc421551SDag-Erling SmørgravALL_ASC = $(TRADITIONAL_ASC) $(REARGUARD_ASC) \
1282ff2c98b3SDag-Erling Smørgrav  tzdb-$(VERSION).tar.lz.asc.t
1283bc421551SDag-Erling Smørgrav
1284bc421551SDag-Erling Smørgravtarballs rearguard_tarballs tailored_tarballs traditional_tarballs \
1285bc421551SDag-Erling Smørgravsignatures rearguard_signatures traditional_signatures: \
1286bc421551SDag-Erling Smørgrav  version set-timestamps.out rearguard.zi vanguard.zi
1287a979394aSDag-Erling Smørgrav		read -r VERSION <version && \
1288bc421551SDag-Erling Smørgrav		$(MAKE) AWK='$(AWK)' VERSION="$$VERSION" $@_version
1289bc421551SDag-Erling Smørgrav
1290bc421551SDag-Erling Smørgrav# These *_version rules are intended for use if VERSION is set by some
1291bc421551SDag-Erling Smørgrav# other means.  Ordinarily these rules are used only by the above
1292bc421551SDag-Erling Smørgrav# non-_version rules, which set VERSION on the 'make' command line.
1293bc421551SDag-Erling Smørgravtarballs_version: traditional_tarballs_version rearguard_tarballs_version \
1294ff2c98b3SDag-Erling Smørgrav  tzdb-$(VERSION).tar.lz.t
1295bc421551SDag-Erling Smørgravrearguard_tarballs_version: \
1296ff2c98b3SDag-Erling Smørgrav  tzdata$(VERSION)-rearguard.tar.gz.t
1297bc421551SDag-Erling Smørgravtraditional_tarballs_version: \
1298ff2c98b3SDag-Erling Smørgrav  tzcode$(VERSION).tar.gz.t tzdata$(VERSION).tar.gz.t
1299bc421551SDag-Erling Smørgravtailored_tarballs_version: \
1300ff2c98b3SDag-Erling Smørgrav  tzdata$(VERSION)-tailored.tar.gz.t
1301bc421551SDag-Erling Smørgravsignatures_version: $(ALL_ASC)
1302bc421551SDag-Erling Smørgravrearguard_signatures_version: $(REARGUARD_ASC)
1303bc421551SDag-Erling Smørgravtraditional_signatures_version: $(TRADITIONAL_ASC)
1304bc421551SDag-Erling Smørgrav
1305ff2c98b3SDag-Erling Smørgravtzcode$(VERSION).tar.gz.t: set-timestamps.out
1306a979394aSDag-Erling Smørgrav		$(SETUP_TAR) && \
1307a979394aSDag-Erling Smørgrav		$$TAR -cf - \
1308bc421551SDag-Erling Smørgrav		    $(COMMON) $(DOCS) $(SOURCES) | \
1309ff2c98b3SDag-Erling Smørgrav		  gzip $(GZIPFLAGS) >$(@:.t=)
1310ff2c98b3SDag-Erling Smørgrav		$(SET_TIMESTAMP) $(@:.t=) $(COMMON) $(DOCS) $(SOURCES)
1311ff2c98b3SDag-Erling Smørgrav		touch $@
1312bc421551SDag-Erling Smørgrav
1313ff2c98b3SDag-Erling Smørgravtzdata$(VERSION).tar.gz.t: set-timestamps.out
1314a979394aSDag-Erling Smørgrav		$(SETUP_TAR) && \
1315a979394aSDag-Erling Smørgrav		$$TAR -cf - $(TZDATA_DIST) | \
1316ff2c98b3SDag-Erling Smørgrav		  gzip $(GZIPFLAGS) >$(@:.t=)
1317ff2c98b3SDag-Erling Smørgrav		$(SET_TIMESTAMP) $(@:.t=) $(TZDATA_DIST)
1318ff2c98b3SDag-Erling Smørgrav		touch $@
1319bc421551SDag-Erling Smørgrav
1320bc421551SDag-Erling Smørgrav# Create empty files with a reproducible timestamp.
1321bc421551SDag-Erling SmørgravCREATE_EMPTY = TZ=UTC0 touch -mt 202010122253.00
1322bc421551SDag-Erling Smørgrav
1323bc421551SDag-Erling Smørgrav# The obsolescent *rearguard* targets and related macros are present
1324bc421551SDag-Erling Smørgrav# for backwards compatibility with tz releases 2018e through 2022a.
1325bc421551SDag-Erling Smørgrav# They should go away eventually.  To build rearguard tarballs you
1326bc421551SDag-Erling Smørgrav# can instead use 'make DATAFORM=rearguard tailored_tarballs'.
1327ff2c98b3SDag-Erling Smørgravtzdata$(VERSION)-rearguard.tar.gz.t: rearguard.zi set-timestamps.out
1328bc421551SDag-Erling Smørgrav		rm -fr $@.dir
1329bc421551SDag-Erling Smørgrav		mkdir $@.dir
1330bc421551SDag-Erling Smørgrav		ln $(TZDATA_DIST) $@.dir
1331bc421551SDag-Erling Smørgrav		cd $@.dir && rm -f $(TDATA) $(PACKRATDATA) version
1332bc421551SDag-Erling Smørgrav		for f in $(TDATA) $(PACKRATDATA); do \
1333bc421551SDag-Erling Smørgrav		  rearf=$@.dir/$$f; \
1334bc421551SDag-Erling Smørgrav		  $(AWK) -v DATAFORM=rearguard -f ziguard.awk $$f >$$rearf && \
1335bc421551SDag-Erling Smørgrav		  $(SET_TIMESTAMP_DEP) $$rearf ziguard.awk $$f || exit; \
1336bc421551SDag-Erling Smørgrav		done
1337bc421551SDag-Erling Smørgrav		sed '1s/$$/-rearguard/' <version >$@.dir/version
1338bc421551SDag-Erling Smørgrav		: The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
1339bc421551SDag-Erling Smørgrav		$(CREATE_EMPTY) $@.dir/pacificnew
134046c59934SDag-Erling Smørgrav		touch -mr version $@.dir/version
1341a979394aSDag-Erling Smørgrav		$(SETUP_TAR) && \
1342bc421551SDag-Erling Smørgrav		  (cd $@.dir && \
1343a979394aSDag-Erling Smørgrav		   $$TAR -cf - \
1344bc421551SDag-Erling Smørgrav			$(TZDATA_DIST) pacificnew | \
1345ff2c98b3SDag-Erling Smørgrav		     gzip $(GZIPFLAGS)) >$(@:.t=)
1346ff2c98b3SDag-Erling Smørgrav		$(SET_TIMESTAMP) $(@:.t=) \
1347ff2c98b3SDag-Erling Smørgrav		  $$(cd $@.dir && \
1348ff2c98b3SDag-Erling Smørgrav		       ls $(TZDATA_DIST) pacificnew | sed 's,^,$@.dir/,')
1349ff2c98b3SDag-Erling Smørgrav		touch $@
1350bc421551SDag-Erling Smørgrav
1351bc421551SDag-Erling Smørgrav# Create a tailored tarball suitable for TZUpdater and compatible tools.
1352bc421551SDag-Erling Smørgrav# For example, 'make DATAFORM=vanguard tailored_tarballs' makes a tarball
1353bc421551SDag-Erling Smørgrav# useful for testing whether TZUpdater supports vanguard form.
1354bc421551SDag-Erling Smørgrav# The generated tarball is not byte-for-byte equivalent to a hand-tailored
1355bc421551SDag-Erling Smørgrav# traditional tarball, as data entries are put into 'etcetera' even if they
1356bc421551SDag-Erling Smørgrav# came from some other source file.  However, the effect should be the same
1357bc421551SDag-Erling Smørgrav# for ordinary use, which reads all the source files.
1358ff2c98b3SDag-Erling Smørgravtzdata$(VERSION)-tailored.tar.gz.t: set-timestamps.out
1359bc421551SDag-Erling Smørgrav		rm -fr $@.dir
1360bc421551SDag-Erling Smørgrav		mkdir $@.dir
1361bc421551SDag-Erling Smørgrav		: The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
1362a979394aSDag-Erling Smørgrav		if test $(DATAFORM) = vanguard; then \
1363a979394aSDag-Erling Smørgrav		  pacificnew=; \
1364a979394aSDag-Erling Smørgrav		else \
1365a979394aSDag-Erling Smørgrav		  pacificnew=pacificnew; \
1366a979394aSDag-Erling Smørgrav		fi && \
1367bc421551SDag-Erling Smørgrav		cd $@.dir && \
1368bc421551SDag-Erling Smørgrav		  $(CREATE_EMPTY) $(PRIMARY_YDATA) $(NDATA) backward \
1369a979394aSDag-Erling Smørgrav		  $$pacificnew
1370ff2c98b3SDag-Erling Smørgrav		(sed '/^#/!d' tzdata.zi && echo && cat $(DATAFORM).zi) \
1371bc421551SDag-Erling Smørgrav		  >$@.dir/etcetera
137246c59934SDag-Erling Smørgrav		touch -mr tzdata.zi $@.dir/etcetera
1373bc421551SDag-Erling Smørgrav		sed -n \
1374bc421551SDag-Erling Smørgrav		  -e '/^# *version  *\(.*\)/h' \
1375bc421551SDag-Erling Smørgrav		  -e '/^# *ddeps  */H' \
1376bc421551SDag-Erling Smørgrav		  -e '$$!d' \
1377bc421551SDag-Erling Smørgrav		  -e 'g' \
1378bc421551SDag-Erling Smørgrav		  -e 's/^# *version  *//' \
1379bc421551SDag-Erling Smørgrav		  -e 's/\n# *ddeps  */-/' \
1380bc421551SDag-Erling Smørgrav		  -e 's/ /-/g' \
1381bc421551SDag-Erling Smørgrav		  -e 'p' \
1382bc421551SDag-Erling Smørgrav		  <tzdata.zi >$@.dir/version
138346c59934SDag-Erling Smørgrav		touch -mr version $@.dir/version
1384bc421551SDag-Erling Smørgrav		links= && \
1385bc421551SDag-Erling Smørgrav		  for file in $(TZDATA_DIST); do \
1386bc421551SDag-Erling Smørgrav		    test -f $@.dir/$$file || links="$$links $$file"; \
1387bc421551SDag-Erling Smørgrav		  done && \
1388bc421551SDag-Erling Smørgrav		  ln $$links $@.dir
1389a979394aSDag-Erling Smørgrav		$(SETUP_TAR) && \
1390bc421551SDag-Erling Smørgrav		  (cd $@.dir && \
1391ff2c98b3SDag-Erling Smørgrav		   $$TAR -cf - *) | gzip $(GZIPFLAGS) >$(@:.t=)
1392ff2c98b3SDag-Erling Smørgrav		$(SET_TIMESTAMP) $(@:.t=) \
1393ff2c98b3SDag-Erling Smørgrav		  $$(cd $@.dir && ls * | sed 's,^,$@.dir/,')
1394ff2c98b3SDag-Erling Smørgrav		touch $@
1395bc421551SDag-Erling Smørgrav
1396ff2c98b3SDag-Erling Smørgravtzdb-$(VERSION).tar.lz.t: set-timestamps.out set-tzs-timestamp.out
1397bc421551SDag-Erling Smørgrav		rm -fr tzdb-$(VERSION)
1398bc421551SDag-Erling Smørgrav		mkdir tzdb-$(VERSION)
1399bc421551SDag-Erling Smørgrav		ln $(ENCHILADA) tzdb-$(VERSION)
1400bc421551SDag-Erling Smørgrav		$(SET_TIMESTAMP) tzdb-$(VERSION) tzdb-$(VERSION)/*
1401a979394aSDag-Erling Smørgrav		$(SETUP_TAR) && \
1402ff2c98b3SDag-Erling Smørgrav		  $$TAR -cf - tzdb-$(VERSION) | lzip -9 >$(@:.t=)
1403ff2c98b3SDag-Erling Smørgrav		$(SET_TIMESTAMP) $(@:.t=) tzdb-$(VERSION)
1404ff2c98b3SDag-Erling Smørgrav		touch $@
1405bc421551SDag-Erling Smørgrav
1406ff2c98b3SDag-Erling Smørgravtzcode$(VERSION).tar.gz.asc.t: tzcode$(VERSION).tar.gz.t
1407ff2c98b3SDag-Erling Smørgravtzdata$(VERSION).tar.gz.asc.t: tzdata$(VERSION).tar.gz.t
1408ff2c98b3SDag-Erling Smørgravtzdata$(VERSION)-rearguard.tar.gz.asc.t: tzdata$(VERSION)-rearguard.tar.gz.t
1409ff2c98b3SDag-Erling Smørgravtzdb-$(VERSION).tar.lz.asc.t: tzdb-$(VERSION).tar.lz.t
1410bc421551SDag-Erling Smørgrav$(ALL_ASC):
1411ff2c98b3SDag-Erling Smørgrav		$(GPG) --armor --detach-sign $(?:.t=)
1412ff2c98b3SDag-Erling Smørgrav		$(SET_TIMESTAMP) $(@:.t=) $(?:.t=)
1413ff2c98b3SDag-Erling Smørgrav		touch $@
1414bc421551SDag-Erling Smørgrav
1415bc421551SDag-Erling Smørgravzonenames:	tzdata.zi
1416bc421551SDag-Erling Smørgrav		@$(AWK) '/^Z/ { print $$2 } /^L/ { print $$3 }' tzdata.zi
1417bc421551SDag-Erling Smørgrav
1418967a49a2SDag-Erling Smørgravasctime.o:	private.h
1419bc421551SDag-Erling Smørgravdate.o:		private.h
1420bc421551SDag-Erling Smørgravdifftime.o:	private.h
1421967a49a2SDag-Erling Smørgravlocaltime.o:	private.h tzdir.h tzfile.h
1422967a49a2SDag-Erling Smørgravstrftime.o:	localtime.c private.h tzdir.h tzfile.h
1423967a49a2SDag-Erling Smørgravzdump.o:	private.h version.h
1424967a49a2SDag-Erling Smørgravzic.o:		private.h tzdir.h tzfile.h version.h
1425bc421551SDag-Erling Smørgrav
1426bc421551SDag-Erling Smørgrav.PHONY: ALL INSTALL all
1427bc421551SDag-Erling Smørgrav.PHONY: check check_mild check_time_t_alternatives
1428bc421551SDag-Erling Smørgrav.PHONY: check_web check_zishrink
142946c59934SDag-Erling Smørgrav.PHONY: clean clean_misc commit-leap-seconds.list dummy.zd
143046c59934SDag-Erling Smørgrav.PHONY: fetch-leap-seconds.list force_tzs
1431a979394aSDag-Erling Smørgrav.PHONY: install maintainer-clean names
1432bc421551SDag-Erling Smørgrav.PHONY: posix_only posix_right public
1433bc421551SDag-Erling Smørgrav.PHONY: rearguard_signatures rearguard_signatures_version
1434bc421551SDag-Erling Smørgrav.PHONY: rearguard_tarballs rearguard_tarballs_version
1435bc421551SDag-Erling Smørgrav.PHONY: right_only right_posix signatures signatures_version
1436bc421551SDag-Erling Smørgrav.PHONY: tarballs tarballs_version
1437bc421551SDag-Erling Smørgrav.PHONY: traditional_signatures traditional_signatures_version
1438bc421551SDag-Erling Smørgrav.PHONY: traditional_tarballs traditional_tarballs_version
1439bc421551SDag-Erling Smørgrav.PHONY: tailored_tarballs tailored_tarballs_version
1440bc421551SDag-Erling Smørgrav.PHONY: zonenames zones
1441bc421551SDag-Erling Smørgrav.PHONY: $(ZDS)
1442