Makefile revision 1.8
1# <pre>
2# This file is in the public domain, so clarified as of
3# 2009-05-17 by Arthur David Olson.
4
5# Version numbers of the code and data distributions.
6VERSION =	2012h
7
8# Change the line below for your time zone (after finding the zone you want in
9# the time zone files, or adding it to a time zone file).
10# Alternately, if you discover you've got the wrong time zone, you can just
11#	zic -l rightzone
12# to correct things.
13# Use the command
14#	make zonenames
15# to get a list of the values you can use for LOCALTIME.
16
17LOCALTIME=	GMT
18
19# If you want something other than Eastern United States time as a template
20# for handling POSIX-style time zone environment variables,
21# change the line below (after finding the zone you want in the
22# time zone files, or adding it to a time zone file).
23# (When a POSIX-style environment variable is handled, the rules in the
24# template file are used to determine "spring forward" and "fall back" days and
25# times; the environment variable itself specifies UTC offsets of standard and
26# summer time.)
27# Alternately, if you discover you've got the wrong time zone, you can just
28#	zic -p rightzone
29# to correct things.
30# Use the command
31#	make zonenames
32# to get a list of the values you can use for POSIXRULES.
33# If you want POSIX compatibility, use "America/New_York".
34
35POSIXRULES=	America/New_York
36
37# Also see TZDEFRULESTRING below, which takes effect only
38# if the time zone files cannot be accessed.
39
40# Everything gets put in subdirectories of. . .
41
42TOPDIR=		/usr/local
43
44# "Compiled" time zone information is placed in the "TZDIR" directory
45# (and subdirectories).
46# Use an absolute path name for TZDIR unless you're just testing the software.
47
48TZDIR=		$(TOPDIR)/etc/zoneinfo
49
50# The "tzselect", "zic", and "zdump" commands get installed in. . .
51
52ETCDIR=		$(TOPDIR)/etc
53
54# If you "make INSTALL", the "date" command gets installed in. . .
55
56BINDIR=		$(TOPDIR)/bin
57
58# Manual pages go in subdirectories of. . .
59
60MANDIR=		$(TOPDIR)/man
61
62# Library functions are put in an archive in LIBDIR.
63
64LIBDIR=		$(TOPDIR)/lib
65TZLIB=		$(LIBDIR)/libtz.a
66
67# If you always want time values interpreted as "seconds since the epoch
68# (not counting leap seconds)", use
69#	REDO=		posix_only
70# below.  If you always want right time values interpreted as "seconds since
71# the epoch" (counting leap seconds)", use
72#	REDO=		right_only
73# below.  If you want both sets of data available, with leap seconds not
74# counted normally, use
75#	REDO=		posix_right
76# below.  If you want both sets of data available, with leap seconds counted
77# normally, use
78#	REDO=		right_posix
79# below.
80# POSIX mandates that leap seconds not be counted; for compatibility with it,
81# use either "posix_only" or "posix_right".
82
83REDO=		posix_right
84
85# Since "." may not be in PATH...
86
87YEARISTYPE=	./yearistype
88
89# Non-default libraries needed to link.
90# Add -lintl if you want to use `gettext' on Solaris.
91LDLIBS=
92
93# Add the following to the end of the "CFLAGS=" line as needed.
94#  -DHAVE_ADJTIME=0 if `adjtime' does not exist (SVR0?)
95#  -DHAVE_GETTEXT=1 if `gettext' works (GNU, Linux, Solaris); also see LDLIBS
96#  -DHAVE_INCOMPATIBLE_CTIME_R=1 if your system's time.h declares
97#	ctime_r and asctime_r incompatibly with the POSIX standard (Solaris 8).
98#  -DHAVE_SETTIMEOFDAY=0 if settimeofday does not exist (SVR0?)
99#  -DHAVE_SETTIMEOFDAY=1 if settimeofday has just 1 arg (SVR4)
100#  -DHAVE_SETTIMEOFDAY=2 if settimeofday uses 2nd arg (4.3BSD)
101#  -DHAVE_SETTIMEOFDAY=3 if settimeofday ignores 2nd arg (4.4BSD)
102#  -DHAVE_STDINT_H=1 if you have a pre-C99 compiler with "stdint.h"
103#  -DHAVE_SYMLINK=0 if your system lacks the symlink function
104#  -DHAVE_SYS_STAT_H=0 if your compiler lacks a "sys/stat.h"
105#  -DHAVE_SYS_WAIT_H=0 if your compiler lacks a "sys/wait.h"
106#  -DLOCALE_HOME=\"path\" if locales are in "path", not "/usr/lib/locale"
107#  -DHAVE_UNISTD_H=0 if your compiler lacks a "unistd.h" (Microsoft C++ 7?)
108#  -DHAVE_UTMPX_H=1 if your compiler has a "utmpx.h"
109#  -DTZDEFRULESTRING=\",date/time,date/time\" to default to the specified
110#	DST transitions if the time zone files cannot be accessed
111#  -DTZ_DOMAIN=\"foo\" to use "foo" for gettext domain name; default is "tz"
112#  -TTZ_DOMAINDIR=\"/path\" to use "/path" for gettext directory;
113#	the default is system-supplied, typically "/usr/lib/locale"
114#  $(GCC_DEBUG_FLAGS) if you are using GCC and want lots of checking
115#  -DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU=1
116#	if you do not want run time warnings about formats that may cause
117#	year 2000 grief
118#  -DNO_ERROR_IN_DST_GAP=1
119#	if you want mktime() not to return an error in the DST gap.
120#  -DZIC_MAX_ABBR_LEN_WO_WARN=3
121#	(or some other number) to set the maximum time zone abbreviation length
122#	that zic will accept without a warning (the default is 6)
123GCC_DEBUG_FLAGS = -Dlint -g3 -O3 -fno-common -fstrict-aliasing \
124	-Wall -Wextra \
125	-Wbad-function-cast -Wcast-align -Wcast-qual \
126	-Wformat=2 -Winit-self \
127	-Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes \
128	-Wnested-externs \
129	-Wno-format-nonliteral -Wno-sign-compare -Wno-sign-conversion \
130	-Wno-type-limits \
131	-Wno-unused-parameter -Woverlength-strings -Wpointer-arith \
132	-Wshadow -Wstrict-prototypes -Wsuggest-attribute=const \
133	-Wsuggest-attribute=noreturn -Wsuggest-attribute=pure -Wtrampolines \
134	-Wwrite-strings
135#
136# If you want to use System V compatibility code, add
137#	-DUSG_COMPAT
138# to the end of the "CFLAGS=" line.  This arrange for "timezone" and "daylight"
139# variables to be kept up-to-date by the time conversion functions.  Neither
140# "timezone" nor "daylight" is described in X3J11's work.
141#
142# If your system has a "GMT offset" field in its "struct tm"s
143# (or if you decide to add such a field in your system's "time.h" file),
144# add the name to a define such as
145#	-DTM_GMTOFF=tm_gmtoff
146# or
147#	-DTM_GMTOFF=_tm_gmtoff
148# to the end of the "CFLAGS=" line.
149# Neither tm_gmtoff nor _tm_gmtoff is described in X3J11's work;
150# in its work, use of "tm_gmtoff" is described as non-conforming.
151# Both Linux and BSD have done the equivalent of defining TM_GMTOFF in
152# their recent releases.
153#
154# If your system has a "zone abbreviation" field in its "struct tm"s
155# (or if you decide to add such a field in your system's "time.h" file),
156# add the name to a define such as
157#	-DTM_ZONE=tm_zone
158# or
159#	-DTM_ZONE=_tm_zone
160# to the end of the "CFLAGS=" line.
161# Neither tm_zone nor _tm_zone is described in X3J11's work;
162# in its work, use of "tm_zone" is described as non-conforming.
163# Both UCB and Sun have done the equivalent of defining TM_ZONE in
164# their recent releases.
165#
166# If you want functions that were inspired by early versions of X3J11's work,
167# add
168#	-DSTD_INSPIRED
169# to the end of the "CFLAGS=" line.  This arranges for the functions
170# "tzsetwall", "offtime", "timelocal", "timegm", "timeoff",
171# "posix2time", and "time2posix" to be added to the time conversion library.
172# "tzsetwall" is like "tzset" except that it arranges for local wall clock
173# time (rather than the time specified in the TZ environment variable)
174# to be used.
175# "offtime" is like "gmtime" except that it accepts a second (long) argument
176# that gives an offset to add to the time_t when converting it.
177# "timelocal" is equivalent to "mktime".
178# "timegm" is like "timelocal" except that it turns a struct tm into
179# a time_t using UTC (rather than local time as "timelocal" does).
180# "timeoff" is like "timegm" except that it accepts a second (long) argument
181# that gives an offset to use when converting to a time_t.
182# "posix2time" and "time2posix" are described in an included manual page.
183# X3J11's work does not describe any of these functions.
184# Sun has provided "tzsetwall", "timelocal", and "timegm" in SunOS 4.0.
185# These functions may well disappear in future releases of the time
186# conversion package.
187#
188# If you want Source Code Control System ID's left out of object modules, add
189#	-DNOID
190# to the end of the "CFLAGS=" line.
191#
192# If you'll never want to handle solar-time-based time zones, add
193#	-DNOSOLAR
194# to the end of the "CFLAGS=" line
195# (and comment out the "SDATA=" line below).
196# This reduces (slightly) the run-time data-space requirements of
197# the time conversion functions; it may reduce the acceptability of your system
198# to folks in oil- and cash-rich places.
199#
200# If you want to allocate state structures in localtime, add
201#	-DALL_STATE
202# to the end of the "CFLAGS=" line.  Storage is obtained by calling malloc.
203#
204# If you want an "altzone" variable (a la System V Release 3.1), add
205#	-DALTZONE
206# to the end of the "CFLAGS=" line.
207# This variable is not described in X3J11's work.
208#
209# If you want a "gtime" function (a la MACH), add
210#	-DCMUCS
211# to the end of the "CFLAGS=" line
212# This function is not described in X3J11's work.
213#
214# NIST-PCTS:151-2, Version 1.4, (1993-12-03) is a test suite put
215# out by the National Institute of Standards and Technology
216# which claims to test C and Posix conformance.  If you want to pass PCTS, add
217#	-DPCTS
218# to the end of the "CFLAGS=" line.
219#
220# If you want strict compliance with XPG4 as of 1994-04-09, add
221#	-DXPG4_1994_04_09
222# to the end of the "CFLAGS=" line.  This causes "strftime" to always return
223# 53 as a week number (rather than 52 or 53) for those days in January that
224# before the first Monday in January when a "%V" format is used and January 1
225# falls on a Friday, Saturday, or Sunday.
226
227CFLAGS=
228
229# If you want zic's -s option used when installing, uncomment the next line
230# ZFLAGS=	-s
231
232zic=		./zic
233ZIC=		$(zic) $(ZFLAGS)
234
235# The name of a Posix-compliant `awk' on your system.
236AWK=		nawk
237
238# The path where SGML DTDs are kept.
239# The default is appropriate for Ubuntu.
240SGML_TOPDIR= /usr
241SGML_SEARCH_PATH= $(SGML_TOPDIR)/share/xml/xhtml/schema/dtd/REC-html401-19991224
242
243# The catalog file(s) to use when validating.
244SGML_CATALOG_FILES= HTML4.cat
245
246# The name, arguments and environment of a program to validate your web pages.
247# See <http://www.jclark.com/sp/> for a validator, and
248# <http://validator.w3.org/source/> for a validation library.
249VALIDATE = nsgmls
250VALIDATE_FLAGS = -s -B -wall -wno-unused-param
251VALIDATE_ENV = \
252  SGML_CATALOG_FILES=$(SGML_CATALOG_FILES) \
253  SGML_SEARCH_PATH=$(SGML_SEARCH_PATH) \
254  SP_CHARSET_FIXED=YES \
255  SP_ENCODING=UTF-8
256
257# Flags to give 'tar' when making a distribution.
258# Try to use flags appropriate for GNU tar.
259GNUTARFLAGS=	--numeric-owner --owner=0 --group=0 --mode=go+u,go-w
260TARFLAGS=	`if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; \
261		 then echo $(GNUTARFLAGS); \
262		 else :; \
263		 fi`
264
265# Flags to give 'gzip' when making a distribution.
266GZIPFLAGS=	-9n
267
268###############################################################################
269
270cc=		cc
271CC=		$(cc) -DTZDIR=\"$(TZDIR)\"
272
273TZCSRCS=	zic.c localtime.c asctime.c scheck.c ialloc.c
274TZCOBJS=	zic.o localtime.o asctime.o scheck.o ialloc.o
275TZDSRCS=	zdump.c localtime.c ialloc.c
276TZDOBJS=	zdump.o localtime.o ialloc.o
277DATESRCS=	date.c localtime.c strftime.c asctime.c
278DATEOBJS=	date.o localtime.o strftime.o asctime.o
279LIBSRCS=	localtime.c asctime.c difftime.c
280LIBOBJS=	localtime.o asctime.o difftime.o
281HEADERS=	tzfile.h private.h
282NONLIBSRCS=	zic.c zdump.c scheck.c ialloc.c
283NEWUCBSRCS=	date.c strftime.c
284SOURCES=	$(HEADERS) $(LIBSRCS) $(NONLIBSRCS) $(NEWUCBSRCS) tzselect.ksh
285MANS=		newctime.3 newstrftime.3 newtzset.3 time2posix.3 \
286			tzfile.5 tzselect.8 zic.8 zdump.8
287COMMON=		Makefile
288DOCS=		README Theory $(MANS) date.1
289PRIMARY_YDATA=	africa antarctica asia australasia \
290		europe northamerica southamerica
291YDATA=		$(PRIMARY_YDATA) pacificnew etcetera backward
292NDATA=		systemv factory
293SDATA=		solar87 solar88 solar89
294TDATA=		$(YDATA) $(NDATA) $(SDATA)
295TABDATA=	iso3166.tab zone.tab
296DATA=		$(YDATA) $(NDATA) $(SDATA) $(TABDATA) leapseconds yearistype.sh
297WEB_PAGES=	tz-art.htm tz-link.htm
298MISC=		usno1988 usno1989 usno1989a usno1995 usno1997 usno1998 \
299			$(WEB_PAGES) checktab.awk workman.sh \
300			zoneinfo2tdf.pl
301ENCHILADA=	$(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC)
302
303# And for the benefit of csh users on systems that assume the user
304# shell should be used to handle commands in Makefiles. . .
305
306SHELL=		/bin/sh
307
308all:		tzselect zic zdump $(LIBOBJS)
309
310ALL:		all date
311
312install:	all $(DATA) $(REDO) $(TZLIB) $(MANS) $(TABDATA)
313		$(ZIC) -y $(YEARISTYPE) \
314			-d $(TZDIR) -l $(LOCALTIME) -p $(POSIXRULES)
315		-rm -f $(TZDIR)/iso3166.tab $(TZDIR)/zone.tab
316		cp iso3166.tab zone.tab $(TZDIR)/.
317		-mkdir $(TOPDIR) $(ETCDIR)
318		cp tzselect zic zdump $(ETCDIR)/.
319		-mkdir $(TOPDIR) $(MANDIR) \
320			$(MANDIR)/man3 $(MANDIR)/man5 $(MANDIR)/man8
321		-rm -f $(MANDIR)/man3/newctime.3 \
322			$(MANDIR)/man3/newtzset.3 \
323			$(MANDIR)/man5/tzfile.5 \
324			$(MANDIR)/man8/tzselect.8 \
325			$(MANDIR)/man8/zdump.8 \
326			$(MANDIR)/man8/zic.8
327		cp newctime.3 newtzset.3 $(MANDIR)/man3/.
328		cp tzfile.5 $(MANDIR)/man5/.
329		cp tzselect.8 zdump.8 zic.8 $(MANDIR)/man8/.
330
331INSTALL:	ALL install date.1
332		-mkdir $(TOPDIR) $(BINDIR)
333		cp date $(BINDIR)/.
334		-mkdir $(TOPDIR) $(MANDIR) $(MANDIR)/man1
335		-rm -f $(MANDIR)/man1/date.1
336		cp date.1 $(MANDIR)/man1/.
337
338version.h:
339		echo >$@ \
340		  'static char const TZVERSION[]="tz$(VERSION)";'
341
342zdump:		$(TZDOBJS)
343		$(CC) $(CFLAGS) $(LFLAGS) $(TZDOBJS) $(LDLIBS) -o $@
344
345zic:		$(TZCOBJS) yearistype
346		$(CC) $(CFLAGS) $(LFLAGS) $(TZCOBJS) $(LDLIBS) -o $@
347
348yearistype:	yearistype.sh
349		cp yearistype.sh yearistype
350		chmod +x yearistype
351
352posix_only:	zic $(TDATA)
353		$(ZIC) -y $(YEARISTYPE) -d $(TZDIR) -L /dev/null $(TDATA)
354
355right_only:	zic leapseconds $(TDATA)
356		$(ZIC) -y $(YEARISTYPE) -d $(TZDIR) -L leapseconds $(TDATA)
357
358# In earlier versions of this makefile, the other two directories were
359# subdirectories of $(TZDIR).  However, this led to configuration errors.
360# For example, with posix_right under the earlier scheme,
361# TZ='right/Australia/Adelaide' got you localtime with leap seconds,
362# but gmtime without leap seconds, which led to problems with applications
363# like sendmail that subtract gmtime from localtime.
364# Therefore, the other two directories are now siblings of $(TZDIR).
365# You must replace all of $(TZDIR) to switch from not using leap seconds
366# to using them, or vice versa.
367other_two:	zic leapseconds $(TDATA)
368		$(ZIC) -y $(YEARISTYPE) -d $(TZDIR)-posix -L /dev/null $(TDATA)
369		$(ZIC) -y $(YEARISTYPE) \
370			-d $(TZDIR)-leaps -L leapseconds $(TDATA)
371
372posix_right:	posix_only other_two
373
374right_posix:	right_only other_two
375
376zones:		$(REDO)
377
378$(TZLIB):	$(LIBOBJS)
379		-mkdir $(TOPDIR) $(LIBDIR)
380		ar ru $@ $(LIBOBJS)
381		if [ -x /usr/ucb/ranlib -o -x /usr/bin/ranlib ] ; \
382			then ranlib $@ ; fi
383
384date:		$(DATEOBJS)
385		$(CC) $(CFLAGS) date.o localtime.o asctime.o strftime.o \
386			$(LDLIBS) -lc -o $@
387
388tzselect:	tzselect.ksh
389		sed \
390			-e 's|AWK=[^}]*|AWK=$(AWK)|g' \
391			-e 's|TZDIR=[^}]*|TZDIR=$(TZDIR)|' \
392			-e 's|\(TZVERSION\)=.*|\1=tz$(VERSION)|' \
393			<$? >$@
394		chmod +x $@
395
396check:		check_tables check_web
397
398check_tables:	checktab.awk $(PRIMARY_YDATA)
399		$(AWK) -f checktab.awk $(PRIMARY_YDATA)
400
401check_web:	$(WEB_PAGES)
402		$(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) $(WEB_PAGES)
403
404clean:
405		rm -f core *.o *.out \
406		  date tzselect version.h zdump zic yearistype
407
408maintainer-clean: clean
409		@echo 'This command is intended for maintainers to use; it'
410		@echo 'deletes files that may need special tools to rebuild.'
411		rm -f *.[1-8].txt tzcode*.tar.gz tzdata*.tar.gz
412
413names:
414		@echo $(ENCHILADA)
415
416# Set the time stamps to those of the git repository, if available,
417# and if the files have not changed since then.
418# This uses GNU 'touch' syntax 'touch -d@N FILE',
419# where N is the number of seconds since 1970.
420# If git or GNU 'touch' is absent, do nothing.
421set-timestamps:
422		-TZ=UTC0 && export TZ && files=`git ls-files` && \
423		touch -d @1 test.out && rm -f test.out && \
424		for file in $$files; do \
425		  test -z "`git diff --name-only $$file`" || continue; \
426		  cmd="touch -d @`git log -1 --format='format:%ct' $$file \
427			` $$file" && \
428		  echo "$$cmd" && \
429		  $$cmd || exit; \
430		done
431
432# The zics below ensure that each data file can stand on its own.
433# We also do an all-files run to catch links to links.
434
435public:		$(ENCHILADA) set-timestamps
436		make maintainer-clean
437		make "CFLAGS=$(GCC_DEBUG_FLAGS)"
438		mkdir -m go-rwx /tmp/,tzpublic
439		-for i in $(TDATA) ; do zic -v -d /tmp/,tzpublic $$i 2>&1 | grep -v "starting year" ; done
440		for i in $(TDATA) ; do zic -d /tmp/,tzpublic $$i || exit; done
441		zic -v -d /tmp/,tzpublic $(TDATA) || exit
442		rm -f -r /tmp/,tzpublic
443		for i in *.[1-8] ; do \
444		  LC_ALL=C sh workman.sh $$i > $$i.txt && \
445		  touch -r $$i $$i.txt || exit; \
446		done
447		$(AWK) -f checktab.awk $(PRIMARY_YDATA)
448		LC_ALL=C && export LC_ALL && \
449		tar $(TARFLAGS) -cf - \
450		    $(COMMON) $(DOCS) $(SOURCES) $(MISC) *.[1-8].txt | \
451		  gzip $(GZIPFLAGS) > tzcode$(VERSION).tar.gz
452		LC_ALL=C && export LC_ALL && \
453		tar $(TARFLAGS) -cf - $(COMMON) $(DATA) | \
454		  gzip $(GZIPFLAGS) > tzdata$(VERSION).tar.gz
455
456typecheck:
457		make clean
458		for i in "long long" unsigned double; \
459		do \
460			make CFLAGS="-DTYPECHECK -D__time_t_defined -D_TIME_T \"-Dtime_t=$$i\"" ; \
461			./zdump -v Europe/Rome ; \
462			make clean ; \
463		done
464
465zonenames:	$(TDATA)
466		@$(AWK) '/^Zone/ { print $$2 } /^Link/ { print $$3 }' $(TDATA)
467
468asctime.o:	private.h tzfile.h
469date.o:		private.h
470difftime.o:	private.h
471ialloc.o:	private.h
472localtime.o:	private.h tzfile.h
473scheck.o:	private.h
474strftime.o:	tzfile.h
475zdump.o:	version.h
476zic.o:		private.h tzfile.h version.h
477
478.KEEP_STATE:
479