bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
From: Bruno Haible <bruno@clisp.org>
To: bug-gnulib@gnu.org
Subject: getprogname: Move declaration from "getprogname.h" to <stdlib.h>
Date: Sat, 21 Jan 2023 09:56:12 +0100	[thread overview]
Message-ID: <2228587.e3iEh8JYqD@nimes> (raw)

Why is the getprogname() function declared in "getprogname.h"?

All platforms that have this function — Mac OS X, FreeBSD, NetBSD,
OpenBSD >= 5.4, Solaris >= 11, Cygwin, Android API level >= 21 —
declare it in <stdlib.h>. It thus appears very unlikely that, if
glibc ever adds this function, they would choose to declare it
in a header file other than <stdlib.h>.

I can find no rationale in the mailing list archive from 2016.

So, it makes sense to move the declaration of this function to <stdlib.h>.
For a transition period, "getprogname.h" can continue to exist, but will
emit a deprecation warning.


2023-01-21  Bruno Haible  <bruno@clisp.org>

	getprogname: Move declaration from "getprogname.h" to <stdlib.h>.
	* lib/stdlib.in.h (getprogname): New declaration.
	* lib/getprogname.h: Add deprecation warning.
	(getprogname): Remove declaration.
	* lib/getprogname.c: Include <stdlib.h> instead of getprogname.h.
	* m4/stdlib_h.m4 (gl_STDLIB_H): Test whether getprogname is declared.
	(gl_STDLIB_H_REQUIRE_DEFAULTS): Initialize GNULIB_GETPROGNAME.
	(gl_STDLIB_H_DEFAULTS): Initialize HAVE_GETPROGNAME.
	* m4/getprogname.m4 (gl_PREREQ_GETPROGNAME): New macro, extracted from
	gl_FUNC_GETPROGNAME. Set HAVE_GETPROGNAME.
	(gl_FUNC_GETPROGNAME): Remove code that was moved to
	gl_PREREQ_GETPROGNAME.
	* modules/stdlib (Makefile.am): Substitute GNULIB_GETPROGNAME and
	HAVE_GETPROGNAME.
	* modules/getprogname (Depends-on): Add stdlib.
	(configure.ac): Define a module indicator. Invoke gl_PREREQ_GETPROGNAME.
	(Makefile.am): Don't compile getprogname.c if not needed.
	(Include): List <stdlib.h> instead of getprogname.h.
	* tests/test-getprogname.c: Include <stdlib.h> instead of getprogname.h.
	* NEWS: Mention the change.
	* lib/argmatch.c: Don't include getprogname.h.
	* lib/c-stack.c: Likewise.
	* lib/error.c: Likewise.
	* lib/git-merge-changelog.c: Likewise.

diff --git a/NEWS b/NEWS
index b54781a6f8..e8cc0c4ae7 100644
--- a/NEWS
+++ b/NEWS
@@ -74,6 +74,9 @@ User visible incompatible changes
 
 Date        Modules         Changes
 
+2023-01-21  getprogname     The include file is changed from "getprogname.h"
+                            to <stdlib.h>.
+
 2023-01-15  stdalign        This module is deprecated.  Use alignasof instead.
 
 2023-01-07  timer_time      Link with $(TIMER_TIME_LIB) instead of
diff --git a/lib/argmatch.c b/lib/argmatch.c
index 1e5b77bf32..9cddb37d69 100644
--- a/lib/argmatch.c
+++ b/lib/argmatch.c
@@ -32,7 +32,6 @@
 
 #include "error.h"
 #include "quotearg.h"
-#include "getprogname.h"
 
 #if USE_UNLOCKED_IO
 # include "unlocked-io.h"
diff --git a/lib/c-stack.c b/lib/c-stack.c
index 079d86846d..f0078d51ad 100644
--- a/lib/c-stack.c
+++ b/lib/c-stack.c
@@ -52,7 +52,6 @@
 #include <sigsegv.h>
 
 #include "exitfail.h"
-#include "getprogname.h"
 #include "idx.h"
 #include "ignore-value.h"
 
diff --git a/lib/error.c b/lib/error.c
index 6875f134ed..ef4372875f 100644
--- a/lib/error.c
+++ b/lib/error.c
@@ -42,8 +42,6 @@
 # define USE_UNLOCKED_IO 0
 # define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(a, b)
 # define _GL_ARG_NONNULL(a)
-#else
-# include "getprogname.h"
 #endif
 
 #if USE_UNLOCKED_IO
diff --git a/lib/getprogname.c b/lib/getprogname.c
index 32c96043b0..279d79f012 100644
--- a/lib/getprogname.c
+++ b/lib/getprogname.c
@@ -16,11 +16,10 @@
 
 #include <config.h>
 
-/* Specification.  */
-#include "getprogname.h"
+/* Specification.  Also get __argv declaration.  */
+#include <stdlib.h>
 
 #include <errno.h> /* get program_invocation_name declaration */
-#include <stdlib.h> /* get __argv declaration */
 
 #ifdef _AIX
 # include <unistd.h>
@@ -53,13 +52,12 @@
 
 #if defined __SCO_VERSION__ || defined __sysv5__
 # include <fcntl.h>
-# include <stdlib.h>
 # include <string.h>
 #endif
 
 #include "basename-lgpl.h"
 
-#ifndef HAVE_GETPROGNAME             /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */
+#ifndef HAVE_GETPROGNAME  /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Solaris >= 11, Cygwin, Android API level >= 21 */
 char const *
 getprogname (void)
 {
diff --git a/lib/getprogname.h b/lib/getprogname.h
index 4b9126f9d7..13314f21e2 100644
--- a/lib/getprogname.h
+++ b/lib/getprogname.h
@@ -19,22 +19,8 @@
 
 #include <stdlib.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Return the base name of the executing program.
-   On native Windows this will usually end in ".exe" or ".EXE". */
-#ifndef HAVE_GETPROGNAME
-extern char const *getprogname (void)
-# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
-  _GL_ATTRIBUTE_PURE
-# endif
-  ;
-#endif
-
-#ifdef __cplusplus
-}
+#if __GNUC__ || (__clang_major__ >= 4)
+# warning "The include file getprogname.h is deprecated. Use <stdlib.h> instead."
 #endif
 
 #endif
diff --git a/lib/git-merge-changelog.c b/lib/git-merge-changelog.c
index 5708dd5eac..67a932c5df 100644
--- a/lib/git-merge-changelog.c
+++ b/lib/git-merge-changelog.c
@@ -176,7 +176,6 @@
 #include "minmax.h"
 #include "c-strstr.h"
 #include "fwriteerror.h"
-#include "getprogname.h"
 
 #define ASSERT(expr) \
   do                                                                         \
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
index b79e5f7096..55f31feb42 100644
--- a/lib/stdlib.in.h
+++ b/lib/stdlib.in.h
@@ -430,6 +430,26 @@ _GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
 # endif
 #endif
 
+#if @GNULIB_GETPROGNAME@
+/* Return the base name of the executing program.
+   On native Windows this will usually end in ".exe" or ".EXE". */
+# if !@HAVE_GETPROGNAME@
+#  ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+_GL_FUNCDECL_SYS (getprogname, const char *, (void) _GL_ATTRIBUTE_PURE);
+#  else
+_GL_FUNCDECL_SYS (getprogname, const char *, (void));
+#  endif
+# endif
+_GL_CXXALIAS_SYS (getprogname, const char *, (void));
+_GL_CXXALIASWARN (getprogname);
+#elif defined GNULIB_POSIXCHECK
+# undef getprogname
+# if HAVE_RAW_DECL_GETPROGNAME
+_GL_WARN_ON_USE (getprogname, "getprogname is unportable - "
+                 "use gnulib module getprogname for portability");
+# endif
+#endif
+
 #if @GNULIB_GETSUBOPT@
 /* Assuming *OPTIONP is a comma separated list of elements of the form
    "token" or "token=value", getsubopt parses the first of these elements.
diff --git a/m4/getprogname.m4 b/m4/getprogname.m4
index 7c306c80a9..0a4b9c874a 100644
--- a/m4/getprogname.m4
+++ b/m4/getprogname.m4
@@ -5,12 +5,19 @@
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
+# serial 6
 
 AC_DEFUN([gl_FUNC_GETPROGNAME],
 [
-  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
   gl_CHECK_FUNCS_ANDROID([getprogname], [[#include <stdlib.h>]])
+  if test $ac_cv_func_getprogname = no; then
+    HAVE_GETPROGNAME=0
+  fi
+])
+
+AC_DEFUN([gl_PREREQ_GETPROGNAME],
+[
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
   AC_CHECK_FUNCS_ONCE([getexecname])
   ac_found=0
   AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [],
diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4
index e96be22f58..f1f2d04047 100644
--- a/m4/stdlib_h.m4
+++ b/m4/stdlib_h.m4
@@ -1,4 +1,4 @@
-# stdlib_h.m4 serial 66
+# stdlib_h.m4 serial 67
 dnl Copyright (C) 2007-2023 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -23,7 +23,7 @@ AC_DEFUN_ONCE([gl_STDLIB_H],
 # include <random.h>
 #endif
     ]], [_Exit aligned_alloc atoll canonicalize_file_name free
-    getloadavg getsubopt grantpt
+    getloadavg getprogname getsubopt grantpt
     initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps
     posix_memalign posix_openpt ptsname ptsname_r qsort_r
     random random_r reallocarray realpath rpmatch secure_getenv setenv
@@ -73,6 +73,7 @@ AC_DEFUN([gl_STDLIB_H_REQUIRE_DEFAULTS],
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CANONICALIZE_FILE_NAME])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREE_POSIX])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOADAVG])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPROGNAME])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSUBOPT])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GRANTPT])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MALLOC_GNU])
@@ -130,6 +131,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
   HAVE_DECL_FCVT=1;          AC_SUBST([HAVE_DECL_FCVT])
   HAVE_DECL_GCVT=1;          AC_SUBST([HAVE_DECL_GCVT])
   HAVE_DECL_GETLOADAVG=1;    AC_SUBST([HAVE_DECL_GETLOADAVG])
+  HAVE_GETPROGNAME=1;        AC_SUBST([HAVE_GETPROGNAME])
   HAVE_GETSUBOPT=1;          AC_SUBST([HAVE_GETSUBOPT])
   HAVE_GRANTPT=1;            AC_SUBST([HAVE_GRANTPT])
   HAVE_INITSTATE=1;          AC_SUBST([HAVE_INITSTATE])
diff --git a/modules/getprogname b/modules/getprogname
index 94e55186d5..dadbffbbd6 100644
--- a/modules/getprogname
+++ b/modules/getprogname
@@ -7,18 +7,26 @@ lib/getprogname.c
 m4/getprogname.m4
 
 Depends-on:
-basename-lgpl
-extensions
-open
+stdlib
+basename-lgpl   [test $HAVE_GETPROGNAME = 0]
+extensions      [test $HAVE_GETPROGNAME = 0]
+open            [test $HAVE_GETPROGNAME = 0]
 
 configure.ac:
 gl_FUNC_GETPROGNAME
+gl_CONDITIONAL([GL_COND_OBJ_GETPROGNAME], [test $HAVE_GETPROGNAME = 0])
+AM_COND_IF([GL_COND_OBJ_GETPROGNAME], [
+  gl_PREREQ_GETPROGNAME
+])
+gl_STDLIB_MODULE_INDICATOR([getprogname])
 
 Makefile.am:
-lib_SOURCES += getprogname.h getprogname.c
+if GL_COND_OBJ_GETPROGNAME
+lib_SOURCES += getprogname.c
+endif
 
 Include:
-"getprogname.h"
+<stdlib.h>
 
 License:
 LGPLv2+
diff --git a/modules/stdlib b/modules/stdlib
index 45d8f59331..1e6e18f53c 100644
--- a/modules/stdlib
+++ b/modules/stdlib
@@ -42,6 +42,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
 	      -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
 	      -e 's/@''GNULIB_FREE_POSIX''@/$(GNULIB_FREE_POSIX)/g' \
 	      -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
+	      -e 's/@''GNULIB_GETPROGNAME''@/$(GNULIB_GETPROGNAME)/g' \
 	      -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
 	      -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
 	      -e 's/@''GNULIB_MALLOC_GNU''@/$(GNULIB_MALLOC_GNU)/g' \
@@ -91,6 +92,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
 	      -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
 	      -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
 	      -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+	      -e 's|@''HAVE_GETPROGNAME''@|$(HAVE_GETPROGNAME)|g' \
 	      -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
 	      -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
 	      -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
diff --git a/tests/test-getprogname.c b/tests/test-getprogname.c
index 0c1f1fcfa7..168c0cb91c 100644
--- a/tests/test-getprogname.c
+++ b/tests/test-getprogname.c
@@ -16,7 +16,8 @@
 
 #include <config.h>
 
-#include "getprogname.h"
+#include <stdlib.h>
+
 #include <string.h>
 #include <assert.h>
 





             reply	other threads:[~2023-01-21  8:56 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-21  8:56 Bruno Haible [this message]
2023-01-21 21:19 ` getprogname: Move declaration from "getprogname.h" to <stdlib.h> Paul Eggert
2023-01-22  0:10   ` Bruno Haible
2023-01-22  4:57     ` Paul Eggert
2023-01-22 10:04       ` transition periods Bruno Haible

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.gnu.org/mailman/listinfo/bug-gnulib

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2228587.e3iEh8JYqD@nimes \
    --to=bruno@clisp.org \
    --cc=bug-gnulib@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).