PACKAGE=	tzcode
VERSION=	unknown
BUGEMAIL=	tz@iana.org
LOCALTIME=	GMT
POSIXRULES=	America/New_York
TOPDIR=		/usr/local
TZDIR_BASENAME=	zoneinfo
TZDIR=		$(TOPDIR)/etc/$(TZDIR_BASENAME)
TIME_T_ALTERNATIVES= int64_t int32_t uint32_t uint64_t
ETCDIR=		$(TOPDIR)/etc
BINDIR=		$(TOPDIR)/bin
MANDIR=		$(TOPDIR)/man
LIBDIR=		$(TOPDIR)/lib
REDO=		posix_right
PACKRATDATA=
YEARISTYPE=	./yearistype
LDLIBS=
GCC_DEBUG_FLAGS = -Dlint -g3 -O3 -fno-common -fstrict-aliasing \
	-Wall -Wextra \
	-Wbad-function-cast -Wcast-align -Wdate-time \
	-Wdeclaration-after-statement \
	-Wdouble-promotion \
	-Wformat=2 -Winit-self -Wjump-misses-init \
	-Wlogical-op -Wmissing-prototypes -Wnested-externs \
	-Wold-style-definition -Woverlength-strings -Wpointer-arith \
	-Wshadow -Wstrict-prototypes -Wsuggest-attribute=const \
	-Wsuggest-attribute=format -Wsuggest-attribute=noreturn \
	-Wsuggest-attribute=pure -Wtrampolines \
	-Wundef -Wunused -Wwrite-strings \
	-Wno-address -Wno-format-nonliteral -Wno-sign-compare \
	-Wno-type-limits -Wno-unused-parameter
CFLAGS=
LDFLAGS=	$(LFLAGS)
LEAPSECONDS=
zic=		./zic
ZIC=		$(zic) $(ZFLAGS)
ZFLAGS=
ZIC_INSTALL=	$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR) $(LEAPSECONDS)
AWK=		awk
KSHELL=		/bin/bash
SGML_TOPDIR= /usr
SGML_DTDDIR= $(SGML_TOPDIR)/share/xml/w3c-sgml-lib/schema/dtd
SGML_SEARCH_PATH= $(SGML_DTDDIR)/REC-html401-19991224
SGML_CATALOG_FILES= \
  $(SGML_TOPDIR)/share/doc/w3-recs/html/www.w3.org/TR/1999/REC-html401-19991224/HTML4.cat:$(SGML_TOPDIR)/share/sgml/html/4.01/HTML4.cat
VALIDATE = nsgmls
VALIDATE_FLAGS = -s -B -wall -wno-unused-param
VALIDATE_ENV = \
  SGML_CATALOG_FILES=$(SGML_CATALOG_FILES) \
  SGML_SEARCH_PATH=$(SGML_SEARCH_PATH) \
  SP_CHARSET_FIXED=YES \
  SP_ENCODING=UTF-8
CHECK_TIME_T_ALTERNATIVES = check_time_t_alternatives
TAB_CHAR=	'	'
SAFE_CHARSET1=	$(TAB_CHAR)' !\"'$$sharp'$$%&'\''()*+,./0123456789:;<=>?@'
SAFE_CHARSET2=	'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_`'
SAFE_CHARSET3=	'abcdefghijklmnopqrstuvwxyz{|}~'
SAFE_CHARSET=	$(SAFE_CHARSET1)$(SAFE_CHARSET2)$(SAFE_CHARSET3)
SAFE_CHAR=	'[]'$(SAFE_CHARSET)'-]'
OK_CHAR=	'[][:alpha:]'$(SAFE_CHARSET)'-]'
SAFE_LINE=	'^'$(SAFE_CHAR)'*$$'
SAFE_SHARP_LINE='^'$(SAFE_CHAR)'*('$$sharp$(OK_CHAR)'*)?$$'
OK_LINE=	'^'$(OK_CHAR)'*$$'
GNUTARFLAGS= --numeric-owner --owner=0 --group=0 --mode=go+u,go-w --sort=name
TARFLAGS=	`if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; \
		 then echo $(GNUTARFLAGS); \
		 else :; \
		 fi`
GZIPFLAGS=	-9n
cc=		cc
CC=		$(cc) -DTZDIR=\"$(TZDIR)\"
AR=		ar
RANLIB=		:
TZCOBJS=	zic.o
TZDOBJS=	zdump.o localtime.o asctime.o
DATEOBJS=	date.o localtime.o strftime.o asctime.o
LIBSRCS=	localtime.c asctime.c difftime.c
LIBOBJS=	localtime.o asctime.o difftime.o
HEADERS=	tzfile.h private.h
NONLIBSRCS=	zic.c zdump.c
NEWUCBSRCS=	date.c strftime.c
SOURCES=	$(HEADERS) $(LIBSRCS) $(NONLIBSRCS) $(NEWUCBSRCS) \
			tzselect.ksh workman.sh
MANS=		newctime.3 newstrftime.3 newtzset.3 time2posix.3 \
			tzfile.5 tzselect.8 zic.8 zdump.8
MANTXTS=	newctime.3.txt newstrftime.3.txt newtzset.3.txt \
			time2posix.3.txt \
			tzfile.5.txt tzselect.8.txt zic.8.txt zdump.8.txt \
			date.1.txt
COMMON=		CONTRIBUTING LICENSE Makefile NEWS README Theory version
WEB_PAGES=	tz-art.htm tz-how-to.html tz-link.htm
DOCS=		$(MANS) date.1 $(MANTXTS) $(WEB_PAGES)
PRIMARY_YDATA=	africa antarctica asia australasia \
		europe northamerica southamerica
YDATA=		$(PRIMARY_YDATA) pacificnew etcetera backward
NDATA=		systemv factory
TDATA=		$(YDATA) $(NDATA)
ZONETABLES=	zone1970.tab zone.tab
TABDATA=	iso3166.tab leapseconds $(ZONETABLES)
LEAP_DEPS=	leapseconds.awk leap-seconds.list
DATA=		$(YDATA) $(NDATA) backzone $(TABDATA) \
			leap-seconds.list yearistype.sh
AWK_SCRIPTS=	checklinks.awk checktab.awk leapseconds.awk
MISC=		$(AWK_SCRIPTS) zoneinfo2tdf.pl
TZS_YEAR=	2050
TZS=		to$(TZS_YEAR).tzs
TZS_NEW=	to$(TZS_YEAR)new.tzs
TZS_DEPS=	$(PRIMARY_YDATA) asctime.c localtime.c \
			private.h tzfile.h zdump.c zic.c
ENCHILADA=	$(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC) $(TZS)
VERSION_DEPS= \
		CONTRIBUTING LICENSE Makefile NEWS README Theory \
		africa antarctica asctime.c asia australasia \
		backward backzone \
		checklinks.awk checktab.awk \
		date.1 date.c difftime.c \
		etcetera europe factory iso3166.tab \
		leap-seconds.list leapseconds.awk localtime.c \
		newctime.3 newstrftime.3 newtzset.3 northamerica \
		pacificnew private.h \
		southamerica strftime.c systemv \
		time2posix.3 tz-art.htm tz-how-to.html tz-link.htm \
		tzfile.5 tzfile.h tzselect.8 tzselect.ksh \
		workman.sh yearistype.sh \
		zdump.8 zdump.c zic.8 zic.c \
		zone.tab zone1970.tab zoneinfo2tdf.pl
SHELL=		/bin/sh
all:		tzselect yearistype zic zdump libtz.a $(TABDATA)
ALL:		all date $(ENCHILADA)
install:	all $(DATA) $(REDO) $(MANS)
		mkdir -p $(DESTDIR)$(ETCDIR) $(DESTDIR)$(TZDIR) \
			$(DESTDIR)$(LIBDIR) \
			$(DESTDIR)$(MANDIR)/man3 $(DESTDIR)$(MANDIR)/man5 \
			$(DESTDIR)$(MANDIR)/man8
		$(ZIC_INSTALL) -l $(LOCALTIME) -p $(POSIXRULES)
		cp -f iso3166.tab $(ZONETABLES) $(DESTDIR)$(TZDIR)/.
		cp tzselect zic zdump $(DESTDIR)$(ETCDIR)/.
		cp libtz.a $(DESTDIR)$(LIBDIR)/.
		$(RANLIB) $(DESTDIR)$(LIBDIR)/libtz.a
		cp -f newctime.3 newtzset.3 $(DESTDIR)$(MANDIR)/man3/.
		cp -f tzfile.5 $(DESTDIR)$(MANDIR)/man5/.
		cp -f tzselect.8 zdump.8 zic.8 $(DESTDIR)$(MANDIR)/man8/.
INSTALL:	ALL install date.1
		mkdir -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR)/man1
		cp date $(DESTDIR)$(BINDIR)/.
		cp -f date.1 $(DESTDIR)$(MANDIR)/man1/.
version:	$(VERSION_DEPS)
		{ (type git) >/dev/null 2>&1 && \
		  V=`git describe --match '[0-9][0-9][0-9][0-9][a-z]*' \
				--abbrev=7 --dirty` || \
		  V=$(VERSION); } && \
		printf '%s\n' "$$V" >$@.out
		mv $@.out $@
version.h:	version
		VERSION=`cat version` && printf '%s\n' \
		  'static char const PKGVERSION[]="($(PACKAGE)) ";' \
		  "static char const TZVERSION[]=\"$$VERSION\";" \
		  'static char const REPORT_BUGS_TO[]="$(BUGEMAIL)";' \
		  >$@.out
		mv $@.out $@
zdump:		$(TZDOBJS)
		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZDOBJS) $(LDLIBS)
zic:		$(TZCOBJS)
		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS)
yearistype:	yearistype.sh
		cp yearistype.sh yearistype
		chmod +x yearistype
leapseconds:	$(LEAP_DEPS)
		$(AWK) -f leapseconds.awk leap-seconds.list >$@.out
		mv $@.out $@
INSTALLARGS = \
 DESTDIR=$(DESTDIR) \
 LEAPSECONDS='$(LEAPSECONDS)' \
 PACKRATDATA='$(PACKRATDATA)' \
 TZDIR=$(TZDIR) \
 YEARISTYPE=$(YEARISTYPE) \
 ZIC='$(ZIC)'
install_data:	zic leapseconds yearistype $(PACKRATDATA) $(TDATA)
		$(ZIC_INSTALL) $(TDATA)
		$(AWK) '/^Rule/' $(TDATA) | $(ZIC_INSTALL) - $(PACKRATDATA)
posix_only:
		$(MAKE) $(INSTALLARGS) LEAPSECONDS= install_data
right_only:
		$(MAKE) $(INSTALLARGS) LEAPSECONDS='-L leapseconds' \
			install_data
right_posix:	right_only
		rm -fr $(DESTDIR)$(TZDIR)-leaps
		ln -s $(TZDIR_BASENAME) $(DESTDIR)$(TZDIR)-leaps || \
		  $(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-leaps right_only
		$(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-posix posix_only
posix_right:	posix_only
		rm -fr $(DESTDIR)$(TZDIR)-posix
		ln -s $(TZDIR_BASENAME) $(DESTDIR)$(TZDIR)-posix || \
		  $(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-posix posix_only
		$(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-leaps right_only
posix_packrat:
		$(MAKE) $(INSTALLARGS) PACKRATDATA=backzone posix_only
zones:		$(REDO)
$(TZS_NEW):	$(TDATA) zdump zic
		mkdir -p tzs.dir
		$(zic) -d tzs.dir $(TDATA)
		$(AWK) '/^Link/{print $$1 "\t" $$2 "\t" $$3}' \
		   $(TDATA) | LC_ALL=C sort >$@.out
		wd=`pwd` && \
		zones=`$(AWK) -v wd="$$wd" \
				'/^Zone/{print wd "/tzs.dir/" $$2}' $(TDATA) \
			 | LC_ALL=C sort` && \
		./zdump -i -c $(TZS_YEAR) $$zones >>$@.out
		sed 's,^TZ=".*tzs\.dir/,TZ=",' $@.out >$@.sed.out
		rm -fr tzs.dir $@.out
		mv $@.sed.out $@
$(TZS):
		$(MAKE) force_tzs
force_tzs:	$(TZS_NEW)
		cp $(TZS_NEW) $(TZS)
libtz.a:	$(LIBOBJS)
		rm -f $@
		$(AR) -rc $@ $(LIBOBJS)
		$(RANLIB) $@
date:		$(DATEOBJS)
		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
tzselect:	tzselect.ksh version
		VERSION=`cat version` && sed \
			-e 's|#!/bin/bash|#!$(KSHELL)|g' \
			-e 's|AWK=[^}]*|AWK=$(AWK)|g' \
			-e 's|\(PKGVERSION\)=.*|\1='\''($(PACKAGE)) '\''|' \
			-e 's|\(REPORT_BUGS_TO\)=.*|\1=$(BUGEMAIL)|' \
			-e 's|TZDIR=[^}]*|TZDIR=$(TZDIR)|' \
			-e 's|\(TZVERSION\)=.*|\1='"$$VERSION"'|' \
			<$@.ksh >$@.out
		chmod +x $@.out
		mv $@.out $@
check:		check_character_set check_white_space check_links check_sorted \
		  check_tables check_tzs check_web
check_character_set: $(ENCHILADA)
		LC_ALL=en_US.utf8 && export LC_ALL && \
		sharp='#' && \
		! grep -Env $(SAFE_LINE) $(MANS) date.1 $(MANTXTS) \
			$(MISC) $(SOURCES) $(WEB_PAGES) \
			CONTRIBUTING LICENSE Makefile README version && \
		! grep -Env $(SAFE_SHARP_LINE) $(TDATA) backzone \
			leapseconds yearistype.sh zone.tab && \
		! grep -Env $(OK_LINE) $(ENCHILADA)
check_white_space: $(ENCHILADA)
		patfmt=' \t|[\f\r\v]' && pat=`printf "$$patfmt\\n"` && \
		! grep -En "$$pat" $(ENCHILADA)
		! grep -n '[[:space:]]$$' $(ENCHILADA)
CHECK_CC_LIST = { n = split($$1,a,/,/); for (i=2; i<=n; i++) print a[1], a[i]; }
check_sorted: backward backzone iso3166.tab zone.tab zone1970.tab
		$(AWK) '/^Link/ {print $$3}' backward | LC_ALL=C sort -cu
		$(AWK) '/^Zone/ {print $$2}' backzone | LC_ALL=C sort -cu
		$(AWK) '/^[^#]/ {print $$1}' iso3166.tab | LC_ALL=C sort -cu
		$(AWK) '/^[^#]/ {print $$1}' zone.tab | LC_ALL=C sort -c
		$(AWK) '/^[^#]/ {print substr($$0, 1, 2)}' zone1970.tab | \
		  LC_ALL=C sort -c
		$(AWK) '/^[^#]/ $(CHECK_CC_LIST)' zone1970.tab | \
		  LC_ALL=C sort -cu
check_links:	checklinks.awk $(TDATA)
		$(AWK) -f checklinks.awk $(TDATA)
check_tables:	checktab.awk $(PRIMARY_YDATA) $(ZONETABLES)
		for tab in $(ZONETABLES); do \
		  $(AWK) -f checktab.awk -v zone_table=$$tab $(PRIMARY_YDATA) \
		    || exit; \
		done
check_tzs:	$(TZS) $(TZS_NEW)
		diff -u $(TZS) $(TZS_NEW)
check_web:	$(WEB_PAGES)
		$(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) $(WEB_PAGES)
clean_misc:
		rm -f core *.o *.out \
		  date tzselect version.h zdump zic yearistype libtz.a
clean:		clean_misc
		rm -fr *.dir tzdb-*/ $(TZS_NEW)
maintainer-clean: clean
		@echo 'This command is intended for maintainers to use; it'
		@echo 'deletes files that may need special tools to rebuild.'
		rm -f leapseconds version $(MANTXTS) $(TZS) *.asc *.tar.*
names:
		@echo $(ENCHILADA)
public:		check check_public $(CHECK_TIME_T_ALTERNATIVES) \
		tarballs signatures
date.1.txt:	date.1
newctime.3.txt:	newctime.3
newstrftime.3.txt: newstrftime.3
newtzset.3.txt:	newtzset.3
time2posix.3.txt: time2posix.3
tzfile.5.txt:	tzfile.5
tzselect.8.txt:	tzselect.8
zdump.8.txt:	zdump.8
zic.8.txt:	zic.8
$(MANTXTS):	workman.sh
		LC_ALL=C sh workman.sh `expr $@ : '\(.*\)\.txt$$'` >$@.out
		mv $@.out $@
set-timestamps.out: $(ENCHILADA)
		rm -f $@
		if (type git) >/dev/null 2>&1 && \
		   files=`git ls-files $(ENCHILADA)` && \
		   touch -md @1 test.out; then \
		  rm -f test.out && \
		  for file in $$files; do \
		    if git diff --quiet $$file; then \
		      time=`git log -1 --format='tformat:%ct' $$file` && \
		      touch -cmd @$$time $$file; \
		    else \
		      echo >&2 "$$file: warning: does not match repository"; \
		    fi || exit; \
		  done; \
		fi
		touch -cmr `ls -t $(LEAP_DEPS) | sed 1q` leapseconds
		for file in `ls $(MANTXTS) | sed 's/\.txt$$//'`; do \
		  touch -cmr `ls -t $$file workman.sh | sed 1q` $$file.txt || \
		    exit; \
		done
		touch -cmr `ls -t $(TZS_DEPS) | sed 1q` $(TZS)
		touch -cmr `ls -t $(VERSION_DEPS) | sed 1q` version
		touch $@
check_public:
		$(MAKE) maintainer-clean
		$(MAKE) "CFLAGS=$(GCC_DEBUG_FLAGS)" ALL
		mkdir -p public.dir
		for i in $(TDATA) ; do \
		  $(zic) -v -d public.dir $$i 2>&1 || exit; \
		done
		$(zic) -v -d public.dir $(TDATA)
		rm -fr public.dir
check_time_t_alternatives:
		if diff -q Makefile Makefile 2>/dev/null; then \
		  quiet_option='-q'; \
		else \
		  quiet_option=''; \
		fi && \
		wd=`pwd` && \
		zones=`$(AWK) '/^[^#]/ { print $$3 }' <zone1970.tab` && \
		for type in $(TIME_T_ALTERNATIVES); do \
		  mkdir -p time_t.dir/$$type && \
		  $(MAKE) clean_misc && \
		  $(MAKE) TOPDIR="$$wd/time_t.dir/$$type" \
		    CFLAGS='$(CFLAGS) -Dtime_tz='"'$$type'" \
		    REDO='$(REDO)' \
		    install && \
		  diff $$quiet_option -r \
		    time_t.dir/int64_t/etc/zoneinfo \
		    time_t.dir/$$type/etc/zoneinfo && \
		  case $$type in \
		  int32_t) range=-2147483648,2147483647;; \
		  uint32_t) range=0,4294967296;; \
		  int64_t) continue;; \
		  *u*) range=0,10000000000;; \
		  *) range=-10000000000,10000000000;; \
		  esac && \
		  echo checking $$type zones ... && \
		  time_t.dir/int64_t/etc/zdump -V -t $$range $$zones \
		      >time_t.dir/int64_t.out && \
		  time_t.dir/$$type/etc/zdump -V -t $$range $$zones \
		      >time_t.dir/$$type.out && \
		  diff -u time_t.dir/int64_t.out time_t.dir/$$type.out \
		    || exit; \
		done
		rm -fr time_t.dir
tarballs traditional_tarballs signatures traditional_signatures: version
		VERSION=`cat version` && \
		$(MAKE) VERSION="$$VERSION" $@_version
tarballs_version: traditional_tarballs_version tzdb-$(VERSION).tar.lz
traditional_tarballs_version: \
  tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz
signatures_version: traditional_signatures_version tzdb-$(VERSION).tar.lz.asc
traditional_signatures_version: \
  tzcode$(VERSION).tar.gz.asc tzdata$(VERSION).tar.gz.asc \
tzcode$(VERSION).tar.gz: set-timestamps.out
		LC_ALL=C && export LC_ALL && \
		tar $(TARFLAGS) -cf - \
		    $(COMMON) $(DOCS) $(SOURCES) | \
		  gzip $(GZIPFLAGS) >$@.out
		mv $@.out $@
tzdata$(VERSION).tar.gz: set-timestamps.out
		LC_ALL=C && export LC_ALL && \
		tar $(TARFLAGS) -cf - $(COMMON) $(DATA) $(MISC) | \
		  gzip $(GZIPFLAGS) >$@.out
		mv $@.out $@
tzdb-$(VERSION).tar.lz: set-timestamps.out
		rm -fr tzdb-$(VERSION)
		mkdir tzdb-$(VERSION)
		ln $(ENCHILADA) tzdb-$(VERSION)
		touch -cmr `ls -t tzdb-$(VERSION)/* | sed 1q` tzdb-$(VERSION)
		LC_ALL=C && export LC_ALL && \
		tar $(TARFLAGS) -cf - tzdb-$(VERSION) | lzip -9 >$@.out
		mv $@.out $@
tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz
		gpg --armor --detach-sign $?
tzdata$(VERSION).tar.gz.asc: tzdata$(VERSION).tar.gz
		gpg --armor --detach-sign $?
tzdb-$(VERSION).tar.lz.asc: tzdb-$(VERSION).tar.lz
		gpg --armor --detach-sign $?
typecheck:
		$(MAKE) clean
		for i in "long long" unsigned; \
		do \
			$(MAKE) CFLAGS="-DTYPECHECK -D__time_t_defined -D_TIME_T \"-Dtime_t=$$i\"" ; \
			./zdump -v Europe/Rome ; \
			$(MAKE) clean ; \
		done
zonenames:	$(TDATA)
		@$(AWK) '/^Zone/ { print $$2 } /^Link/ { print $$3 }' $(TDATA)
asctime.o:	private.h tzfile.h
date.o:		private.h
difftime.o:	private.h
localtime.o:	private.h tzfile.h
strftime.o:	private.h tzfile.h
zdump.o:	version.h
zic.o:		private.h tzfile.h version.h
.KEEP_STATE:
.PHONY: ALL INSTALL all
.PHONY: check check_character_set check_links
.PHONY: check_public check_sorted check_tables
.PHONY: check_time_t_alternatives check_tzs check_web check_white_space
.PHONY: clean clean_misc force_tzs
.PHONY: install install_data maintainer-clean names
.PHONY: posix_only posix_packrat posix_right
.PHONY: public right_only right_posix signatures signatures_version
.PHONY: tarballs tarballs_version typecheck
.PHONY: zonenames zones
