This should work for Solaris and BSD variants; further extensions might be needed to produce a good QoI on other targets (but at least the library should still build there).
Tested on x86_64, aarch64 and powerpc64le Linux and on x86_64-darwin21/23. Checked manually that the configurations were as expected and that the correct symbols were referenced by libgcobol. Pushed to trunk as a bootstrap fix (and per Robert's "do what's needed"). thanks, Iain --- 8< --- program_invocation_short_name is not widely available, however getprogname() appears to be a suitable replacement. Amend the library configuration to look for both. Use program_invocation_short_name in preference to getprogname() when it is available. If neither is found fall back to a constant string. libgcobol/ChangeLog: * config.h.in: Regenerate. * configure: Regenerate. * configure.ac: Check for program_invocation_short_name and and getprogname(). * libgcobol.cc (default_exception_handler): When the platform has program_invocation_short_name, use it otherwise fall back to using getprogname() or a constant string (if neither interface is available). Signed-off-by: Iain Sandoe <i...@sandoe.co.uk> --- libgcobol/config.h.in | 10 ++++++ libgcobol/configure | 81 ++++++++++++++++++++++++++++++++++++++++-- libgcobol/configure.ac | 14 +++++++- libgcobol/libgcobol.cc | 15 ++++++-- 4 files changed, 114 insertions(+), 6 deletions(-) diff --git a/libgcobol/config.h.in b/libgcobol/config.h.in index fdf5e3e7dc1..ee3dd6b2151 100644 --- a/libgcobol/config.h.in +++ b/libgcobol/config.h.in @@ -6,9 +6,16 @@ /* Define to 1 if you have the <complex.h> header file. */ #undef HAVE_COMPLEX_H +/* Define to 1 if you have the declaration of `program_invocation_short_name', + and to 0 if you don't. */ +#undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME + /* Define to 1 if you have the <dlfcn.h> header file. */ #undef HAVE_DLFCN_H +/* Define to 1 if you have the <errno.h> header file. */ +#undef HAVE_ERRNO_H + /* Define to 1 if you have the <fenv.h> header file. */ #undef HAVE_FENV_H @@ -21,6 +28,9 @@ /* Define to 1 if you have the <fptrap.h> header file. */ #undef HAVE_FPTRAP_H +/* Define to 1 if you have the `getprogname' function. */ +#undef HAVE_GETPROGNAME + /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV diff --git a/libgcobol/configure b/libgcobol/configure index 6821591852a..06e7544822c 100755 --- a/libgcobol/configure +++ b/libgcobol/configure @@ -2380,6 +2380,52 @@ $as_echo "$ac_res" >&6; } } # ac_fn_cxx_check_header_compile +# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES +# ----------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_cxx_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_decl + # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly @@ -2796,6 +2842,8 @@ as_fn_append ac_header_list " fenv.h" as_fn_append ac_header_list " fptrap.h" as_fn_append ac_header_list " complex.h" as_fn_append ac_header_list " stdlib.h" +as_fn_append ac_header_list " errno.h" +as_fn_append ac_func_list " getprogname" as_fn_append ac_func_list " random_r" as_fn_append ac_func_list " srandom_r" as_fn_append ac_func_list " initstate_r" @@ -11750,7 +11798,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11753 "configure" +#line 11801 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11856,7 +11904,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11859 "configure" +#line 11907 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -17016,7 +17064,29 @@ done -# These are GLIBC + + +# Look for a way to represent the program name +# First, check the GLIBC case +ac_fn_cxx_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" " +#if HAVE_ERRNO_H +# define _GNU_SOURCE +# include <errno.h> +#endif + +" +if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl +_ACEOF + + +# Check an alternate @@ -17036,6 +17106,11 @@ done +# These are GLIBC + + + + diff --git a/libgcobol/configure.ac b/libgcobol/configure.ac index 4bb690559ad..e2547637209 100644 --- a/libgcobol/configure.ac +++ b/libgcobol/configure.ac @@ -188,7 +188,19 @@ esac AC_SUBST(extra_ldflags_libgcobol) AC_CHECK_HEADERS_ONCE(floatingpoint.h ieeefp.h fenv.h fptrap.h \ -complex.h stdlib.h) +complex.h stdlib.h errno.h) + +# Look for a way to represent the program name +# First, check the GLIBC case +AC_CHECK_DECLS([program_invocation_short_name], , ,[ +#if HAVE_ERRNO_H +# define _GNU_SOURCE +# include <errno.h> +#endif +]) + +# Check an alternate +AC_CHECK_FUNCS_ONCE(getprogname) # These are GLIBC AC_CHECK_FUNCS_ONCE(random_r srandom_r initstate_r setstate_r) diff --git a/libgcobol/libgcobol.cc b/libgcobol/libgcobol.cc index 2fefd14ffeb..d5fa5b1490e 100644 --- a/libgcobol/libgcobol.cc +++ b/libgcobol/libgcobol.cc @@ -50,6 +50,9 @@ #include <signal.h> #include <syslog.h> #include <unistd.h> +#if __has_include(<errno.h>) +# include <errno.h> // for program_invocation_short_name +#endif #include "config.h" #include "libgcobol-fp.h" @@ -11179,10 +11182,18 @@ match_declarative( bool enabled, static void default_exception_handler( ec_type_t ec ) { - extern char *program_invocation_short_name; +#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME + /* Declared in errno.h, when available. */ + const char *ident = program_invocation_short_name; +#elif defined (HAVE_GETPROGNAME) + /* Declared in stdlib.h. */ + const char *ident = getprogname(); +#else + /* Avoid a NULL entry. */ + const char *ident = "unnamed_COBOL_program"; +#endif static bool first_time = true; static int priority = LOG_INFO, option = LOG_PERROR, facility = LOG_USER; - const char *ident = program_invocation_short_name; ec_disposition_t disposition = ec_category_fatal_e; if( first_time ) { -- 2.39.2 (Apple Git-143)