From: Jim Meyering Date: Sun, 2 Oct 2016 02:53:52 +0000 (-0700) Subject: getprogname: correct the test for a __progname variable X-Git-Tag: v1.0~6621 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=65e69153ddab1cd4ae540d02ac2d030638aab3cc;p=gnulib.git getprogname: correct the test for a __progname variable * m4/getprogname.m4 (gl_FUNC_GETPROGNAME): Use AC_CACHE_CHECK and AC_LINK_IFELSE to check for a global __progname. If found, define HAVE_VAR___PROGNAME. * lib/getprogname.c (getprogname): Reflect the new name of the preprocessor symbol: s/HAVE_DECL___PROGNAME/HAVE_VAR___PROGNAME/ Assaf Gordon reported that the erroneous prior check caused link failure on AIX 7 in https://lists.gnu.org/archive/html/grep-devel/2016-10/msg00001.html --- diff --git a/ChangeLog b/ChangeLog index e9b4c80fee..7c848c46cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2016-10-01 Jim Meyering + + getprogname: correct the test for a __progname variable + * m4/getprogname.m4 (gl_FUNC_GETPROGNAME): Use AC_CACHE_CHECK + and AC_LINK_IFELSE to check for a global __progname. If found, + define HAVE_VAR___PROGNAME. + * lib/getprogname.c (getprogname): Reflect the new name of the + feature- checked preprocessor symbol: + s/HAVE_DECL___PROGNAME/HAVE_VAR___PROGNAME/ + 2016-09-28 Jim Meyering u8-uctomb-aux.c: build: placate GCC 7's new -Wimplicit-fallthrough diff --git a/lib/getprogname.c b/lib/getprogname.c index 7de231768f..97a6aef943 100644 --- a/lib/getprogname.c +++ b/lib/getprogname.c @@ -47,7 +47,7 @@ getprogname (void) # elif HAVE_DECL___ARGV const char *p = __argv && __argv[0] ? __argv[0] : "?"; return last_component (p); -# elif HAVE_DECL___PROGNAME +# elif HAVE_VAR___PROGNAME /* Be careful to declare this only when we absolutely need it (OpenBSD 5.1), rather than when it's available. Otherwise, its mere declaration makes program_invocation_short_name diff --git a/m4/getprogname.m4 b/m4/getprogname.m4 index ec3ac8fb21..f027037fc6 100644 --- a/m4/getprogname.m4 +++ b/m4/getprogname.m4 @@ -5,14 +5,39 @@ # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 AC_DEFUN([gl_FUNC_GETPROGNAME], [ AC_CHECK_FUNCS_ONCE([getprogname getexecname]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) - AC_CHECK_DECLS([program_invocation_name], [], [], [#include ]) - AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include ]) - AC_CHECK_DECLS([__argv], [], [], [#include ]) - AC_CHECK_DECLS([__progname], [], [], [char *__progname;]) + ac_found=0 + AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [], + [#include ]) + AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [], + [#include ]) + AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include ]) + + # Incur the cost of this test only if none of the above worked. + if test $ac_found = 0; then + # On OpenBSD 5.1, using the global __progname variable appears to be + # the only way to implement getprogname. + AC_CACHE_CHECK([whether __progname is defined in default libraries], + [gl_cv_var___progname], + [ + gl_cv_var___progname= + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[extern char *__progname;]], + [[return *__progname;]] + )], + [gl_cv_var___progname=yes] + ) + ] + ) + if test "$gl_cv_var___progname" = yes; then + AC_DEFINE([HAVE_VAR___PROGNAME], 1, + [Define if you have a global __progname variable]) + fi + fi ])