[tz] [PROPOSED PATCH] Port better to Solaris 10

Paul Eggert eggert at cs.ucla.edu
Tue Oct 4 20:50:58 UTC 2016


Solaris 10 /bin/sh does not handle exit status properly when
called from 'make', and does not support the $(...) syntax.
Also, simplify by removing comments about Solaris 9 and earlier,
which are no longer maintained.
* Makefile: Update comments for current operating system status.
(version, set-timestamps.out):
Don’t fail on Solaris 10 merely because git is not installed.
(version, version.h, $(TZS_NEW), tzselect, check_white_space)
(set-timestamps.out, check_time_t_alternatives, tarballs)
(traditional_tarballs, signatures, traditional_signatures)
(tzdb-$(VERSION).tar.lz):
Use `foo`, not $(foo), for Solaris 10 /bin/sh.
Check for command failure the old-fashioned way.
* private.h, zdump.c (HAVE_STDINT_H):
Default to 1 if limits.h defines INTMAX_MAX, for Solaris 10.
* strftime.c (_fmt): Rework to avoid diagnostic about unreachable
code from Sun C 5.9.  Remove unwanted test for tm_isdst in the
case where TM_GMTOFF is defined.
---
 Makefile   | 47 +++++++++++++++++++++++++++--------------------
 private.h  | 12 ++++++------
 strftime.c | 24 +++++++++++++-----------
 zdump.c    |  2 +-
 4 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/Makefile b/Makefile
index abeacfa..4781633 100644
--- a/Makefile
+++ b/Makefile
@@ -101,7 +101,6 @@ PACKRATDATA=
 YEARISTYPE=	./yearistype
 
 # Non-default libraries needed to link.
-# Add -lintl if you want to use 'gettext' on Solaris.
 LDLIBS=
 
 # Add the following to the end of the "CFLAGS=" line as needed.
@@ -109,9 +108,10 @@ LDLIBS=
 #  -DHAVE_DECL_ASCTIME_R=0 if <time.h> does not declare asctime_r
 #  -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
 #  -DHAVE_DOS_FILE_NAMES if file names have drive specifiers etc. (MS-DOS)
-#  -DHAVE_GETTEXT=1 if 'gettext' works (GNU, Linux, Solaris); also see LDLIBS
+#  -DHAVE_GETTEXT=1 if 'gettext' works (e.g., GNU/Linux, FreeBSD, Solaris)
 #  -DHAVE_INCOMPATIBLE_CTIME_R=1 if your system's time.h declares
-#	ctime_r and asctime_r incompatibly with the POSIX standard (Solaris 8).
+#	ctime_r and asctime_r incompatibly with the POSIX standard
+#	(Solaris when _POSIX_PTHREAD_SEMANTICS is not defined).
 #  -DHAVE_INTTYPES_H=1 if you have a pre-C99 compiler with "inttypes.h"
 #  -DHAVE_LINK=0 if your system lacks a link function
 #  -DHAVE_LOCALTIME_R=0 if your system lacks a localtime_r function
@@ -434,16 +434,18 @@ INSTALL:	ALL install date.1
 		cp -f date.1 $(DESTDIR)$(MANDIR)/man1/.
 
 version:	$(VERSION_DEPS)
-		{ V=$$(git describe --match '[0-9][0-9][0-9][0-9][a-z]*' \
-				--abbrev=7 --dirty) || \
+		{ (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" >$@
 
 version.h:	version
-		(echo 'static char const PKGVERSION[]="($(PACKAGE)) ";' && \
-		 printf 'static char const TZVERSION[]="%s";\n' \
-		   "$$(cat version)" && \
-		 echo 'static char const REPORT_BUGS_TO[]="$(BUGEMAIL)";') >$@
+		VERSION=`cat version` && printf '%s\n' \
+		  'static char const PKGVERSION[]="($(PACKAGE)) ";' \
+		  "static char const TZVERSION[]=\"$$VERSION\";" \
+		  'static char const REPORT_BUGS_TO[]="$(BUGEMAIL)";' \
+		  >$@
 
 zdump:		$(TZDOBJS)
 		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZDOBJS) $(LDLIBS)
@@ -514,9 +516,10 @@ $(TZS_NEW):	$(TDATA) zdump zic
 		$(zic) -d tzs.dir $(TDATA)
 		$(AWK) '/^Link/{print $$1 "\t" $$2 "\t" $$3}' \
 		   $(TDATA) | LC_ALL=C sort >$@.out
-		zones=$$($(AWK) -v wd="$$(pwd)" \
+		wd=`pwd` && \
+		zones=`$(AWK) -v wd="$$wd" \
 				'/^Zone/{print wd "/tzs.dir/" $$2}' $(TDATA) \
-			 | LC_ALL=C sort) && \
+			 | LC_ALL=C sort` && \
 		./zdump -i -c $(TZS_YEAR) $$zones >>$@.out
 		sed 's,^TZ=".*tzs\.dir/,TZ=",' $@.out >$@
 		rm -fr tzs.dir $@.out
@@ -538,13 +541,13 @@ date:		$(DATEOBJS)
 		$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
 
 tzselect:	tzselect.ksh version
-		sed \
+		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='"$$(cat version)"'|' \
+			-e 's|\(TZVERSION\)=.*|\1='"$$VERSION"'|' \
 			<$@.ksh >$@
 		chmod +x $@
 
@@ -562,7 +565,8 @@ check_character_set: $(ENCHILADA)
 		! grep -Env $(OK_LINE) $(ENCHILADA)
 
 check_white_space: $(ENCHILADA)
-		! grep -En ' '$(TAB_CHAR)"|$$(printf '[\f\r\v]')" $(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]; }
@@ -631,7 +635,8 @@ $(MANTXTS):	workman.sh
 # to be the maximum of the files it depends on.
 set-timestamps.out: $(ENCHILADA)
 		rm -f $@
-		if files=`git ls-files $(ENCHILADA)` && \
+		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 \
@@ -648,8 +653,8 @@ set-timestamps.out: $(ENCHILADA)
 		  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 -cmr `ls -t $(TZS_DEPS) | sed 1q` $(TZS)
+		touch -cmr `ls -t $(VERSION_DEPS) | sed 1q` version
 		touch $@
 
 # The zics below ensure that each data file can stand on its own.
@@ -673,11 +678,12 @@ check_time_t_alternatives:
 		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=$$(pwd)/time_t.dir/$$type \
+		  $(MAKE) TOPDIR="$$wd/time_t.dir/$$type" \
 		    CFLAGS='$(CFLAGS) -Dtime_tz='"'$$type'" \
 		    REDO='$(REDO)' \
 		    install && \
@@ -702,7 +708,8 @@ check_time_t_alternatives:
 		rm -fr time_t.dir
 
 tarballs traditional_tarballs signatures traditional_signatures: version
-		$(MAKE) VERSION="$$(cat version)" $@_version
+		VERSION=`cat version` && \
+		$(MAKE) VERSION="$$VERSION" $@_version
 
 tarballs_version: traditional_tarballs_version tzdb-$(VERSION).tar.lz
 traditional_tarballs_version: \
@@ -726,7 +733,7 @@ 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)
+		touch -cmr `ls -t tzdb-$(VERSION)/* | sed 1q` tzdb-$(VERSION)
 		LC_ALL=C && export LC_ALL && \
 		tar $(TARFLAGS) -cf - tzdb-$(VERSION) | lzip -9 > $@
 
diff --git a/private.h b/private.h
index daad297..d6a6c5d 100644
--- a/private.h
+++ b/private.h
@@ -78,9 +78,9 @@
 
 /* Enable tm_gmtoff and tm_zone on GNUish systems.  */
 #define _GNU_SOURCE 1
-/* Fix asctime_r on Solaris 10.  */
+/* Fix asctime_r on Solaris 11.  */
 #define _POSIX_PTHREAD_SEMANTICS 1
-/* Enable strtoimax on Solaris 10.  */
+/* Enable strtoimax on pre-C99 Solaris 11.  */
 #define __EXTENSIONS__ 1
 
 /*
@@ -161,15 +161,15 @@
 
 /*
 ** Define HAVE_STDINT_H's default value here, rather than at the
-** start, since __GLIBC__'s value depends on previously-included
-** files.
-** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
+** start, since __GLIBC__ and INTMAX_MAX's values depend on
+** previously-included files.  glibc 2.1 and Solaris 10 and later have
+** stdint.h, even with pre-C99 compilers.
 */
 #ifndef HAVE_STDINT_H
 #define HAVE_STDINT_H \
    (199901 <= __STDC_VERSION__ \
     || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__)	\
-    || __CYGWIN__)
+    || __CYGWIN__ || INTMAX_MAX)
 #endif /* !defined HAVE_STDINT_H */
 
 #if HAVE_STDINT_H
diff --git a/strftime.c b/strftime.c
index 151b2e9..984ead5 100644
--- a/strftime.c
+++ b/strftime.c
@@ -496,15 +496,14 @@ label:
 				*/
 				continue;
 			case 'z':
+#if defined TM_GMTOFF || defined USG_COMPAT || defined ALTZONE
 				{
 				long		diff;
 				char const *	sign;
 
-				if (t->tm_isdst < 0)
-					continue;
-#ifdef TM_GMTOFF
+# ifdef TM_GMTOFF
 				diff = t->TM_GMTOFF;
-#else /* !defined TM_GMTOFF */
+# else
 				/*
 				** C99 says that the UT offset must
 				** be computed by looking only at
@@ -524,19 +523,21 @@ label:
 				** determinable, so output nothing if the
 				** appropriate variables are not available.
 				*/
+				if (t->tm_isdst < 0)
+					continue;
 				if (t->tm_isdst == 0)
-#ifdef USG_COMPAT
+#  ifdef USG_COMPAT
 					diff = -timezone;
-#else /* !defined USG_COMPAT */
+#  else
 					continue;
-#endif /* !defined USG_COMPAT */
+#  endif
 				else
-#ifdef ALTZONE
+#  ifdef ALTZONE
 					diff = -altzone;
-#else /* !defined ALTZONE */
+#  else
 					continue;
-#endif /* !defined ALTZONE */
-#endif /* !defined TM_GMTOFF */
+#  endif
+# endif
 				if (diff < 0) {
 					sign = "-";
 					diff = -diff;
@@ -547,6 +548,7 @@ label:
 					(diff % MINSPERHOUR);
 				pt = _conv(diff, "%04d", pt, ptlim);
 				}
+#endif
 				continue;
 			case '+':
 				pt = _fmt(Locale->date_fmt, t, pt, ptlim,
diff --git a/zdump.c b/zdump.c
index f68ba3d..a901aff 100644
--- a/zdump.c
+++ b/zdump.c
@@ -45,7 +45,7 @@
 # define HAVE_STDINT_H \
     (199901 <= __STDC_VERSION__ \
      || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__)	\
-     || __CYGWIN__)
+     || __CYGWIN__ || INTMAX_MAX)
 #endif
 #if HAVE_STDINT_H
 # include "stdint.h"
-- 
2.7.4



More information about the tz mailing list