From patchwork Sun Apr 9 08:03:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Eggert X-Patchwork-Id: 19927 Received: (qmail 101621 invoked by alias); 9 Apr 2017 08:03:35 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 101601 invoked by uid 89); 9 Apr 2017 08:03:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=_gl_, _GL_, _public_, 10124 X-HELO: zimbra.cs.ucla.edu Subject: Re: GNU LIB build fails on macOS 10.12.4 To: Zack Weinberg References: <8AE2BE5E-3FDE-4F7E-9F82-2CB8D8880D95@Maierh.de> Cc: 26398-done@debbugs.gnu.org, Gnulib bugs , GNU C Library , Harald Maier From: Paul Eggert Message-ID: Date: Sun, 9 Apr 2017 01:03:30 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: Zack Weinberg wrote: > This patch is incomplete. Yes, it was the Emacs patch, not the Gnulib patch. I'll attach a complete Gnulib patch. > If gnulib cannot use __nonnull in > getopt_{core,ext}.h, then there is no point trying to define it in > getopt_cdefs.h. Good point, I've removed that in the attached. > And you're going to need to put snippet/arg-nonnull > back in the module file for this to work at all, aren't you? Yes, that's in the attached patch. > From glibc's point of view, I think it would be better if > getopt_core.h and getopt_ext.h simply assumed _GL_ARG_NONNULL to be > available; we can add it to either our getopt.h wrapper or to > sys/cdefs.h - I don't want to make that call unilaterally. By "our getopt.h wrapper" do you mean a file in glibc but not in Gnulib? If so, this doesn't affect Gnulib. I suspect _GL_ARG_NONNULL logically belongs in sys/cdefs.h but it should also work to put it into the getopt.h wrapper. > (Do you > know of a complete list of _GL_ macros that may appear in _public_ > header files?) I don't know of an explicit list. You can look at all the .h files listed in the Files: sections of gnulib/modules/snippet/*. For example, the snippet/arg-nonnull module defines _GL_ARG_NONNULL, the snippet/_Noreturn module defines _Noreturn, and so forth. There are quite a few such macros, and (as _Noreturn indicates) they don't all begin with _GL_. I installed the attached into Gnulib and merged it into Emacs, and am boldly marking the Emacs bug (Bug#26398) as done. I think there still needs to be some changes done on the proposed change to glibc, to define _GL_ARG_NONNULL somewhere for glibc. From 141be0d810330ceec66ce3fab46aaeb4c633bd7e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 8 Apr 2017 17:26:03 -0700 Subject: [PATCH] getopt: port recent getopt changes to macOS Problem reported by Harald Maier (Bug#26398). The macOS C compiler uses __nonnull for its own purposes and that clashes with glibc's __nonnull. * lib/getopt.in.h: Add comment for _GL_ARG_NONNULL snippet. * lib/getopt_cdefs.in.h (__nonnull): Remove. * lib/getopt_core.h (getopt): * lib/getopt_ext.h (getopt_long, getopt_long_only): Use _GL_ARG_NONNULL, not __nonnull. * lib/unistd.in.h: Move snippet hooks to before where the getopt .h files are included, so that _GL_ARG_NONNULL is defined in time. * modules/getopt-posix (Depends-on): Add snippet/arg-nonnull. (getopt.h): Interpolate _GL_ARG_NONNULL snippet. --- ChangeLog | 16 ++++++++++++++++ lib/getopt.in.h | 2 ++ lib/getopt_cdefs.in.h | 8 -------- lib/getopt_core.h | 2 +- lib/getopt_ext.h | 4 ++-- lib/unistd.in.h | 14 +++++++------- modules/getopt-posix | 2 ++ 7 files changed, 30 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index db893f5..595f2ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2017-04-08 Paul Eggert + + getopt: port recent getopt changes to macOS + Problem reported by Harald Maier (Bug#26398). + The macOS C compiler uses __nonnull for its own purposes and that + clashes with glibc's __nonnull. + * lib/getopt.in.h: Add comment for _GL_ARG_NONNULL snippet. + * lib/getopt_cdefs.in.h (__nonnull): Remove. + * lib/getopt_core.h (getopt): + * lib/getopt_ext.h (getopt_long, getopt_long_only): + Use _GL_ARG_NONNULL, not __nonnull. + * lib/unistd.in.h: Move snippet hooks to before where the getopt + .h files are included, so that _GL_ARG_NONNULL is defined in time. + * modules/getopt-posix (Depends-on): Add snippet/arg-nonnull. + (getopt.h): Interpolate _GL_ARG_NONNULL snippet. + 2017-04-06 Paul Eggert getopt-gnu: omit some duplicate code diff --git a/lib/getopt.in.h b/lib/getopt.in.h index c3ffd95..9f84c27 100644 --- a/lib/getopt.in.h +++ b/lib/getopt.in.h @@ -52,6 +52,8 @@ # endif #endif +/* The definition of _GL_ARG_NONNULL is copied here. */ + #include #include #include diff --git a/lib/getopt_cdefs.in.h b/lib/getopt_cdefs.in.h index 35a2669..54da28d 100644 --- a/lib/getopt_cdefs.in.h +++ b/lib/getopt_cdefs.in.h @@ -64,12 +64,4 @@ # endif #endif -#ifndef __nonnull -# if __GNUC_PREREQ (3,3) -# define __nonnull(params) __attribute__ ((__nonnull__ params)) -# else -# define __nonnull(params) -# endif -#endif - #endif /* getopt_cdefs.h */ diff --git a/lib/getopt_core.h b/lib/getopt_core.h index 1744c29..76ef466 100644 --- a/lib/getopt_core.h +++ b/lib/getopt_core.h @@ -89,7 +89,7 @@ extern int optopt; writable. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) - __THROW __nonnull ((2, 3)); + __THROW _GL_ARG_NONNULL ((2, 3)); __END_DECLS diff --git a/lib/getopt_ext.h b/lib/getopt_ext.h index c1a58da..a3a6750 100644 --- a/lib/getopt_ext.h +++ b/lib/getopt_ext.h @@ -66,11 +66,11 @@ struct option extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) - __THROW __nonnull ((2, 3)); + __THROW _GL_ARG_NONNULL ((2, 3)); extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) - __THROW __nonnull ((2, 3)); + __THROW _GL_ARG_NONNULL ((2, 3)); __END_DECLS diff --git a/lib/unistd.in.h b/lib/unistd.in.h index 38a0f0a..de619dc 100644 --- a/lib/unistd.in.h +++ b/lib/unistd.in.h @@ -127,6 +127,13 @@ # include #endif +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + /* Get getopt(), optarg, optind, opterr, optopt. But avoid namespace pollution on glibc systems. */ #if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT @@ -142,13 +149,6 @@ _GL_INLINE_HEADER_BEGIN # define _GL_UNISTD_INLINE _GL_INLINE #endif -/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ - -/* The definition of _GL_ARG_NONNULL is copied here. */ - -/* The definition of _GL_WARN_ON_USE is copied here. */ - - /* Hide some function declarations from . */ #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ diff --git a/modules/getopt-posix b/modules/getopt-posix index 5844217..2208756 100644 --- a/modules/getopt-posix +++ b/modules/getopt-posix @@ -18,6 +18,7 @@ unistd extensions include_next gettext-h [test $REPLACE_GETOPT = 1] +snippet/arg-nonnull configure.ac: gl_FUNC_GETOPT_POSIX @@ -43,6 +44,7 @@ getopt.h: getopt.in.h $(top_builddir)/config.status -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ + -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ < $(srcdir)/getopt.in.h; \ } > $@-t && \ mv -f $@-t $@ -- 2.7.4