On Wed, Sep 14, 2016 at 9:26 AM, Eric Blake <ebl...@redhat.com> wrote:
> glibc 2.25 is deprecating the namespace pollution of sys/types.h
> injecting major(), minor(), and makedev() into the compilation
> environment, with a warning that insists that users include
> <sys/sysmacros.h> instead.  However, because the expansion of
> AC_HEADER_MAJOR didn't bother checking sys/sysmacros.h until
> after probing whether sys/types.h pollutes the namespace, it was
> not defining MAJOR_IN_SYSMACROS, with the result that code
> compiled with -Werror chokes on the deprecation warnings because
> it was not including sysmacros.h.
>
> In addition to fixing autoconf (which only benefits projects
> that rebuild configure after this fix is released), we can also
> give a hint to distros on how they can populate config.site with
> a cache variable to force pre-existing configure scripts without
> the updated macro to behave sanely in the presence of glibc 2.25.

Thanks for writing this patch.

> For this patch, I kept the status quo of assuming that if
> sys/sysmacros.h exists, then it probably defines major/minor/makedev;
> if you want me to rework the patch to explicitly check that this
> is the case, I can do that as well (probably best as a followup
> patch, in case downstreams want to backport one idea without the
> other).

glibc's sys/sysmacros.h _only_ defines major/minor/makedev.  What I'd
worry about is whether any other C library has a different header with
the same name; "sysmacros" is pretty generic.  I don't have any
evidence either way on that question.

> @@ -5977,6 +5977,27 @@ Particular Headers
>  @code{makedev}, but @file{sys/mkdev.h} does, define
>  @code{MAJOR_IN_MKDEV}; otherwise, if @file{sys/sysmacros.h} does, define
>  @code{MAJOR_IN_SYSMACROS}.

This part of the description should probably be adjusted to match what
the code does now.

> +To properly use any of these three functions, your code should contain
> +something like:

Also, I think "three functions" here is meant to refer to
major/minor/makedev, but it tripped me up the first time I read it.  I
suggest instead

   Detect the headers required to use @code{makedev}, @code{major}, and
   @code{minor}.  These functions may be defined by @file{sys/mkdev.h},
   @code{sys/sysmacros.h}, or @file{sys/types.h}.

   @code{AC_HEADER_MAJOR} defines @code{MAJOR_IN_MKDEV} if they are in
   @file{sys/mkdev.h}, or @code{MAJOR_IN_SYSMACROS} if they are in
   @file{sys/sysmacros.h.}.  If neither macro is defined, they are either
   in @file{sys/types.h} or they are unavailable.

   To portably use these functions, your code should contain something
   like

and then your @verbatim block.

(Should AC_HEADER_MAJOR maybe throw an error if none of the possible
headers we know about defines major/minor/makedev?  I believe this is
the case on MinGW, for instance.)

> +Note that glibc 2.25 issues a deprecation warning if these functions are
> +used from @file{sys/types.h} without also using @file{sys/sysmacros.h},
> +but that configure scripts built with versions of autoconf prior to 2.70
> +did not correctly define @code{MAJOR_IN_SYSMACROS} in that scenario; on
> +systems where that is a problem, you can use the workaround of priming
> +the configure cache by setting @code{ac_cv_header_sys_types_h_makedev}
> +to 'no', perhaps as part of a @file{config.site} site default file
> +(@pxref{Site Defaults}).

This is a really long sentence.  Also, "used from @file{sys/types.h}
without also using @file{sys/types.h}" is confusing, and since this is
the Autoconf manual, probably the paragraph should highlight the
affected Autoconf versions first.  Suggested:

   Note: Configure scripts built with Autoconf 2.69 or earlier will
   not detect a problem if @file{sys/types.h} contains definitions of
   @code{major}, @code{minor}, and/or @code{makedev} that trigger
   compiler warnings upon use.  This is known to occur with GNU libc
   2.25, where those definitions are being deprecated, to reduce
   namespace pollution.  If it is not practical to regenerate affected
   software's configure scripts with Autoconf 2.70, you can work around
   the problem by setting @samp{ac_cv_header_sys_types_h_makedev=no} in
   a @file{config.site} site default file (@pxref{Site Defaults}).


> +# Thanks to glibc 2.25, we need the following logic:
> +# If <sys/sysmacros.h> compiles, assume it provides the macros.
> +# Otherwise, if <sys/types.h> provides them, nothing further to do.
> +# Otherwise, if <sys/mkdev.h> exists, assume it provides the macros.

I think we should check sys/types.h last.  That will future-proof
against C libraries where these functions are in both sys/mkdev.h and
sys/types.h deciding to do the same deprecation that glibc has done.

zw

Reply via email to