Bump to m4 1.4.19
[platform/upstream/m4.git] / m4 / setenv.m4
1 # setenv.m4 serial 30
2 dnl Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_DEFUN([gl_FUNC_SETENV],
8 [
9   AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
10   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
11   if test $ac_cv_func_setenv = no; then
12     HAVE_SETENV=0
13   else
14     AC_CACHE_CHECK([whether setenv validates arguments],
15       [gl_cv_func_setenv_works],
16       [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
17        #include <stdlib.h>
18        #include <errno.h>
19        #include <string.h>
20       ]], [[
21        int result = 0;
22        {
23          if (setenv ("", "", 0) != -1)
24            result |= 1;
25          else if (errno != EINVAL)
26            result |= 2;
27        }
28        {
29          if (setenv ("a", "=", 1) != 0)
30            result |= 4;
31          else if (strcmp (getenv ("a"), "=") != 0)
32            result |= 8;
33        }
34        return result;
35       ]])],
36       [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
37       [case "$host_os" in
38                         # Guess yes on glibc systems.
39          *-gnu* | gnu*) gl_cv_func_setenv_works="guessing yes" ;;
40                         # Guess yes on musl systems.
41          *-musl*)       gl_cv_func_setenv_works="guessing yes" ;;
42                         # If we don't know, obey --enable-cross-guesses.
43          *)             gl_cv_func_setenv_works="$gl_cross_guess_normal" ;;
44        esac
45       ])])
46     case "$gl_cv_func_setenv_works" in
47       *yes) ;;
48       *)
49         REPLACE_SETENV=1
50         ;;
51     esac
52   fi
53 ])
54
55 # Like gl_FUNC_SETENV, except prepare for separate compilation
56 # (no REPLACE_SETENV, no AC_LIBOBJ).
57 AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
58 [
59   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
60   AC_CHECK_DECLS_ONCE([setenv])
61   if test $ac_cv_have_decl_setenv = no; then
62     HAVE_DECL_SETENV=0
63   fi
64   AC_CHECK_FUNCS_ONCE([setenv])
65   gl_PREREQ_SETENV
66 ])
67
68 AC_DEFUN([gl_FUNC_UNSETENV],
69 [
70   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
71   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
72   AC_CHECK_DECLS_ONCE([unsetenv])
73   if test $ac_cv_have_decl_unsetenv = no; then
74     HAVE_DECL_UNSETENV=0
75   fi
76   AC_CHECK_FUNCS([unsetenv])
77   if test $ac_cv_func_unsetenv = no; then
78     HAVE_UNSETENV=0
79   else
80     HAVE_UNSETENV=1
81     dnl Some BSDs return void, failing to do error checking.
82     AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
83       [AC_COMPILE_IFELSE(
84          [AC_LANG_PROGRAM(
85             [[
86 #undef _BSD
87 #define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
88 #include <stdlib.h>
89 extern
90 #ifdef __cplusplus
91 "C"
92 #endif
93 int unsetenv (const char *name);
94             ]],
95             [[]])],
96          [gt_cv_func_unsetenv_ret='int'],
97          [gt_cv_func_unsetenv_ret='void'])])
98     if test $gt_cv_func_unsetenv_ret = 'void'; then
99       AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
100        instead of int.])
101       REPLACE_UNSETENV=1
102     fi
103
104     dnl Solaris 10 unsetenv does not remove all copies of a name.
105     dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
106     dnl OpenBSD 4.7 unsetenv("") does not fail.
107     AC_CACHE_CHECK([whether unsetenv obeys POSIX],
108       [gl_cv_func_unsetenv_works],
109       [AC_RUN_IFELSE(
110          [AC_LANG_PROGRAM([[
111             #include <stdlib.h>
112             #include <errno.h>
113             extern char **environ;
114            ]GL_MDA_DEFINES],
115            [[
116             char entry1[] = "a=1";
117             char entry2[] = "b=2";
118             char *env[] = { entry1, entry2, NULL };
119             if (putenv ((char *) "a=1")) return 1;
120             if (putenv (entry2)) return 2;
121             entry2[0] = 'a';
122             unsetenv ("a");
123             if (getenv ("a")) return 3;
124             if (!unsetenv ("") || errno != EINVAL) return 4;
125             entry2[0] = 'b';
126             environ = env;
127             if (!getenv ("a")) return 5;
128             entry2[0] = 'a';
129             unsetenv ("a");
130             if (getenv ("a")) return 6;
131            ]])],
132          [gl_cv_func_unsetenv_works=yes],
133          [gl_cv_func_unsetenv_works=no],
134          [case "$host_os" in
135                     # Guess yes on glibc systems.
136             *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
137                     # If we don't know, obey --enable-cross-guesses.
138             *)      gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;;
139           esac
140          ])
141       ])
142     case "$gl_cv_func_unsetenv_works" in
143       *yes) ;;
144       *)
145         REPLACE_UNSETENV=1
146         ;;
147     esac
148   fi
149 ])
150
151 # Prerequisites of lib/setenv.c.
152 AC_DEFUN([gl_PREREQ_SETENV],
153 [
154   AC_REQUIRE([AC_FUNC_ALLOCA])
155   AC_REQUIRE([gl_ENVIRON])
156   AC_CHECK_HEADERS_ONCE([unistd.h])
157   AC_CHECK_HEADERS([search.h])
158   AC_CHECK_FUNCS([tsearch])
159 ])
160
161 # Prerequisites of lib/unsetenv.c.
162 AC_DEFUN([gl_PREREQ_UNSETENV],
163 [
164   AC_REQUIRE([gl_ENVIRON])
165   AC_CHECK_HEADERS_ONCE([unistd.h])
166 ])