+2016-10-01 Jim Meyering <meyering@fb.com>
+
+ 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 <meyering@fb.com>
u8-uctomb-aux.c: build: placate GCC 7's new -Wimplicit-fallthrough
# 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
# 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 <errno.h>])
- AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include <errno.h>])
- AC_CHECK_DECLS([__argv], [], [], [#include <stdlib.h>])
- AC_CHECK_DECLS([__progname], [], [], [char *__progname;])
+ ac_found=0
+ AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [],
+ [#include <errno.h>])
+ AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [],
+ [#include <errno.h>])
+ AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include <stdlib.h>])
+
+ # 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
])