From d9178438c5ae39936c9dbb789f2ffb3344c860c1 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 19 Apr 2023 13:17:00 -0700 Subject: [AUTOCONF PATCH] Tone down year-2038 changes New macro AC_SYS_YEAR2038_RECOMMENDED replaces new macro AC_SYS_YEAR2038_REQUIRED, and gives the builder an out of specifying --disable-year2038. Remove new macro AC_SYS_LARGEFILE_REQUIRED, which was added only for symmetry and does not seem to have a great need. * NEWS, doc/autoconf.texi: Document this. * lib/autoconf/specific.m4: Be more specific about mid-January 2038 than just Jan 2038. (_AC_SYS_YEAR2038_PROBE): Ignore IF-NOT-DETECTED arg. If support is not detected, merely set ac_have_year2038=no instead of erroring out. All callers changed. (_AC_SYS_YEAR2038_OPT_IN): Remove. All callers removed. (AC_SYS_YEAR2038): Simplify by requiring AC_SYS_LARGEFILE and then testing the result. (AC_SYS_YEAR2038_REQUIRED, AC_SYS_LARGEFILE_REQUIRED): Remove. (AC_SYS_YEAR2038_RECOMMENDED): New macro. (_AC_SYS_LARGEFILE_PROBE): If support is not detected, merely set ac_have_largefile=no instead of erroring out. All callers changed. Take on the burden of invoking year2038 probe as needed. (AC_SYS_LARGEFILE): Simplify. Fix year2038, largefile option processing --- NEWS | 18 ++-- doc/autoconf.texi | 34 +++----- lib/autoconf/specific.m4 | 177 +++++++++++---------------------------- 3 files changed, 69 insertions(+), 160 deletions(-) diff --git a/NEWS b/NEWS index 8e4ecc1b..a48a0085 100644 --- a/NEWS +++ b/NEWS @@ -51,7 +51,7 @@ GNU Autoconf NEWS - User visible changes. ** New features -*** New macro AC_SYS_YEAR2038. +*** New macros AC_SYS_YEAR2038 and AC_SYS_YEAR2038_RECOMMENDED. This causes 'configure' to widen time_t if possible on systems where time_t by default cannot represent file and other timestamps after January 2038. Widening is possible only on 32-bit GNU/Linux x86 and @@ -67,18 +67,14 @@ GNU Autoconf NEWS - User visible changes. This is similar to longstanding consistency requirements with --enable-largefile and --disable-largefile. + AC_SYS_YEAR2038_RECOMMENDED acts like AC_SYS_YEAR2038 except that + 'configure' fails if the target lacks support for post-2038 + timestamps and --disable-year2038 is not given. + *** AC_SYS_LARGEFILE now optionally arranges to widen time_t. It now acts like AC_SYS_YEAR2038, except 'configure' defaults to - --disable-year2038 unless AC_SYS_YEAR2038 is also present. - As with AC_SYS_YEAR2038, application and library builders should - configure consistently. - -*** New macros AC_SYS_LARGEFILE_REQUIRED and AC_SYS_YEAR2038_REQUIRED. - These act like AC_SYS_LARGEFILE and AC_SYS_YEAR2038 respectively, - except that 'configure' fails if the target lacks support - for large files and for post-2038 timestamps, respectively. - As with AC_SYS_YEAR2038, application and library builders should - configure consistently. + --disable-year2038 unless either AC_SYS_YEAR2038 or + AC_SYS_YEAR2038_RECOMMENDED is also present. *** AC_USE_SYSTEM_EXTENSIONS now enables C23 Annex F extensions by defining __STDC_WANT_IEC_60559_EXT__. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index b3c708e8..0f3047b3 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -8808,18 +8808,20 @@ if possible. These types may include @code{blkcnt_t}, @code{dev_t}, Also, arrange for a @command{configure} option @code{--enable-year2038} to request widening the type @code{time_t} as needed to represent file -wand other timestamps after January 2038. This widening is possible +wand other timestamps after mid-January 2038. This widening is possible only on 32-bit GNU/Linux x86 and ARM systems with glibc 2.34 or later. If year-2038 support is requested but @command{configure} fails to find a way to widen @code{time_t} and inspection of the system suggests that this feature is available somehow, @command{configure} will error out. If you want the default to be @code{--enable-year2038}, you can use -@code{AC_SYS_YEAR2038} instead of @code{AC_SYS_LARGEFILE}. +@code{AC_SYS_YEAR2038} or @code{AC_SYS_YEAR2038_RECOMMENDED} +instead of @code{AC_SYS_LARGEFILE}. In other words, older packages that have long used @code{AC_SYS_LARGEFILE} can have year-2038 support on 32-bit GNU/Linux x86 and ARM systems either by regenerating @file{configure} with current Autoconf and configuring with -@option{--enable-year2038}, or by using @code{AC_SYS_YEAR2038} and -configuring without @option{--disable-year2038}. +@option{--enable-year2038}, or by using @code{AC_SYS_YEAR2038} or +@code{AC_SYS_YEAR2038_RECOMMENDED} and configuring without +@option{--disable-year2038}. A future version of Autoconf might change the @code{AC_SYS_LARGEFILE} default to @code{--enable-year2038}; if and when that happens, @code{AC_SYS_LARGEFILE} and @code{AC_SYS_YEAR2038} will become equivalent. @@ -8886,19 +8888,6 @@ library, enabling or disabling the application's large-file support may break binary compatibility with that library. @end defmac -@defmac AC_SYS_LARGEFILE_REQUIRED -@acindex{SYS_LARGEFILE_REQUIRED} -This macro has the same effect as @code{AC_SYS_LARGEFILE}, -but also declares that the program being configured -requires support for large files. -If a large @code{off_t} is unavailable, -@command{configure} will error out. -The @option{--disable-largefile} option will not be available. - -Large-file and year-2038 support for applications and libraries should -be configured compatibly. @xref{AC_SYS_LARGEFILE}. -@end defmac - @anchor{AC_SYS_LONG_FILE_NAMES} @defmac AC_SYS_LONG_FILE_NAMES @acindex{SYS_LONG_FILE_NAMES} @@ -8927,14 +8916,13 @@ applications and libraries should be configured compatibly. @xref{AC_SYS_LARGEFILE}. @end defmac -@defmac AC_SYS_YEAR2038_REQUIRED -@acindex{SYS_YEAR2038_REQUIRED} +@defmac AC_SYS_YEAR2038_RECOMMENDED +@acindex{SYS_YEAR2038_RECOMMENDED} This macro has the same effect as @code{AC_SYS_YEAR2038}, but also declares that the program being configured -requires support for timestamps after mid-January of 2038. -If a large @code{time_t} is unavailable, -@command{configure} will unconditionally error out. -The @option{--disable-year2038} option will not be available. +should support timestamps after mid-January 2038. +If a large @code{time_t} is unavailable, @command{configure} will error +out unless the @option{--disable-year2038} option is specified. Year-2038 support for applications and libraries should be configured compatibly. @xref{AC_SYS_YEAR2038}. diff --git a/lib/autoconf/specific.m4 b/lib/autoconf/specific.m4 index 3bf1a0ed..011a52f3 100644 --- a/lib/autoconf/specific.m4 +++ b/lib/autoconf/specific.m4 @@ -115,8 +115,8 @@ m4_define([_AC_SYS_YEAR2038_OPTIONS], m4_normalize( dnl 32-bit MinGW (misconfiguration) )) -# _AC_SYS_YEAR2038_PROBE([IF-NOT-DETECTED]) -# ----------------------------------------- +# _AC_SYS_YEAR2038_PROBE +# ---------------------- # Subroutine of AC_SYS_YEAR2038. Probe for time_t that can represent # time points more than 2**31 - 1 seconds after the epoch (dates after # 2038-01-18, see above) and set the cache variable ac_cv_sys_year2038_opts @@ -129,13 +129,10 @@ m4_define([_AC_SYS_YEAR2038_OPTIONS], m4_normalize( # AC_TRY_RUN. Note also that some systems only support large time_t # together with large off_t. # -# If support is not detected, the behavior depends on which of the -# top-level AC_SYS_YEAR2038 macros was used (see below). -# # If you change this macro you may also need to change # _AC_SYS_YEAR2038_OPTIONS. AC_DEFUN([_AC_SYS_YEAR2038_PROBE], -[AC_CACHE_CHECK([for $CC option to enable timestamps after Jan 2038], +[AC_CACHE_CHECK([for $CC option for timestamps after 2038], [ac_cv_sys_year2038_opts], [ac_save_CPPFLAGS="$CPPFLAGS" ac_opt_found=no @@ -154,29 +151,7 @@ ac_have_year2038=yes AS_CASE([$ac_cv_sys_year2038_opts], ["none needed"], [], ["support not detected"], - [ac_have_year2038=no - AS_CASE([$ac_year2038_required,$enable_year2038], - [yes,*], - [AC_MSG_FAILURE([support for timestamps after Jan 2038 is required])], - [*,yes], - [# If we're not cross compiling and 'touch' works with a large - # timestamp, then we can presume the system supports wider time_t - # *somehow* and we just weren't able to detect it. One common - # case that we deliberately *don't* probe for is a system that - # supports both 32- and 64-bit ABIs but only the 64-bit ABI offers - # wide time_t. (It would be inappropriate for us to override an - # intentional use of -m32.) Error out, demanding use of - # --disable-year2038 if this is intentional. - AS_IF([test $cross_compiling = no], - [AS_IF([TZ=UTC0 touch -t 210602070628.15 conftest.time 2>/dev/null], - [AS_CASE([`TZ=UTC0 LC_ALL=C ls -l conftest.time 2>/dev/null`], - [*'Feb 7 2106'* | *'Feb 7 17:10'*], - [AC_MSG_FAILURE(m4_text_wrap( - [this system appears to support timestamps after January 2038, - but no mechanism for enabling wide 'time_t' was detected. - Did you mean to build a 64-bit binary? (e.g. 'CC="${CC} -m64"'.) - To proceed with 32-bit time_t, configure with '--disable-year2038'.], - [], [], [55]))])])])])], + [ac_have_year2038=no], ["-D_TIME_BITS=64"], [AC_DEFINE([_TIME_BITS], [64], @@ -189,7 +164,7 @@ AS_CASE([$ac_cv_sys_year2038_opts], ["-U_USE_32_BIT_TIME_T"*], [AC_MSG_FAILURE(m4_text_wrap( [the 'time_t' type is currently forced to be 32-bit. - It will stop working after January 2038. + It will stop working after mid-January 2038. Remove _USE_32BIT_TIME_T from the compiler flags.], [], [], [55]))], @@ -199,44 +174,23 @@ AS_CASE([$ac_cv_sys_year2038_opts], # _AC_SYS_YEAR2038_ENABLE # ----------------------- -# Subroutine of AC_SYS_YEAR2038 and _AC_SYS_YEAR2038_OPT_IN. # Depending on which of the YEAR2038 macros was used, add either an -# --enable-year2038, or a --disable-year2038, or no option at all to -# the configure script. Note that this is expanded very late and +# --enable-year2038 or a --disable-year2038 to +# the configure script. This is expanded very late and # therefore there cannot be any code in the AC_ARG_ENABLE. The # default value for 'enable_year2038' is emitted unconditionally # because the generated code always looks at this variable. m4_define([_AC_SYS_YEAR2038_ENABLE], [m4_divert_text([DEFAULTS], - m4_provide_if([AC_SYS_YEAR2038_REQUIRED], - [ac_year2038_required=yes], - [ac_year2038_required=no]))dnl -m4_divert_text([DEFAULTS], m4_provide_if([AC_SYS_YEAR2038], [enable_year2038=yes], [enable_year2038=no]))]dnl -[m4_provide_if([AC_SYS_YEAR2038_REQUIRED], [], [AC_ARG_ENABLE([year2038], m4_provide_if([AC_SYS_YEAR2038], [AS_HELP_STRING([--disable-year2038], - [omit support for dates after Jan 2038])], + [don't support timestamps after 2038])], [AS_HELP_STRING([--enable-year2038], - [include support for dates after Jan 2038])]))])]) - -# _AC_SYS_YEAR2038_OPT_IN -# ----------------------- -# If the --enable-year2038 option is given to configure, attempt to -# detect and activate support for large time_t on 32-bit systems. -# This macro is automatically invoked by AC_SYS_LARGEFILE when large -# *file* support is detected. It does not AC_REQUIRE AC_SYS_LARGEFILE -# to avoid a dependency loop, and is therefore unsafe to expose as a -# documented macro. -AC_DEFUN([_AC_SYS_YEAR2038_OPT_IN], -[m4_provide_if([_AC_SYS_YEAR2038_PROBE], [], [dnl - AS_IF([test "$ac_year2038_required,$enable_year2038" != no,no], - [_AC_SYS_YEAR2038_PROBE]) - AC_CONFIG_COMMANDS_PRE([_AC_SYS_YEAR2038_ENABLE]) -])]) + [support timestamps after 2038])]))]) # AC_SYS_YEAR2038 # --------------- @@ -244,28 +198,39 @@ AC_DEFUN([_AC_SYS_YEAR2038_OPT_IN], # On systems where time_t is not always 64 bits, this probe can be # skipped by passing the --disable-year2038 option to configure. AC_DEFUN([AC_SYS_YEAR2038], -[m4_provide_if([AC_SYS_LARGEFILE_REQUIRED], [], - [AC_REQUIRE([AC_SYS_LARGEFILE])])]dnl -[m4_provide_if([_AC_SYS_YEAR2038_PROBE], [], [dnl - AS_IF([test "$ac_year2038_required,$enable_year2038" != no,no], - [_AC_SYS_YEAR2038_PROBE]) - AC_CONFIG_COMMANDS_PRE([_AC_SYS_YEAR2038_ENABLE]) -])]) - -# AC_SYS_YEAR2038_REQUIRED -# ------------------------ -# Same as AC_SYS_YEAR2038, but declares that this program *requires* -# support for large time_t. If we cannot find any way to make time_t -# capable of representing values larger than 2**31 - 1, configure will -# error out. Furthermore, no --enable-year2038 nor --disable-year2038 -# option will be available. -AC_DEFUN([AC_SYS_YEAR2038_REQUIRED], -[m4_provide_if([AC_SYS_LARGEFILE_REQUIRED], [], - [AC_REQUIRE([AC_SYS_LARGEFILE])])]dnl -[m4_provide_if([_AC_SYS_YEAR2038_PROBE], [], [dnl - _AC_SYS_YEAR2038_PROBE - AC_CONFIG_COMMANDS_PRE([_AC_SYS_YEAR2038_ENABLE]) -])]) +[AC_REQUIRE([AC_SYS_LARGEFILE])dnl +AS_IF([test "$enable_year2038,$ac_have_year2038,$cross_compiling" = yes,no,no], + [# If we're not cross compiling and 'touch' works with a large + # timestamp, then we can presume the system supports wider time_t + # *somehow* and we just weren't able to detect it. One common + # case that we deliberately *don't* probe for is a system that + # supports both 32- and 64-bit ABIs but only the 64-bit ABI offers + # wide time_t. (It would be inappropriate for us to override an + # intentional use of -m32.) Error out, demanding use of + # --disable-year2038 if this is intentional. + AS_IF([TZ=UTC0 touch -t 210602070628.15 conftest.time 2>/dev/null], + [AS_CASE([`TZ=UTC0 LC_ALL=C ls -l conftest.time 2>/dev/null`], + [*'Feb 7 2106'* | *'Feb 7 17:10'*], + [AC_MSG_FAILURE(m4_text_wrap( + [this system appears to support timestamps after mid-January 2038, + but no mechanism for enabling wide 'time_t' was detected. + Did you mean to build a 64-bit binary? (E.g., 'CC="${CC} -m64"'.) + To proceed with 32-bit time_t, configure with '--disable-year2038'.], + [], [], [55]))])])])]) + +# AC_SYS_YEAR2038_RECOMMENDED +# --------------------------- +# Same as AC_SYS_YEAR2038, but recommend support for large time_t. +# If we cannot find any way to make time_t capable of representing +# values larger than 2**31 - 1, error out unless --disable-year2038 is given. +AC_DEFUN([AC_SYS_YEAR2038_RECOMMENDED], +[AC_REQUIRE([AC_SYS_YEAR2038])dnl +AS_IF([test "$enable_year2038,$ac_have_year2038" = yes,no], + [AC_MSG_FAILURE(m4_text_wrap( + [could not enable timestamps after mid-January 2038. + Did you mean to build a 64-bit binary? (E.g., 'CC="${CC} -m64"'.) + To proceed with 32-bit time_t, configure with '--disable-year2038'.], + [], [], [55]))])]) # _AC_SYS_LARGEFILE_TEST_CODE # --------------------------- @@ -329,9 +294,7 @@ ac_have_largefile=yes AS_CASE([$ac_cv_sys_largefile_opts], ["none needed"], [], ["support not detected"], - [ac_have_largefile=no - AS_IF([test $ac_largefile_required,$ac_year2038_required != no,no], - [AC_MSG_FAILURE([support for large files is required])])], + [ac_have_largefile=no], ["-D_FILE_OFFSET_BITS=64"], [AC_DEFINE([_FILE_OFFSET_BITS], [64], @@ -347,30 +310,9 @@ AS_CASE([$ac_cv_sys_largefile_opts], [AC_MSG_ERROR( [internal error: bad value for \$ac_cv_sys_largefile_opts])]) -_AC_SYS_YEAR2038_OPT_IN -]) - -# _AC_SYS_LARGEFILE_ENABLE -# ------------------------ -# Subroutine of AC_SYS_LARGEFILE. If AC_SYS_LARGEFILE_REQUIRED was -# not used at any point in this configure script, add a -# --disable-largefile option to the configure script. Note that this -# is expanded very late and therefore there cannot be any code in the -# AC_ARG_ENABLE. The default value for 'enable_largefile' is emitted -# unconditionally because the generated shell code always looks at -# this variable. -m4_define([_AC_SYS_LARGEFILE_ENABLE], -[m4_divert_text([DEFAULTS], - m4_provide_if([AC_SYS_LARGEFILE_REQUIRED], - [ac_largefile_required=yes], - [ac_largefile_required=no]))dnl -m4_divert_text([DEFAULTS], - [enable_largefile=yes])]dnl -[m4_provide_if([AC_SYS_LARGEFILE_REQUIRED], [], - [m4_provide_if([AC_SYS_YEAR2038_REQUIRED], [], - [AC_ARG_ENABLE([largefile], - [AS_HELP_STRING([--disable-largefile], - [omit support for large files])])])])]) +AS_IF([test "$enable_year2038" != no], + [_AC_SYS_YEAR2038_PROBE]) +AC_CONFIG_COMMANDS_PRE([_AC_SYS_YEAR2038_ENABLE])]) # AC_SYS_LARGEFILE # ---------------- @@ -381,29 +323,12 @@ m4_divert_text([DEFAULTS], # Additionally, on Linux file systems with 64-bit inodes a file that happens # to have a 64-bit inode number cannot be accessed by 32-bit applications on # Linux x86/x86_64. This can occur with file systems such as XFS and NFS. -# This macro allows configuration to continue if the system doesn't support -# large files; see also AC_SYS_LARGEFILE_REQUIRED. AC_DEFUN([AC_SYS_LARGEFILE], -[m4_provide_if([_AC_SYS_LARGEFILE_PROBE], [], [dnl - AS_IF([test "$ac_largefile_required,$enable_largefile,$ac_year2038_required" != no,no,no], - [_AC_SYS_LARGEFILE_PROBE]) - AC_CONFIG_COMMANDS_PRE([_AC_SYS_LARGEFILE_ENABLE]) -])]) - -# AC_SYS_LARGEFILE_REQUIRED -# ------------------------- -# Same as AC_SYS_LARGEFILE, but declares that this program *requires* -# support for large files. If we cannot find a combination of compiler -# options and #defines that makes 'off_t' capable of representing 2**63 - 1, -# 'configure' will error out. Furthermore, 'configure' will not offer a -# --disable-largefile command line option. -# If both AC_SYS_LARGEFILE and AC_SYS_LARGEFILE_REQUIRED are used in the -# same configure script -- in either order -- AC_SYS_LARGEFILE_REQUIRED wins. -AC_DEFUN([AC_SYS_LARGEFILE_REQUIRED], -[m4_provide_if([_AC_SYS_LARGEFILE_PROBE], [], [dnl - _AC_SYS_LARGEFILE_PROBE - AC_CONFIG_COMMANDS_PRE([_AC_SYS_LARGEFILE_ENABLE]) -])]) +[AC_ARG_ENABLE([largefile], + [AS_HELP_STRING([--disable-largefile], + [omit support for large files])])dnl +AS_IF([test "$enable_largefile,$enable_year2038" != no,no], + [_AC_SYS_LARGEFILE_PROBE])]) # AC_SYS_LONG_FILE_NAMES # ---------------------- -- 2.37.2