On Tue, 27. Nov 2007, 18:38:13 +0100, Bruno Haible wrote: > Martin Lambers wrote: > > If a macro is used instead, should its definition go into > > lib/unistd.h.in directly, or should it stay in a separate > > lib/getpagesize.h, which is then included in lib/unistd.h.in? > > It should go into lib/unistd.in.h. You can use blank lines or other kinds > of separator lines or headlines in comments, to separate it from the other > contents of unistd.in.h. > > > I also was not sure if it's okay to include additional system headers > > like <OS.h> in the middle of gnulibs unistd.h. > > Good point; this brings a certain amount of namespace pollution. > Nevertheless, I'd try first to continue using a macro, and include > <OS.h> from unistd.h, and switch to a function instead only when we > see that it's needed.
Thank you very much for your comments! I attached an updated patch. It now only does the following: - Do not provide getpagesize.h; modify gnulibs unistd.h instead. - Provide a getpagesize declaration if the system does not provide one (needed on MinGW). I removed the untested MSVC implementation from the previous patch. In this patch, the original getpagesize macro logic was moved from getpagesize.h to unistd.in.h unaltered. I tested this on GNU/Linux and MinGW. I don't have access to a system that lacks getpagesize(). Martin diff -uNr gnulib.orig/lib/getpagesize.h gnulib/lib/getpagesize.h --- gnulib.orig/lib/getpagesize.h 2007-11-26 16:56:13.000000000 +0100 +++ gnulib/lib/getpagesize.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,66 +0,0 @@ -/* Emulate getpagesize on systems that lack it. - Copyright (C) 1999, 2000, 2004, 2005 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -#ifndef HAVE_GETPAGESIZE - -#include <unistd.h> - -#if !defined getpagesize && defined _SC_PAGESIZE -# if ! (defined __VMS && __VMS_VER < 70000000) -# define getpagesize() sysconf (_SC_PAGESIZE) -# endif -#endif - -#if !defined getpagesize && defined __VMS -# ifdef __ALPHA -# define getpagesize() 8192 -# else -# define getpagesize() 512 -# endif -#endif - -/* This is for BeOS. */ -#if !defined getpagesize && HAVE_OS_H -# include <OS.h> -# if defined B_PAGE_SIZE -# define getpagesize() B_PAGE_SIZE -# endif -#endif - -/* This is for AmigaOS4.0. */ -#if !defined getpagesize && defined __amigaos4__ -# define getpagesize() 2048 -#endif - -#if !defined getpagesize && HAVE_SYS_PARAM_H -# include <sys/param.h> -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else -# ifdef NBPG -# ifndef CLSIZE -# define CLSIZE 1 -# endif -# define getpagesize() (NBPG * CLSIZE) -# else -# ifdef NBPC -# define getpagesize() NBPC -# endif -# endif -# endif -#endif - -#endif /* not HAVE_GETPAGESIZE */ diff -uNr gnulib.orig/lib/unistd.in.h gnulib/lib/unistd.in.h --- gnulib.orig/lib/unistd.in.h 2007-11-26 16:56:14.000000000 +0100 +++ gnulib/lib/unistd.in.h 2007-11-28 10:09:42.000000000 +0100 @@ -180,6 +180,61 @@ #endif +#if @GNULIB_GETPAGESIZE@ +# if [EMAIL PROTECTED]@ && @HAVE_GETPAGESIZE@ +/* Returns the memory page size. */ +extern int getpagesize (void); +# elif [EMAIL PROTECTED]@ +# if !defined getpagesize && defined _SC_PAGESIZE +# if ! (defined __VMS && __VMS_VER < 70000000) +# define getpagesize() sysconf (_SC_PAGESIZE) +# endif +# endif +# if !defined getpagesize && defined __VMS +# ifdef __ALPHA +# define getpagesize() 8192 +# else +# define getpagesize() 512 +# endif +# endif +/* This is for BeOS. */ +# if !defined getpagesize && HAVE_OS_H +# include <OS.h> +# if defined B_PAGE_SIZE +# define getpagesize() B_PAGE_SIZE +# endif +# endif +/* This is for AmigaOS4.0. */ +# if !defined getpagesize && defined __amigaos4__ +# define getpagesize() 2048 +# endif +# if !defined getpagesize && HAVE_SYS_PARAM_H +# include <sys/param.h> +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define CLSIZE 1 +# endif +# define getpagesize() (NBPG * CLSIZE) +# else +# ifdef NBPC +# define getpagesize() NBPC +# endif +# endif +# endif +# endif +# endif +#elif defined GNULIB_POSIXCHECK +# undef getpagesize +# define getpagesize() \ + (GL_LINK_WARNING ("getpagesize is unportable - " \ + "use gnulib module getpagesize for portability"), \ + getpagesize ()) +#endif + + #if @GNULIB_LCHOWN@ # if @REPLACE_LCHOWN@ /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE diff -uNr gnulib.orig/m4/getpagesize.m4 gnulib/m4/getpagesize.m4 --- gnulib.orig/m4/getpagesize.m4 2007-11-26 16:56:14.000000000 +0100 +++ gnulib/m4/getpagesize.m4 2007-11-28 09:57:06.000000000 +0100 @@ -1,13 +1,26 @@ -# getpagesize.m4 serial 6 -dnl Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. +# getpagesize.m4 serial 7 +dnl Copyright (C) 2002, 2004, 2005, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. -AC_DEFUN([gl_GETPAGESIZE], +AC_DEFUN([gl_FUNC_GETPAGESIZE], [ - dnl Prerequisites of lib/getpagesize.h. - AC_CHECK_HEADERS_ONCE(sys/param.h) - AC_CHECK_HEADERS(OS.h) - AC_CHECK_FUNCS(getpagesize) + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + AC_CHECK_DECLS_ONCE([getpagesize]) + if test $ac_cv_have_decl_getpagesize = no; then + HAVE_DECL_GETPAGESIZE=0 + fi + AC_CHECK_FUNCS_ONCE([getpagesize]) + if test $ac_cv_func_getpagesize = no; then + HAVE_GETPAGESIZE=0 + gl_PREREQ_GETPAGESIZE + fi +]) + +# Prerequisites of getpagesize in <unistd.h> +AC_DEFUN([gl_PREREQ_GETPAGESIZE], +[ + AC_CHECK_HEADERS_ONCE([sys/param.h]) + AC_CHECK_HEADERS([OS.h]) ]) diff -uNr gnulib.orig/m4/unistd_h.m4 gnulib/m4/unistd_h.m4 --- gnulib.orig/m4/unistd_h.m4 2007-11-26 16:56:14.000000000 +0100 +++ gnulib/m4/unistd_h.m4 2007-11-28 09:58:33.000000000 +0100 @@ -1,4 +1,4 @@ -# unistd_h.m4 serial 9 +# unistd_h.m4 serial 10 dnl Copyright (C) 2006-2007 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,25 +32,28 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS], [ - GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) - GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) - GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) - GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) - GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) - GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) - GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) - GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK]) - GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) - GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) + GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) + GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) + GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) + GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) + GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) + GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) + GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE]) + GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) + GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK]) + GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) + GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) dnl Assume proper GNU behavior unless another module says otherwise. - HAVE_DUP2=1; AC_SUBST([HAVE_DUP2]) - HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) - HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) - HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) - HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) - REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) - REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR]) - REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) - REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) - REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) + HAVE_DUP2=1; AC_SUBST([HAVE_DUP2]) + HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) + HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) + HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) + HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) + HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) + HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE]) + REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) + REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR]) + REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) + REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) + REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) ]) diff -uNr gnulib.orig/modules/getpagesize gnulib/modules/getpagesize --- gnulib.orig/modules/getpagesize 2007-11-26 16:56:14.000000000 +0100 +++ gnulib/modules/getpagesize 2007-11-28 09:55:05.000000000 +0100 @@ -2,18 +2,19 @@ getpagesize() function: Return memory page size. Files: -lib/getpagesize.h m4/getpagesize.m4 Depends-on: +unistd configure.ac: -gl_GETPAGESIZE +gl_FUNC_GETPAGESIZE +gl_UNISTD_MODULE_INDICATOR([getpagesize]) Makefile.am: Include: -"getpagesize.h" +<unistd.h> License: LGPL diff -uNr gnulib.orig/modules/unistd gnulib/modules/unistd --- gnulib.orig/modules/unistd 2007-11-26 16:56:14.000000000 +0100 +++ gnulib/modules/unistd 2007-11-28 09:59:38.000000000 +0100 @@ -29,15 +29,18 @@ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \ -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \ + -e 's|@''GNULIB_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \ -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \ -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \ -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \ -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ + -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ + -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \