[tz] [PROPOSED 2/7] Use C23 __has_include if available
Paul Eggert
eggert at cs.ucla.edu
Thu Oct 20 19:44:01 UTC 2022
* private.h (HAS_INCLUDE): New macro.
(HAVE_GETTEXT, HAVE_SYS_STAT_H, HAVE_UNISTD_H, HAVE_UTMPX_H)
(HAVE_STDINT_H, HAVE_INTTYPES_H): Use it to simplify
builder configuration.
---
Makefile | 13 ++++++++-----
NEWS | 2 +-
private.h | 39 +++++++++++++++++++++++----------------
3 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/Makefile b/Makefile
index afe7af7..8a2856f 100644
--- a/Makefile
+++ b/Makefile
@@ -210,7 +210,7 @@ LDLIBS=
# -DHAVE_DECL_ENVIRON if <unistd.h> declares 'environ'
# -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
# -DHAVE_GENERIC=0 if _Generic does not work
-# -DHAVE_GETTEXT if 'gettext' works (e.g., GNU/Linux, FreeBSD, Solaris)
+# -DHAVE_GETTEXT if 'gettext' works (e.g., GNU/Linux, FreeBSD, Solaris)*
# -DHAVE_INCOMPATIBLE_CTIME_R if your system's time.h declares
# ctime_r and asctime_r incompatibly with the POSIX standard
# (Solaris when _POSIX_PTHREAD_SEMANTICS is not defined).
@@ -223,14 +223,15 @@ LDLIBS=
# -DHAVE_POSIX_DECLS=0 if your system's include files do not declare
# functions like 'link' or variables like 'tzname' required by POSIX
# -DHAVE_SNPRINTF=0 if your system lacks the snprintf function
-# -DHAVE_STDINT_H if you have a non-C99 compiler with <stdint.h>
+# -DHAVE_STDINT_H if you have a non-C99 compiler with <stdint.h>*
# -DHAVE_STRFTIME_L if <time.h> declares locale_t and strftime_l
# -DHAVE_STRDUP=0 if your system lacks the strdup function
# -DHAVE_STRTOLL=0 if your system lacks the strtoll function
# -DHAVE_SYMLINK=0 if your system lacks the symlink function
-# -DHAVE_SYS_STAT_H=0 if your compiler lacks a <sys/stat.h>
+# -DHAVE_SYS_STAT_H=0 if your compiler lacks a <sys/stat.h>*
# -DHAVE_TZSET=0 if your system lacks a tzset function
-# -DHAVE_UNISTD_H=0 if your compiler lacks a <unistd.h>
+# -DHAVE_UNISTD_H=0 if your compiler lacks a <unistd.h>*
+# -DHAVE_UTMPX_H=0 if your compiler lacks a <utmpx.h>*
# -Dlocale_t=XXX if your system uses XXX instead of locale_t
# -DRESERVE_STD_EXT_IDS if your platform reserves standard identifiers
# with external linkage, e.g., applications cannot define 'localtime'.
@@ -257,11 +258,13 @@ LDLIBS=
# ignore or otherwise mishandle 64-bit data in TZif files;
# however, fat TZif files may trigger bugs in newer TZif readers.
# Slim TZif files are more efficient, and are the default.
-
# -DZIC_MAX_ABBR_LEN_WO_WARN=3
# (or some other number) to set the maximum time zone abbreviation length
# that zic will accept without a warning (the default is 6)
# $(GCC_DEBUG_FLAGS) if you are using recent GCC and want lots of checking
+#
+# * Options marked "*" can be omitted if your compiler is C23 compatible.
+#
# Select instrumentation via "make GCC_INSTRUMENT='whatever'".
GCC_INSTRUMENT = \
-fsanitize=undefined -fsanitize-address-use-after-scope \
diff --git a/NEWS b/NEWS
index 16f454c..2532691 100644
--- a/NEWS
+++ b/NEWS
@@ -38,7 +38,7 @@ Unreleased, experimental changes
400-year Gregorian cycle. (Problem reported by Bradley White.)
Take advantage of the following C23 features if available:
- bool/true/false keywords.
+ bool/true/false keywords and __has_include.
Release 2022e - 2022-10-11 11:13:02 -0700
diff --git a/private.h b/private.h
index 058d3c0..6510c52 100644
--- a/private.h
+++ b/private.h
@@ -30,6 +30,14 @@
/* This string was in the Factory zone through version 2016f. */
#define GRANDPARENTED "Local time zone must be set--see zic manual page"
+/* True if "#include INCLUDE" includes something, false otherwise.
+ Yield DEFAULT on pre-C23 platforms that lack __has_include. */
+#ifdef __has_include
+# define HAS_INCLUDE(include, default) __has_include(include)
+#else
+# define HAS_INCLUDE(include, default) (default)
+#endif
+
/*
** Defaults for preprocessor symbols.
** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
@@ -55,8 +63,8 @@
#endif
#ifndef HAVE_GETTEXT
-# define HAVE_GETTEXT 0
-#endif /* !defined HAVE_GETTEXT */
+# define HAVE_GETTEXT HAS_INCLUDE(<libintl.h>, false)
+#endif
#ifndef HAVE_INCOMPATIBLE_CTIME_R
# define HAVE_INCOMPATIBLE_CTIME_R 0
@@ -87,16 +95,16 @@
#endif /* !defined HAVE_SYMLINK */
#ifndef HAVE_SYS_STAT_H
-# define HAVE_SYS_STAT_H 1
-#endif /* !defined HAVE_SYS_STAT_H */
+# define HAVE_SYS_STAT_H HAS_INCLUDE(<sys/stat.h>, true)
+#endif
#ifndef HAVE_UNISTD_H
-# define HAVE_UNISTD_H 1
-#endif /* !defined HAVE_UNISTD_H */
+# define HAVE_UNISTD_H HAS_INCLUDE(<unistd.h>, true)
+#endif
#ifndef HAVE_UTMPX_H
-# define HAVE_UTMPX_H 1
-#endif /* !defined HAVE_UTMPX_H */
+# define HAVE_UTMPX_H HAS_INCLUDE(<utmpx.h>, true)
+#endif
#ifndef NETBSD_INSPIRED
# define NETBSD_INSPIRED 1
@@ -231,18 +239,17 @@
** stdint.h, even with pre-C99 compilers.
*/
#ifndef HAVE_STDINT_H
-# define HAVE_STDINT_H \
- (199901 <= __STDC_VERSION__ \
- || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
- || __CYGWIN__ || INTMAX_MAX)
-#endif /* !defined HAVE_STDINT_H */
-
+# define HAVE_STDINT_H HAS_INCLUDE(<stdint.h>, \
+ (199901 <= __STDC_VERSION__ \
+ || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
+ || __CYGWIN__ || INTMAX_MAX))
+#endif
#if HAVE_STDINT_H
# include <stdint.h>
-#endif /* !HAVE_STDINT_H */
+#endif
#ifndef HAVE_INTTYPES_H
-# define HAVE_INTTYPES_H HAVE_STDINT_H
+# define HAVE_INTTYPES_H HAS_INCLUDE(<inttypes.h>, HAVE_STDINT_H)
#endif
#if HAVE_INTTYPES_H
# include <inttypes.h>
--
2.37.3
More information about the tz
mailing list