Eric Blake wrote: > --- a/modules/unistd > +++ b/modules/unistd > @@ -4,6 +4,7 @@ A GNU-like <unistd.h>. > Files: > m4/unistd_h.m4 > lib/unistd.in.h > +m4/openat.m4
So every package that needs <unistd.h> now needs to include a file named openat.m4? It we had gone this route, the generation of <unistd.h> would now depend on chown.m4, close.m4, dup2.m4, dup3.m4, fsync.m4, getdtablesize.m4 etc. etc. up until sleep.m4. No, really, all macros needed for constructing the <unistd.h> replacement are supposed to sit in m4/unistd_h.m4. Instead of calling out from unistd_h.m4 to openat.m4, it's better to call out from openat.m4 to unistd_h.m4, like we have done for years. Here is the proposed patch. Additionally, this patch fixes a bug: gl_FUNC_OPENAT did not AC_REQUIRE gl_OPENAT_DEFAULTS. So it could happen that gl_FUNC_OPENAT gets expanded before gl_UNISTD_H_DEFAULTS, and then the variable GNULIB_OPENAT would have the value 0 instead of 1. Another plus is that it separates the blocks for different functions in unistd.in.h and sys_stat.in.h, for legibility. OK to apply? 2009-09-06 Bruno Haible <br...@clisp.org> * lib/sys_stat.in.h (fchmodat): Declare if GNULIB_FCHMODAT is set. (fstatat): Declare if GNULIB_FSTATAT is set. (mkdirat): Declare if GNULIB_MKDIRAT is set. * lib/unistd.in.h (fchownat): Declare if GNULIB_FCHOWNAT is set. (unlinkat): Declare if GNULIB_UNLINKAT is set. * modules/fcntl-h (Files): Remove m4/openat.m4. * modules/sys_stat (Files): Remove m4/openat.m4. (Makefile.am): Substitute GNULIB_FCHMODAT, GNULIB_FSTATAT, GNULIB_MKDIRAT instead of GNULIB_OPENAT. * modules/unistd (Files): Remove m4/openat.m4. (Makefile.am): Substitute GNULIB_FCHOWNAT, GNULIB_UNLINKAT instead of GNULIB_OPENAT. * m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Initialize GNULIB_OPENAT, HAVE_OPENAT here. Don't require gl_OPENAT_DEFAULTS. * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Initialize GNULIB_FCHMODAT, GNULIB_FSTATAT, GNULIB_MKDIRAT, HAVE_FCHMODAT, HAVE_FSTATAT, HAVE_MKDIRAT, REPLACE_FSTATAT here. Don't require gl_OPENAT_DEFAULTS. * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_FCHOWNAT, GNULIB_UNLINKAT, HAVE_FCHOWNAT, HAVE_UNLINKAT, REPLACE_FCHOWNAT here. Don't require gl_OPENAT_DEFAULTS. * m4/openat.m4 (gl_FUNC_OPENAT): Require gl_FCNTL_H_DEFAULTS, gl_SYS_STAT_H_DEFAULTS, gl_UNISTD_H_DEFAULTS. Set GNULIB_FCHMODAT, GNULIB_FSTATAT, GNULIB_MKDIRAT, GNULIB_FCHOWNAT, GNULIB_UNLINKAT. (gl_OPENAT_DEFAULTS): Remove macro. --- lib/sys_stat.in.h.orig 2009-09-06 22:24:24.000000000 +0200 +++ lib/sys_stat.in.h 2009-09-06 22:09:29.000000000 +0200 @@ -302,40 +302,49 @@ lstat (p, b)) #endif -#if @GNULIB_OPENAT@ -# if @REPLACE_FSTATAT@ -# undef fstatat -# define fstatat rpl_fstatat -# endif -# if !...@have_fstatat@ || @REPLACE_FSTATAT@ -int fstatat (int fd, char const *name, struct stat *st, int flags); -# endif +#if @GNULIB_FCHMODAT@ # if !...@have_fchmodat@ -int fchmodat (int fd, char const *file, mode_t mode, int flag); -# endif - -# if !...@have_mkdirat@ -int mkdirat (int fd, char const *file, mode_t mode); +extern int fchmodat (int fd, char const *file, mode_t mode, int flag); # endif - #elif defined GNULIB_POSIXCHECK # undef fchmodat # define fchmodat(d,n,m,f) \ (GL_LINK_WARNING ("fchmodat is not portable - " \ "use gnulib module openat for portability"), \ fchmodat (d, n, m, f)) +#endif + + +#if @GNULIB_FSTATAT@ +# if @REPLACE_FSTATAT@ +# undef fstatat +# define fstatat rpl_fstatat +# endif +# if !...@have_fstatat@ || @REPLACE_FSTATAT@ +extern int fstatat (int fd, char const *name, struct stat *st, int flags); +# endif +#elif defined GNULIB_POSIXCHECK # undef fstatat # define fstatat(d,n,s,f) \ (GL_LINK_WARNING ("fstatat is not portable - " \ "use gnulib module openat for portability"), \ fstatat (d, n, s, f)) +#endif + + +#if @GNULIB_MKDIRAT@ +# if !...@have_mkdirat@ +extern int mkdirat (int fd, char const *file, mode_t mode); +# endif +#elif defined GNULIB_POSIXCHECK # undef mkdirat # define mkdirat(d,n,m) \ (GL_LINK_WARNING ("mkdirat is not portable - " \ "use gnulib module openat for portability"), \ mkdirat (d, n, m)) -#endif /* @GNULIB_OPENAT@ */ +#endif + #if @REPLACE_FCHDIR@ # define fstat rpl_fstat --- lib/unistd.in.h.orig 2009-09-06 22:24:24.000000000 +0200 +++ lib/unistd.in.h 2009-09-06 22:07:14.000000000 +0200 @@ -147,16 +147,13 @@ #endif -#if @GNULIB_OPENAT@ +#if @GNULIB_FCHOWNAT@ # if @REPLACE_FCHOWNAT@ # undef fchownat # define fchownat rpl_fchownat # endif # if !...@have_fchownat@ || @REPLACE_FCHOWNAT@ -int fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag); -# endif -# if !...@have_unlinkat@ -int unlinkat (int fd, char const *file, int flag); +extern int fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag); # endif #elif defined GNULIB_POSIXCHECK # undef fchownat @@ -164,12 +161,20 @@ (GL_LINK_WARNING ("fchownat is not portable - " \ "use gnulib module openat for portability"), \ fchownat (d, n, o, g, f)) +#endif + + +#if @GNULIB_UNLINKAT@ +# if !...@have_unlinkat@ +extern int unlinkat (int fd, char const *file, int flag); +# endif +#elif defined GNULIB_POSIXCHECK # undef unlinkat # define unlinkat(d,n,f) \ (GL_LINK_WARNING ("unlinkat is not portable - " \ "use gnulib module openat for portability"), \ unlinkat (d, n, f)) -#endif /* @GNULIB_OPENAT@ */ +#endif #if @GNULIB_FACCESSAT@ --- modules/fcntl-h.orig 2009-09-06 22:24:24.000000000 +0200 +++ modules/fcntl-h 2009-09-06 21:55:40.000000000 +0200 @@ -4,7 +4,6 @@ Files: lib/fcntl.in.h m4/fcntl_h.m4 -m4/openat.m4 Depends-on: include_next --- modules/sys_stat.orig 2009-09-06 22:24:24.000000000 +0200 +++ modules/sys_stat 2009-09-06 21:59:02.000000000 +0200 @@ -4,7 +4,6 @@ Files: lib/sys_stat.in.h m4/sys_stat_h.m4 -m4/openat.m4 m4/unistd_h.m4 Depends-on: @@ -27,9 +26,11 @@ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ + -e 's|@''GNULIB_FCHMODAT''@|$(GNULIB_FCHMODAT)|g' \ + -e 's|@''GNULIB_FSTATAT''@|$(GNULIB_FSTATAT)|g' \ -e 's|@''GNULIB_LCHMOD''@|$(GNULIB_LCHMOD)|g' \ -e 's|@''GNULIB_LSTAT''@|$(GNULIB_LSTAT)|g' \ - -e 's|@''GNULIB_OPENAT''@|$(GNULIB_OPENAT)|g' \ + -e 's|@''GNULIB_MKDIRAT''@|$(GNULIB_MKDIRAT)|g' \ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ --- modules/unistd.orig 2009-09-06 22:24:24.000000000 +0200 +++ modules/unistd 2009-09-06 22:13:38.000000000 +0200 @@ -4,7 +4,6 @@ Files: m4/unistd_h.m4 lib/unistd.in.h -m4/openat.m4 Depends-on: include_next @@ -34,6 +33,7 @@ -e 's|@''GNULIB_EUIDACCESS''@|$(GNULIB_EUIDACCESS)|g' \ -e 's|@''GNULIB_FACCESSAT''@|$(GNULIB_FACCESSAT)|g' \ -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \ + -e 's|@''GNULIB_FCHOWNAT''@|$(GNULIB_FCHOWNAT)|g' \ -e 's|@''GNULIB_FSYNC''@|$(GNULIB_FSYNC)|g' \ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \ @@ -46,13 +46,13 @@ -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \ -e 's|@''GNULIB_LINK''@|$(GNULIB_LINK)|g' \ -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \ - -e 's|@''GNULIB_OPENAT''@|$(GNULIB_OPENAT)|g' \ -e 's|@''GNULIB_PIPE2''@|$(GNULIB_PIPE2)|g' \ -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \ -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \ -e 's|@''GNULIB_SYMLINKAT''@|$(GNULIB_SYMLINKAT)|g' \ -e 's|@''GNULIB_UNISTD_H_GETOPT''@|$(GNULIB_UNISTD_H_GETOPT)|g' \ -e 's|@''GNULIB_UNISTD_H_SIGPIPE''@|$(GNULIB_UNISTD_H_SIGPIPE)|g' \ + -e 's|@''GNULIB_UNLINKAT''@|$(GNULIB_UNLINKAT)|g' \ -e 's|@''GNULIB_WRITE''@|$(GNULIB_WRITE)|g' \ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ --- m4/fcntl_h.m4.orig 2009-09-06 22:24:24.000000000 +0200 +++ m4/fcntl_h.m4 2009-09-06 22:11:37.000000000 +0200 @@ -1,4 +1,4 @@ -# serial 2 +# serial 3 # Configure fcntl.h. dnl Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation @@ -91,8 +91,9 @@ AC_DEFUN([gl_FCNTL_H_DEFAULTS], [ - AC_REQUIRE([gl_OPENAT_DEFAULTS]) dnl for GNULIB_OPENAT - GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) + GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) + GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT]) dnl Assume proper GNU behavior unless another module says otherwise. + HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT]) REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) ]) --- m4/sys_stat_h.m4.orig 2009-09-06 22:24:24.000000000 +0200 +++ m4/sys_stat_h.m4 2009-09-06 22:01:25.000000000 +0200 @@ -1,4 +1,4 @@ -# sys_stat_h.m4 serial 12 -*- Autoconf -*- +# sys_stat_h.m4 serial 13 -*- Autoconf -*- dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -49,11 +49,17 @@ AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR - AC_REQUIRE([gl_OPENAT_DEFAULTS]) dnl for GNULIB_OPENAT - GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) - GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) + GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT]) + GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT]) + GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) + GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) + GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT]) dnl Assume proper GNU behavior unless another module says otherwise. - HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) - REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) - REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) + HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) + HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) + HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) + HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) + REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) + REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) + REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) ]) --- m4/unistd_h.m4.orig 2009-09-06 22:24:24.000000000 +0200 +++ m4/unistd_h.m4 2009-09-06 22:03:51.000000000 +0200 @@ -1,4 +1,4 @@ -# unistd_h.m4 serial 22 +# unistd_h.m4 serial 23 dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -32,7 +32,6 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS], [ - AC_REQUIRE([gl_OPENAT_DEFAULTS]) dnl for GNULIB_OPENAT GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE]) GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) @@ -41,6 +40,7 @@ GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS]) GNULIB_FACCESSAT=0; AC_SUBST([GNULIB_FACCESSAT]) GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) + GNULIB_FCHOWNAT=0; AC_SUBST([GNULIB_FCHOWNAT]) GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC]) GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) @@ -59,12 +59,14 @@ GNULIB_SYMLINKAT=0; AC_SUBST([GNULIB_SYMLINKAT]) GNULIB_UNISTD_H_GETOPT=0; AC_SUBST([GNULIB_UNISTD_H_GETOPT]) GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE]) + GNULIB_UNLINKAT=0; AC_SUBST([GNULIB_UNLINKAT]) GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DUP2=1; AC_SUBST([HAVE_DUP2]) HAVE_DUP3=1; AC_SUBST([HAVE_DUP3]) HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS]) HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT]) + HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT]) HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC]) HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) HAVE_GETDOMAINNAME=1; AC_SUBST([HAVE_GETDOMAINNAME]) @@ -82,10 +84,12 @@ HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) + HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT]) REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE]) REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2]) REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR]) + REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT]) REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) --- m4/openat.m4.orig 2009-09-06 22:24:24.000000000 +0200 +++ m4/openat.m4 2009-09-06 22:12:16.000000000 +0200 @@ -1,4 +1,4 @@ -# serial 20 +# serial 21 # See if we need to use our replacement for Solaris' openat et al functions. dnl Copyright (C) 2004-2009 Free Software Foundation, Inc. @@ -10,6 +10,18 @@ AC_DEFUN([gl_FUNC_OPENAT], [ + AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) + GNULIB_OPENAT=1 + + AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) + GNULIB_FCHMODAT=1 + GNULIB_FSTATAT=1 + GNULIB_MKDIRAT=1 + + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + GNULIB_FCHOWNAT=1 + GNULIB_UNLINKAT=1 + AC_LIBOBJ([openat-proc]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([lchmod]) @@ -34,7 +46,6 @@ HAVE_MKDIRAT=0 fi gl_FUNC_FCHOWNAT - GNULIB_OPENAT=1 ]) # gl_FUNC_FCHOWNAT_DEREF_BUG([ACTION-IF-BUGGY[, ACTION-IF-NOT_BUGGY]]) @@ -92,17 +103,3 @@ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T]) : ]) - -AC_DEFUN([gl_OPENAT_DEFAULTS], -[ - GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT]) - dnl Assume proper GNU behavior unless another module says otherwise. - HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) - HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT]) - HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) - HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) - HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT]) - HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT]) - REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT]) - REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) -])