blob: 1992c5ecd44574a4552da1e4e626bcf3132c6521 [file] [log] [blame]
xf.li6c8fc1e2023-08-12 00:11:09 -07001#***************************************************************************
2# _ _ ____ _
3# Project ___| | | | _ \| |
4# / __| | | | |_) | |
5# | (__| |_| | _ <| |___
6# \___|\___/|_| \_\_____|
7#
8# Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
9#
10# This software is licensed as described in the file COPYING, which
11# you should have received as part of this distribution. The terms
12# are also available at https://curl.se/docs/copyright.html.
13#
14# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15# copies of the Software, and permit persons to whom the Software is
16# furnished to do so, under the terms of the COPYING file.
17#
18# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19# KIND, either express or implied.
20#
21# SPDX-License-Identifier: curl
22#
23#***************************************************************************
24
25# File version for 'aclocal' use. Keep it a single number.
26# serial 10
27
28dnl Note 1
29dnl ------
30dnl None of the CURL_CHECK_NEED_REENTRANT_* macros shall use HAVE_FOO_H to
31dnl conditionally include header files. These macros are used early in the
32dnl configure process much before header file availability is known.
33
34
35dnl CURL_CHECK_NEED_REENTRANT_ERRNO
36dnl -------------------------------------------------
37dnl Checks if the preprocessor _REENTRANT definition
38dnl makes errno available as a preprocessor macro.
39
40AC_DEFUN([CURL_CHECK_NEED_REENTRANT_ERRNO], [
41 AC_COMPILE_IFELSE([
42 AC_LANG_PROGRAM([[
43#include <errno.h>
44 ]],[[
45 if(0 != errno)
46 return 1;
47 ]])
48 ],[
49 tmp_errno="yes"
50 ],[
51 tmp_errno="no"
52 ])
53 if test "$tmp_errno" = "yes"; then
54 AC_COMPILE_IFELSE([
55 AC_LANG_PROGRAM([[
56#include <errno.h>
57 ]],[[
58#ifdef errno
59 int dummy=1;
60#else
61 force compilation error
62#endif
63 ]])
64 ],[
65 tmp_errno="errno_macro_defined"
66 ],[
67 AC_COMPILE_IFELSE([
68 AC_LANG_PROGRAM([[
69#define _REENTRANT
70#include <errno.h>
71 ]],[[
72#ifdef errno
73 int dummy=1;
74#else
75 force compilation error
76#endif
77 ]])
78 ],[
79 tmp_errno="errno_macro_needs_reentrant"
80 tmp_need_reentrant="yes"
81 ])
82 ])
83 fi
84])
85
86
87dnl CURL_CHECK_NEED_REENTRANT_GMTIME_R
88dnl -------------------------------------------------
89dnl Checks if the preprocessor _REENTRANT definition
90dnl makes function gmtime_r compiler visible.
91
92AC_DEFUN([CURL_CHECK_NEED_REENTRANT_GMTIME_R], [
93 AC_LINK_IFELSE([
94 AC_LANG_FUNC_LINK_TRY([gmtime_r])
95 ],[
96 tmp_gmtime_r="yes"
97 ],[
98 tmp_gmtime_r="no"
99 ])
100 if test "$tmp_gmtime_r" = "yes"; then
101 AC_EGREP_CPP([gmtime_r],[
102#include <sys/types.h>
103#include <time.h>
104 ],[
105 tmp_gmtime_r="proto_declared"
106 ],[
107 AC_EGREP_CPP([gmtime_r],[
108#define _REENTRANT
109#include <sys/types.h>
110#include <time.h>
111 ],[
112 tmp_gmtime_r="proto_needs_reentrant"
113 tmp_need_reentrant="yes"
114 ])
115 ])
116 fi
117])
118
119
120dnl CURL_CHECK_NEED_REENTRANT_LOCALTIME_R
121dnl -------------------------------------------------
122dnl Checks if the preprocessor _REENTRANT definition
123dnl makes function localtime_r compiler visible.
124
125AC_DEFUN([CURL_CHECK_NEED_REENTRANT_LOCALTIME_R], [
126 AC_LINK_IFELSE([
127 AC_LANG_FUNC_LINK_TRY([localtime_r])
128 ],[
129 tmp_localtime_r="yes"
130 ],[
131 tmp_localtime_r="no"
132 ])
133 if test "$tmp_localtime_r" = "yes"; then
134 AC_EGREP_CPP([localtime_r],[
135#include <sys/types.h>
136#include <time.h>
137 ],[
138 tmp_localtime_r="proto_declared"
139 ],[
140 AC_EGREP_CPP([localtime_r],[
141#define _REENTRANT
142#include <sys/types.h>
143#include <time.h>
144 ],[
145 tmp_localtime_r="proto_needs_reentrant"
146 tmp_need_reentrant="yes"
147 ])
148 ])
149 fi
150])
151
152
153dnl CURL_CHECK_NEED_REENTRANT_STRERROR_R
154dnl -------------------------------------------------
155dnl Checks if the preprocessor _REENTRANT definition
156dnl makes function strerror_r compiler visible.
157
158AC_DEFUN([CURL_CHECK_NEED_REENTRANT_STRERROR_R], [
159 AC_LINK_IFELSE([
160 AC_LANG_FUNC_LINK_TRY([strerror_r])
161 ],[
162 tmp_strerror_r="yes"
163 ],[
164 tmp_strerror_r="no"
165 ])
166 if test "$tmp_strerror_r" = "yes"; then
167 AC_EGREP_CPP([strerror_r],[
168#include <sys/types.h>
169#include <string.h>
170 ],[
171 tmp_strerror_r="proto_declared"
172 ],[
173 AC_EGREP_CPP([strerror_r],[
174#define _REENTRANT
175#include <sys/types.h>
176#include <string.h>
177 ],[
178 tmp_strerror_r="proto_needs_reentrant"
179 tmp_need_reentrant="yes"
180 ])
181 ])
182 fi
183])
184
185
186dnl CURL_CHECK_NEED_REENTRANT_STRTOK_R
187dnl -------------------------------------------------
188dnl Checks if the preprocessor _REENTRANT definition
189dnl makes function strtok_r compiler visible.
190
191AC_DEFUN([CURL_CHECK_NEED_REENTRANT_STRTOK_R], [
192 AC_LINK_IFELSE([
193 AC_LANG_FUNC_LINK_TRY([strtok_r])
194 ],[
195 tmp_strtok_r="yes"
196 ],[
197 tmp_strtok_r="no"
198 ])
199 if test "$tmp_strtok_r" = "yes"; then
200 AC_EGREP_CPP([strtok_r],[
201#include <sys/types.h>
202#include <string.h>
203 ],[
204 tmp_strtok_r="proto_declared"
205 ],[
206 AC_EGREP_CPP([strtok_r],[
207#define _REENTRANT
208#include <sys/types.h>
209#include <string.h>
210 ],[
211 tmp_strtok_r="proto_needs_reentrant"
212 tmp_need_reentrant="yes"
213 ])
214 ])
215 fi
216])
217
218
219dnl CURL_CHECK_NEED_REENTRANT_GETHOSTBYNAME_R
220dnl -------------------------------------------------
221dnl Checks if the preprocessor _REENTRANT definition
222dnl makes function gethostbyname_r compiler visible.
223
224AC_DEFUN([CURL_CHECK_NEED_REENTRANT_GETHOSTBYNAME_R], [
225 AC_LINK_IFELSE([
226 AC_LANG_FUNC_LINK_TRY([gethostbyname_r])
227 ],[
228 tmp_gethostbyname_r="yes"
229 ],[
230 tmp_gethostbyname_r="no"
231 ])
232 if test "$tmp_gethostbyname_r" = "yes"; then
233 AC_EGREP_CPP([gethostbyname_r],[
234#include <sys/types.h>
235#include <netdb.h>
236 ],[
237 tmp_gethostbyname_r="proto_declared"
238 ],[
239 AC_EGREP_CPP([gethostbyname_r],[
240#define _REENTRANT
241#include <sys/types.h>
242#include <netdb.h>
243 ],[
244 tmp_gethostbyname_r="proto_needs_reentrant"
245 tmp_need_reentrant="yes"
246 ])
247 ])
248 fi
249])
250
251
252dnl CURL_CHECK_NEED_REENTRANT_GETPROTOBYNAME_R
253dnl -------------------------------------------------
254dnl Checks if the preprocessor _REENTRANT definition
255dnl makes function getprotobyname_r compiler visible.
256
257AC_DEFUN([CURL_CHECK_NEED_REENTRANT_GETPROTOBYNAME_R], [
258 AC_LINK_IFELSE([
259 AC_LANG_FUNC_LINK_TRY([getprotobyname_r])
260 ],[
261 tmp_getprotobyname_r="yes"
262 ],[
263 tmp_getprotobyname_r="no"
264 ])
265 if test "$tmp_getprotobyname_r" = "yes"; then
266 AC_EGREP_CPP([getprotobyname_r],[
267#include <sys/types.h>
268#include <netdb.h>
269 ],[
270 tmp_getprotobyname_r="proto_declared"
271 ],[
272 AC_EGREP_CPP([getprotobyname_r],[
273#define _REENTRANT
274#include <sys/types.h>
275#include <netdb.h>
276 ],[
277 tmp_getprotobyname_r="proto_needs_reentrant"
278 tmp_need_reentrant="yes"
279 ])
280 ])
281 fi
282])
283
284
285dnl CURL_CHECK_NEED_REENTRANT_FUNCTIONS_R
286dnl -------------------------------------------------
287dnl Checks if the preprocessor _REENTRANT definition
288dnl makes several _r functions compiler visible.
289dnl Internal macro for CURL_CONFIGURE_REENTRANT.
290
291AC_DEFUN([CURL_CHECK_NEED_REENTRANT_FUNCTIONS_R], [
292 if test "$tmp_need_reentrant" = "no"; then
293 CURL_CHECK_NEED_REENTRANT_GMTIME_R
294 fi
295 if test "$tmp_need_reentrant" = "no"; then
296 CURL_CHECK_NEED_REENTRANT_LOCALTIME_R
297 fi
298 if test "$tmp_need_reentrant" = "no"; then
299 CURL_CHECK_NEED_REENTRANT_STRERROR_R
300 fi
301 if test "$tmp_need_reentrant" = "no"; then
302 CURL_CHECK_NEED_REENTRANT_STRTOK_R
303 fi
304 if test "$tmp_need_reentrant" = "no"; then
305 CURL_CHECK_NEED_REENTRANT_GETHOSTBYNAME_R
306 fi
307 if test "$tmp_need_reentrant" = "no"; then
308 CURL_CHECK_NEED_REENTRANT_GETPROTOBYNAME_R
309 fi
310])
311
312
313dnl CURL_CHECK_NEED_REENTRANT_SYSTEM
314dnl -------------------------------------------------
315dnl Checks if the preprocessor _REENTRANT definition
316dnl must be unconditionally done for this platform.
317dnl Internal macro for CURL_CONFIGURE_REENTRANT.
318
319AC_DEFUN([CURL_CHECK_NEED_REENTRANT_SYSTEM], [
320 case $host_os in
321 solaris*)
322 tmp_need_reentrant="yes"
323 ;;
324 *)
325 tmp_need_reentrant="no"
326 ;;
327 esac
328])
329
330
331dnl CURL_CHECK_NEED_THREAD_SAFE_SYSTEM
332dnl -------------------------------------------------
333dnl Checks if the preprocessor _THREAD_SAFE definition
334dnl must be unconditionally done for this platform.
335dnl Internal macro for CURL_CONFIGURE_THREAD_SAFE.
336
337AC_DEFUN([CURL_CHECK_NEED_THREAD_SAFE_SYSTEM], [
338 case $host_os in
339 aix[[123]].* | aix4.[[012]].*)
340 dnl aix 4.2 and older
341 tmp_need_thread_safe="no"
342 ;;
343 aix*)
344 dnl AIX 4.3 and newer
345 tmp_need_thread_safe="yes"
346 ;;
347 *)
348 tmp_need_thread_safe="no"
349 ;;
350 esac
351])
352
353
354dnl CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT
355dnl -------------------------------------------------
356dnl This macro ensures that configuration tests done
357dnl after this will execute with preprocessor symbol
358dnl _REENTRANT defined. This macro also ensures that
359dnl the generated config file defines NEED_REENTRANT
360dnl and that in turn curl_setup.h will define _REENTRANT.
361dnl Internal macro for CURL_CONFIGURE_REENTRANT.
362
363AC_DEFUN([CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT], [
364AC_DEFINE(NEED_REENTRANT, 1,
365 [Define to 1 if _REENTRANT preprocessor symbol must be defined.])
366cat >>confdefs.h <<_EOF
367#ifndef _REENTRANT
368# define _REENTRANT
369#endif
370_EOF
371])
372
373
374dnl CURL_CONFIGURE_FROM_NOW_ON_WITH_THREAD_SAFE
375dnl -------------------------------------------------
376dnl This macro ensures that configuration tests done
377dnl after this will execute with preprocessor symbol
378dnl _THREAD_SAFE defined. This macro also ensures that
379dnl the generated config file defines NEED_THREAD_SAFE
380dnl and that in turn curl_setup.h will define _THREAD_SAFE.
381dnl Internal macro for CURL_CONFIGURE_THREAD_SAFE.
382
383AC_DEFUN([CURL_CONFIGURE_FROM_NOW_ON_WITH_THREAD_SAFE], [
384AC_DEFINE(NEED_THREAD_SAFE, 1,
385 [Define to 1 if _THREAD_SAFE preprocessor symbol must be defined.])
386cat >>confdefs.h <<_EOF
387#ifndef _THREAD_SAFE
388# define _THREAD_SAFE
389#endif
390_EOF
391])
392
393
394dnl CURL_CONFIGURE_REENTRANT
395dnl -------------------------------------------------
396dnl This first checks if the preprocessor _REENTRANT
397dnl symbol is already defined. If it isn't currently
398dnl defined a set of checks are performed to verify
399dnl if its definition is required to make visible to
400dnl the compiler a set of *_r functions. Finally, if
401dnl _REENTRANT is already defined or needed it takes
402dnl care of making adjustments necessary to ensure
403dnl that it is defined equally for further configure
404dnl tests and generated config file.
405
406AC_DEFUN([CURL_CONFIGURE_REENTRANT], [
407 AC_PREREQ([2.50])dnl
408 #
409 AC_MSG_CHECKING([if _REENTRANT is already defined])
410 AC_COMPILE_IFELSE([
411 AC_LANG_PROGRAM([[
412 ]],[[
413#ifdef _REENTRANT
414 int dummy=1;
415#else
416 force compilation error
417#endif
418 ]])
419 ],[
420 AC_MSG_RESULT([yes])
421 tmp_reentrant_initially_defined="yes"
422 ],[
423 AC_MSG_RESULT([no])
424 tmp_reentrant_initially_defined="no"
425 ])
426 #
427 if test "$tmp_reentrant_initially_defined" = "no"; then
428 AC_MSG_CHECKING([if _REENTRANT is actually needed])
429 CURL_CHECK_NEED_REENTRANT_SYSTEM
430 if test "$tmp_need_reentrant" = "no"; then
431 CURL_CHECK_NEED_REENTRANT_ERRNO
432 fi
433 if test "$tmp_need_reentrant" = "no"; then
434 CURL_CHECK_NEED_REENTRANT_FUNCTIONS_R
435 fi
436 if test "$tmp_need_reentrant" = "yes"; then
437 AC_MSG_RESULT([yes])
438 else
439 AC_MSG_RESULT([no])
440 fi
441 fi
442 #
443 AC_MSG_CHECKING([if _REENTRANT is onwards defined])
444 if test "$tmp_reentrant_initially_defined" = "yes" ||
445 test "$tmp_need_reentrant" = "yes"; then
446 CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT
447 AC_MSG_RESULT([yes])
448 else
449 AC_MSG_RESULT([no])
450 fi
451 #
452])
453
454
455dnl CURL_CONFIGURE_THREAD_SAFE
456dnl -------------------------------------------------
457dnl This first checks if the preprocessor _THREAD_SAFE
458dnl symbol is already defined. If it isn't currently
459dnl defined a set of checks are performed to verify
460dnl if its definition is required. Finally, if
461dnl _THREAD_SAFE is already defined or needed it takes
462dnl care of making adjustments necessary to ensure
463dnl that it is defined equally for further configure
464dnl tests and generated config file.
465
466AC_DEFUN([CURL_CONFIGURE_THREAD_SAFE], [
467 AC_PREREQ([2.50])dnl
468 #
469 AC_MSG_CHECKING([if _THREAD_SAFE is already defined])
470 AC_COMPILE_IFELSE([
471 AC_LANG_PROGRAM([[
472 ]],[[
473#ifdef _THREAD_SAFE
474 int dummy=1;
475#else
476 force compilation error
477#endif
478 ]])
479 ],[
480 AC_MSG_RESULT([yes])
481 tmp_thread_safe_initially_defined="yes"
482 ],[
483 AC_MSG_RESULT([no])
484 tmp_thread_safe_initially_defined="no"
485 ])
486 #
487 if test "$tmp_thread_safe_initially_defined" = "no"; then
488 AC_MSG_CHECKING([if _THREAD_SAFE is actually needed])
489 CURL_CHECK_NEED_THREAD_SAFE_SYSTEM
490 if test "$tmp_need_thread_safe" = "yes"; then
491 AC_MSG_RESULT([yes])
492 else
493 AC_MSG_RESULT([no])
494 fi
495 fi
496 #
497 AC_MSG_CHECKING([if _THREAD_SAFE is onwards defined])
498 if test "$tmp_thread_safe_initially_defined" = "yes" ||
499 test "$tmp_need_thread_safe" = "yes"; then
500 CURL_CONFIGURE_FROM_NOW_ON_WITH_THREAD_SAFE
501 AC_MSG_RESULT([yes])
502 else
503 AC_MSG_RESULT([no])
504 fi
505 #
506])