Actually, some modules in gnulib already use 'environ'. So this requires handling in gnulib. I'm adding a new module 'environ'.
Eric Blake wrote: > | This variable is missing on some platforms: > | MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, > Cygwin. > > Actually, cygwin has environ. Probably all of them, except MacOS X 10.5, have 'environ'. The "nm" command that I used to look for the 'environ' variable was not appropriate. I'm removing this statement. 2008-02-24 Bruno Haible <[EMAIL PROTECTED]> New module 'environ'. * modules/environ: New file. * lib/unistd.in.h (environ): New declaration. * m4/environ.m4: New file. (gt_CHECK_VAR_DECL): Moved here from m4/setenv.m4. Undefine gt_cv_var after use. * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_ENVIRON and HAVE_DECL_ENVIRON. * modules/unistd (Makefile.am): Substitute also GNULIB_ENVIRON and HAVE_DECL_ENVIRON. * doc/posix-functions/environ.texi: Mention module 'environ'. Remove wrong claim that 'environ' is missing on some systems. * modules/execute (Depends-on): Add environ. * lib/execute.c (environ): Remove fallback declaration. * modules/pipe (Depends-on): Add environ. * lib/pipe.c (environ): Remove fallback declaration. * modules/setenv (Depends-on): Add environ. * lib/setenv.c (environ): Remove fallback declaration. * modules/unsetenv (Depends-on): Add environ. * lib/unsetenv.c (environ): Remove fallback declaration. * m4/setenv.m4 (gt_CHECK_VAR_DECL): Remove macro. Moved to m4/environ.m4. (gl_PREREQ_SETENV): Require gl_ENVIRON instead of testing for environ. (gl_PREREQ_UNSETENV): Likewise. ============================== modules/environ =============================== Description: environ variable: storage of environment variables. Files: m4/environ.m4 Depends-on: unistd configure.ac: gl_ENVIRON gl_UNISTD_MODULE_INDICATOR([environ]) Makefile.am: Include: #include <unistd.h> License: LGPLv2+ Maintainer: Bruno Haible =============================== m4/environ.m4 ================================ # environ.m4 serial 1 dnl Copyright (C) 2001-2004, 2006-2008 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_ENVIRON], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl Persuade glibc <unistd.h> to declare environ. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) gt_CHECK_VAR_DECL([#include <unistd.h>], environ) if test $gt_cv_var_environ_declaration != yes; then HAVE_DECL_ENVIRON=0 fi ]) # Check if a variable is properly declared. # gt_CHECK_VAR_DECL(includes,variable) AC_DEFUN([gt_CHECK_VAR_DECL], [ define([gt_cv_var], [gt_cv_var_]$2[_declaration]) AC_MSG_CHECKING([if $2 is properly declared]) AC_CACHE_VAL(gt_cv_var, [ AC_TRY_COMPILE([$1 extern struct { int foo; } $2;], [$2.foo = 1;], gt_cv_var=no, gt_cv_var=yes)]) AC_MSG_RESULT($gt_cv_var) if test $gt_cv_var = yes; then AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z])[_DECL], 1, [Define if you have the declaration of $2.]) fi undefine([gt_cv_var]) ]) *** doc/posix-functions/environ.texi.orig 2008-02-24 16:38:57.000000000 +0100 --- doc/posix-functions/environ.texi 2008-02-24 16:21:51.000000000 +0100 *************** *** 4,20 **** POSIX specification: @url{http://www.opengroup.org/susv3xsh/environ.html} ! Gnulib module: --- Portability problems fixed by Gnulib: @itemize - @end itemize - - Portability problems not fixed by Gnulib: - @itemize @item ! This variable is missing on some platforms: ! MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin. @item On MacOS X 10, this variable is not declared. Up to MacOS X 10.4, one can use @smallexample --- 4,17 ---- POSIX specification: @url{http://www.opengroup.org/susv3xsh/environ.html} ! Gnulib module: environ Portability problems fixed by Gnulib: @itemize @item ! POSIX does not require this variable to be declared, and it is indeed not ! declared on some platforms: ! MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Solaris 10. @item On MacOS X 10, this variable is not declared. Up to MacOS X 10.4, one can use @smallexample *************** *** 27,32 **** --- 24,33 ---- #define environ (*_NSGetEnviron()) @end smallexample This works at least on MacOS X 10.3 and newer. + @end itemize + + Portability problems not fixed by Gnulib: + @itemize @item The address of this variable is not a compile-time constant on some platforms: mingw. *** lib/execute.c.orig 2008-02-24 16:38:57.000000000 +0100 --- lib/execute.c 2008-02-24 15:56:21.000000000 +0100 *************** *** 1,5 **** /* Creation of autonomous subprocesses. ! Copyright (C) 2001-2004, 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible <[EMAIL PROTECTED]>, 2001. This program is free software: you can redistribute it and/or modify --- 1,5 ---- /* Creation of autonomous subprocesses. ! Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc. Written by Bruno Haible <[EMAIL PROTECTED]>, 2001. This program is free software: you can redistribute it and/or modify *************** *** 54,63 **** #endif - #if ! HAVE_ENVIRON_DECL - extern char **environ; - #endif - #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif --- 54,59 ---- *** lib/pipe.c.orig 2008-02-24 16:38:57.000000000 +0100 --- lib/pipe.c 2008-02-24 15:56:33.000000000 +0100 *************** *** 1,5 **** /* Creation of subprocesses, communicating via pipes. ! Copyright (C) 2001-2004, 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible <[EMAIL PROTECTED]>, 2001. This program is free software: you can redistribute it and/or modify --- 1,5 ---- /* Creation of subprocesses, communicating via pipes. ! Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc. Written by Bruno Haible <[EMAIL PROTECTED]>, 2001. This program is free software: you can redistribute it and/or modify *************** *** 53,62 **** #endif - #if ! HAVE_ENVIRON_DECL - extern char **environ; - #endif - #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif --- 53,58 ---- *** lib/setenv.c.orig 2008-02-24 16:38:57.000000000 +0100 --- lib/setenv.c 2008-02-24 15:58:00.000000000 +0100 *************** *** 1,4 **** ! /* Copyright (C) 1992,1995-1999,2000-2003,2005-2007 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify --- 1,4 ---- ! /* Copyright (C) 1992,1995-1999,2000-2003,2005-2008 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify *************** *** 40,48 **** #if !_LIBC # define __environ environ - # ifndef HAVE_ENVIRON_DECL - extern char **environ; - # endif #endif #if _LIBC --- 40,45 ---- *** lib/unistd.in.h.orig 2008-02-24 16:38:57.000000000 +0100 --- lib/unistd.in.h 2008-02-24 16:28:02.000000000 +0100 *************** *** 1,5 **** /* Substitute for and wrapper around <unistd.h>. ! Copyright (C) 2004-2007 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 --- 1,5 ---- /* Substitute for and wrapper around <unistd.h>. ! Copyright (C) 2004-2008 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 *************** *** 86,91 **** --- 86,111 ---- #endif + #if @GNULIB_ENVIRON@ + # if [EMAIL PROTECTED]@ + /* Set of environment variables and values. An array of strings of the form + "VARIABLE=VALUE", terminated with a NULL. */ + # if defined __APPLE__ && defined __MACH__ + # include <crt_externs.h> + # define environ (*_NSGetEnviron ()) + # else + extern char **environ; + # endif + # endif + #elif defined GNULIB_POSIXCHECK + # undef environ + # define environ \ + (GL_LINK_WARNING ("environ is unportable - " \ + "use gnulib module environ for portability"), \ + environ) + #endif + + #if @GNULIB_FCHDIR@ # if @REPLACE_FCHDIR@ *** lib/unsetenv.c.orig 2008-02-24 16:38:57.000000000 +0100 --- lib/unsetenv.c 2008-02-24 15:58:17.000000000 +0100 *************** *** 1,4 **** ! /* Copyright (C) 1992,1995-1999,2000-2002,2005-2007 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify --- 1,4 ---- ! /* Copyright (C) 1992,1995-1999,2000-2002,2005-2008 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify *************** *** 29,37 **** #if !_LIBC # define __environ environ - # ifndef HAVE_ENVIRON_DECL - extern char **environ; - # endif #endif #if _LIBC --- 29,34 ---- *** m4/setenv.m4.orig 2008-02-24 16:38:57.000000000 +0100 --- m4/setenv.m4 2008-02-24 16:30:00.000000000 +0100 *************** *** 1,5 **** ! # setenv.m4 serial 9 ! dnl Copyright (C) 2001-2004, 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, dnl with or without modifications, as long as this notice is preserved. --- 1,5 ---- ! # setenv.m4 serial 10 ! dnl Copyright (C) 2001-2004, 2006-2008 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. *************** *** 53,90 **** fi ]) - # Check if a variable is properly declared. - # gt_CHECK_VAR_DECL(includes,variable) - AC_DEFUN([gt_CHECK_VAR_DECL], - [ - define([gt_cv_var], [gt_cv_var_]$2[_declaration]) - AC_MSG_CHECKING([if $2 is properly declared]) - AC_CACHE_VAL(gt_cv_var, [ - AC_TRY_COMPILE([$1 - extern struct { int foo; } $2;], - [$2.foo = 1;], - gt_cv_var=no, - gt_cv_var=yes)]) - AC_MSG_RESULT($gt_cv_var) - if test $gt_cv_var = yes; then - AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z])[_DECL], 1, - [Define if you have the declaration of $2.]) - fi - ]) - # Prerequisites of lib/setenv.c. AC_DEFUN([gl_PREREQ_SETENV], [ AC_REQUIRE([AC_FUNC_ALLOCA]) AC_CHECK_HEADERS_ONCE(unistd.h) AC_CHECK_HEADERS(search.h) AC_CHECK_FUNCS(tsearch) - gt_CHECK_VAR_DECL([#include <unistd.h>], environ) ]) # Prerequisites of lib/unsetenv.c. AC_DEFUN([gl_PREREQ_UNSETENV], [ AC_CHECK_HEADERS_ONCE(unistd.h) - gt_CHECK_VAR_DECL([#include <unistd.h>], environ) ]) --- 53,71 ---- fi ]) # Prerequisites of lib/setenv.c. AC_DEFUN([gl_PREREQ_SETENV], [ AC_REQUIRE([AC_FUNC_ALLOCA]) + AC_REQUIRE([gl_ENVIRON]) AC_CHECK_HEADERS_ONCE(unistd.h) AC_CHECK_HEADERS(search.h) AC_CHECK_FUNCS(tsearch) ]) # Prerequisites of lib/unsetenv.c. AC_DEFUN([gl_PREREQ_UNSETENV], [ + AC_REQUIRE([gl_ENVIRON]) AC_CHECK_HEADERS_ONCE(unistd.h) ]) *** m4/unistd_h.m4.orig 2008-02-24 16:38:57.000000000 +0100 --- m4/unistd_h.m4 2008-02-24 16:31:48.000000000 +0100 *************** *** 1,5 **** ! # 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, dnl with or without modifications, as long as this notice is preserved. --- 1,5 ---- ! # unistd_h.m4 serial 11 ! dnl Copyright (C) 2006-2008 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. *************** *** 34,39 **** --- 34,40 ---- [ GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) + GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON]) GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) *************** *** 49,54 **** --- 50,56 ---- HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) + HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) 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]) *** modules/execute.orig 2008-02-24 16:38:57.000000000 +0100 --- modules/execute 2008-02-24 15:42:34.000000000 +0100 *************** *** 16,21 **** --- 16,22 ---- stdbool strpbrk unistd + environ configure.ac: gl_EXECUTE *** modules/pipe.orig 2008-02-24 16:38:57.000000000 +0100 --- modules/pipe 2008-02-24 15:42:25.000000000 +0100 *************** *** 16,21 **** --- 16,22 ---- stdbool strpbrk unistd + environ configure.ac: gl_PIPE *** modules/setenv.orig 2008-02-24 16:38:57.000000000 +0100 --- modules/setenv 2008-02-24 15:55:42.000000000 +0100 *************** *** 10,15 **** --- 10,16 ---- malloca alloca-opt unistd + environ configure.ac: gl_FUNC_SETENV *** modules/unistd.orig 2008-02-24 16:38:57.000000000 +0100 --- modules/unistd 2008-02-24 16:33:40.000000000 +0100 *************** *** 25,30 **** --- 25,31 ---- -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \ -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \ + -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \ -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \ *************** *** 39,44 **** --- 40,46 ---- -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_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ *** modules/unsetenv.orig 2008-02-24 16:38:57.000000000 +0100 --- modules/unsetenv 2008-02-24 15:55:50.000000000 +0100 *************** *** 8,13 **** --- 8,14 ---- Depends-on: stdlib unistd + environ configure.ac: gl_FUNC_UNSETENV