Subject: bug#26398: closed (Re: GNU LIB build fails on macOS 10.12.4)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 09 Apr 2017 08:04:02 +0000

Your bug report

#26398: 26.0.50; GNU LIB build fails on macOS 10.12.4

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
26398: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=26398
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: GNU LIB build fails on macOS 10.12.4
From: Paul Eggert <[email-masked]>
To: Zack Weinberg <[email-masked]>
Cc: [email-masked], Harald Maier <[email-masked]>, GNU C Library <[email-masked]>, Gnulib bugs <[email-masked]>
Date: Sun, 9 Apr 2017 01:03:30 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

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 <[email-masked]>
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  <[email-masked]>
+
+	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  <[email-masked]>
 
 	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 <getopt_cdefs.h>
 #include <getopt_pfx_core.h>
 #include <getopt_pfx_ext.h>
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 <sys/types.h>
 #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 <winsock2.h>.  */
 
 #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

Subject: 26.0.50; GNU LIB build fails on macOS 10.12.4
From: Harald Maier <[email-masked]>
To: [email-masked]
Date: Sat, 8 Apr 2017 09:14:25 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

The latest git checkout fails on mac OS 10.12.4.

  CC       fstatat.o
In file included from fstatat.c:45:
In file included from ./fcntl.h:67:
In file included from ./unistd.h:135:
In file included from ./getopt_pfx_core.h:52:
./getopt_core.h:91:79: error: expected ';' after top level declarator
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
                                                                              ^
./getopt_core.h:92:28: error: expected identifier or '('
       __THROW __nonnull ((2, 3));
                           ^
./getopt_core.h:92:28: error: expected ')'
./getopt_core.h:92:27: note: to match this '('
       __THROW __nonnull ((2, 3));
                          ^
3 errors generated.
make[2]: *** [fstatat.o] Error 1
make[1]: *** [lib] Error 2

$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin16.5.0

In GNU Emacs 26.0.50 (build 2, x86_64-apple-darwin16.4.0, X toolkit, Xaw3d scroll bars)
 of 2017-03-26 built on ate.maierh
Repository revision: 082e2cb3f40b717e4c00d31532927c9693b7cb9b
Windowing system distributor 'The X.Org Foundation', version 11.0.11804000
Recent messages:
Omitting...
Omitted 54 lines.
Mark saved where search started
Updating buffer list...
Formats have changed, recompiling...done
Updating buffer list...done
Commands: m, u, t, RET, g, k, S, D, Q; q to quit; h for help
Mark set
previous-line: Beginning of buffer
Mark saved where search started
Quit [2 times]
Configured using:
 'configure --without-ns --with-x-toolkit=lucid
 --x-includes=/opt/X11/include --x-libraries=/opt/X11/lib --without-pop
 --without-gsettings --with-jpeg=no --with-png=no --with-gif=no
 --with-tiff=no'