* 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