3 AT_BANNER([Semantics.])
5 # Copyright (C) 2000-2002, 2004-2007, 2009-2017 Free Software
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <https://www.gnu.org/licenses/>.
22 ## -------------------------------- ##
23 ## Members of the AC_CHECK family. ##
24 ## -------------------------------- ##
29 # Well, I can't imagine a system where `cos' is neither in libc, nor
30 # in libm. Nor can I imagine a lib more likely to exists than libm.
31 # But there are systems without libm, on which we don't want to have
32 # this test fail, so exit successfully if `cos' is in libc.
33 AT_CHECK_MACRO([AC_CHECK_LIB],
34 [AC_TRY_LINK_FUNC(cos,
35 [AC_MSG_ERROR([`cos' is in `libc'], 77)])
38 [AC_MSG_ERROR([cannot find `cos' in `libm'])])
40 # No kidding, using variables was broken in 2.50 :(
42 AC_CHECK_LIB(m, $ac_sin,,
43 [AC_MSG_ERROR([cannot find `\$ac_sin' (= `$ac_sin') in `libm'])])
46 AC_CHECK_LIB($ac_m, acos,,
47 [AC_MSG_ERROR([cannot find `acos' in `\$ac_m' (= `$ac_m')])])
50 AC_CHECK_LIB($ac_m, $ac_asin,,
51 [AC_MSG_ERROR([cannot find `\$ac_asin' (= `$ac_asin') in `\$ac_m' (= `$ac_m')])])
53 # But if the bug is in the caching mechanism, then be sure we
54 # correctly detect failures.
56 AC_CHECK_LIB(m, cossack,
57 [AC_MSG_ERROR([found `cossack' in `libm'])])
59 # No kidding, using variables was broken in 2.50 :(
61 AC_CHECK_LIB(m, $ac_sinner,
62 [AC_MSG_ERROR([found `\$ac_sinner' (= `$ac_sinner') in `libm'])])
65 AC_CHECK_LIB($ac_m, acossack,
66 [AC_MSG_ERROR([found `acossack' in `\$ac_m' (= `$ac_m')])])
69 AC_CHECK_LIB($ac_m, $ac_asinner,
70 [AC_MSG_ERROR([found `\$ac_asinner' (= `$ac_asinner') in `\$ac_m' (= `$ac_m')])])
77 AT_CHECK_MACRO([AC_SEARCH_LIBS],
79 AC_SEARCH_LIBS(cos, oser m ust,,
80 [AC_MSG_ERROR([cannot find `cos'])])
82 case "$ac_cv_search_cos" in
83 -loser|-lust) AC_MSG_ERROR([jeez, $ac_cv_search_cos must be a cool library!]) ;;
88 # AC_SEARCH_LIBS (none needed)
89 # ----------------------------
90 AT_CHECK_MACRO([AC_SEARCH_LIBS (none needed)],
92 AC_SEARCH_LIBS(printf, oser c ust,,
93 [AC_MSG_ERROR([cannot find `printf'])])
95 case "$ac_cv_search_printf" in
96 -loser|-lust) AC_MSG_ERROR([jeez, $ac_cv_search_printf must be a cool library!]) ;;
97 -lc) AC_MSG_ERROR([huh, you need to give -lc?])
104 # For the benefit of _AC_UNDECLARED_WARNING compilers, these INCLUDES sections
105 # should not elicit warnings.
106 AT_CHECK_MACRO([AC_CHECK_DECLS],
107 [[AC_CHECK_DECLS([yes, no, myenum, mystruct, myfunc, mymacro1, mymacro2],,,
110 extern struct { int x[20]; } mystruct;
112 #define mymacro1(arg) arg
114 # Clang reports a warning for an undeclared builtin.
115 AC_CHECK_DECLS([strerror],,, [[]])
116 # The difference in space-before-open-paren is intentional.
117 AC_CHECK_DECLS([basenam (char *), dirnam(char *),
118 [moreargs (char, short, int, long, void *, char [], float, double)]],,,
120 extern "C++" char *basenam (char *);
121 extern "C++" const char *basenam (const char *);
123 extern char *basenam (const char *);
128 extern int moreargs (char, short, int, long, void *,
129 char [], float, double);
134 AC_CHECK_DECL([declared (char *)],, [AS_EXIT([1])],
136 extern "C++" char *declared (char *);
137 extern "C++" const char *declared (const char *);
139 extern char *declared (const char *);
142 AC_CHECK_DECL([undeclared (char *)], [AS_EXIT([1])],, [[]])
145 [#define HAVE_DECL_BASENAM 1
146 #define HAVE_DECL_DIRNAM 0
147 #define HAVE_DECL_MOREARGS 1
148 #define HAVE_DECL_MYENUM 1
149 #define HAVE_DECL_MYFUNC 1
150 #define HAVE_DECL_MYMACRO1 1
151 #define HAVE_DECL_MYMACRO2 1
152 #define HAVE_DECL_MYSTRUCT 1
153 #define HAVE_DECL_NO 0
154 #define HAVE_DECL_STRERROR 0
155 #define HAVE_DECL_YES 1
161 # Check that it performs the correct actions:
162 # Must define HAVE_PRINTF, but not HAVE_AUTOCONF_FTNIRP
163 AT_CHECK_MACRO([AC_CHECK_FUNCS],
164 [AC_CHECK_FUNCS(printf autoconf_ftnirp)],
166 [/* #undef HAVE_AUTOCONF_FTNIRP */
167 #define HAVE_PRINTF 1
173 # Check that it performs the correct actions: autoconf_ftnirp.c must
174 # be compiled, and must define HAVE_PRINTF, but not HAVE_AUTOCONF_FTNIRP
175 # FIXME: Maybe check the traces?
176 AT_SETUP([AC_REPLACE_FUNCS])
183 [AC_CONFIG_FILES([config.libobjs:config.in])
184 AC_REPLACE_FUNCS([printf \
186 funcs='fprintf fopen autoconf_ftnirpf'
187 AH_TEMPLATE([HAVE_FOPEN], [])
188 AH_TEMPLATE([HAVE_FPRINTF], [])
189 AH_TEMPLATE([HAVE_AUTOCONF_FTNIRPF], [])
194 AT_CHECK_AUTOCONF([-W obsolete])
199 [/* #undef HAVE_AUTOCONF_FTNIRP */
200 /* #undef HAVE_AUTOCONF_FTNIRPF */
202 #define HAVE_FPRINTF 1
203 #define HAVE_PRINTF 1
206 AT_CHECK([sed 's/ */ /g;s/^ //;s/ $//' config.libobjs], [],
207 [${LIBOBJDIR}autoconf_ftnirp$U.o ${LIBOBJDIR}autoconf_ftnirpf$U.o
215 # Check that it performs the correct actions:
216 # Must define HAVE_STDIO_H, but not HAVE_AUTOCONF_IO_H.
217 AT_SETUP([AC_CHECK_HEADERS])
219 AT_DATA([autoconf_io.h],
223 AT_CONFIGURE_AC([AC_CHECK_HEADERS(stdio.h autoconf_io.h)])
224 AT_CHECK_AUTOCONF([-W obsolete])
226 AT_CHECK_CONFIGURE([CPPFLAGS=-I.])
229 [/* #undef HAVE_AUTOCONF_IO_H */
230 #define HAVE_STDIO_H 1
236 # AC_CHECK_HEADERS_OLD
237 # --------------------
238 # Check that it performs the correct actions:
239 # Must not check prerequisites, hence define header2.h
240 AT_SETUP([AC_CHECK_HEADERS (preprocessor test)])
250 AT_CONFIGURE_AC([AC_CHECK_HEADERS(header2.h, [], [], -)])
252 AT_CHECK_AUTOCONF([-W obsolete], [], [], [stderr])
253 AT_CHECK([[grep '^configure\.ac' stderr]], [0],
254 [configure.ac:4: warning: Checking for headers with the preprocessor is
255 configure.ac:4: deprecated. Specify prerequisite code to AC_CHECK_HEADER
256 configure.ac:4: instead of using fourth argument `-'. (Many headers need
257 configure.ac:4: no prerequisites. If you truly need to test whether
258 configure.ac:4: something passes the preprocessor but not the compiler,
259 configure.ac:4: use AC_PREPROC_IFELSE.)
260 configure.ac:4: the top level
263 AT_CHECK_CONFIGURE([CPPFLAGS=-I.])
266 [#define HAVE_HEADER2_H 1
272 # AC_CHECK_HEADERS_NEW
273 # --------------------
274 # Check that it performs the correct actions:
275 # Must check prerequisites, hence define header2.h but not header3.h
276 AT_SETUP([AC_CHECK_HEADERS (compiler test)])
291 [AC_CHECK_HEADERS(header2.h header3.h, [], [], [[@%:@include "header1.h"]])])
293 AT_CHECK_AUTOCONF([-W obsolete])
295 AT_CHECK_CONFIGURE([CPPFLAGS=-I.])
298 [#define HAVE_HEADER2_H 1
299 /* #undef HAVE_HEADER3_H */
307 # Check that it performs the correct actions.
308 # Must define HAVE_STRUCT_YES_S_YES, but not HAVE_STRUCT_YES_S_NO.
309 AT_CHECK_MACRO([AC_CHECK_MEMBER],
310 [[AC_CHECK_MEMBER([struct yes_s.yes],
311 [AC_DEFINE([HAVE_STRUCT_YES_S_YES], [1],
312 [Define to 1 if `yes' is a member of `struct yes_s'.])],,
313 [struct sub { int x; };
314 struct yes_s { int yes; struct sub substruct; };])
315 AC_CHECK_MEMBER([struct yes_s.no],
316 [AC_DEFINE([HAVE_STRUCT_YES_S_NO], [1],
317 [Define to 1 if `no' is a member of `struct yes_s'.])],,
318 [struct sub { int x; };
319 struct yes_s { int yes; struct sub substruct; };])
320 AC_CHECK_MEMBER([struct yes_s.substruct],
321 [AC_DEFINE([HAVE_STRUCT_YES_S_SUBSTRUCT], [1],
322 [Define to 1 if `substruct' is a member of `struct yes_s'.])],,
323 [struct sub { int x; };
324 struct yes_s { int yes; struct sub substruct; };])]],
326 [/* #undef HAVE_STRUCT_YES_S_NO */
327 #define HAVE_STRUCT_YES_S_SUBSTRUCT 1
328 #define HAVE_STRUCT_YES_S_YES 1
333 # Check that it performs the correct actions.
334 # Must define HAVE_STRUCT_YES_S_YES, but not HAVE_STRUCT_YES_S_NO.
335 AT_CHECK_MACRO([AC_CHECK_MEMBERS],
336 [[AC_CHECK_MEMBERS([struct yes_s.yes, struct yes_s.no, struct yes_s.substruct],,,
337 [struct sub { int x; };
338 struct yes_s { int yes; struct sub substruct; };])]],
340 [/* #undef HAVE_STRUCT_YES_S_NO */
341 #define HAVE_STRUCT_YES_S_SUBSTRUCT 1
342 #define HAVE_STRUCT_YES_S_YES 1
344 AT_CHECK([grep 'yes.*member of.*yes_s' config.h], [], [ignore])
350 AT_CHECK_MACRO_CROSS([AC_CHECK_ALIGNOF],
351 [[AC_CHECK_ALIGNOF(char)
352 AC_CHECK_ALIGNOF(charchar,
353 [[#include <stddef.h>
355 typedef char charchar[2];]])
356 AC_CHECK_ALIGNOF(charcharchar)
359 [#define ALIGNOF_CHAR 1
360 #define ALIGNOF_CHARCHAR 1
361 #define ALIGNOF_CHARCHARCHAR 0
365 # AC_CHECK_ALIGNOF struct
366 # -----------------------
367 AT_CHECK_MACRO_CROSS([AC_CHECK_ALIGNOF struct],
368 [[AC_CHECK_ALIGNOF([struct { char c; }])
369 AC_CHECK_ALIGNOF([struct nosuchstruct])
371 [AT_CHECK([[grep "#define ALIGNOF_STRUCT___CHAR_C___ [1-9]" config.h]],
373 AT_CHECK([[grep "#define ALIGNOF_STRUCT_NOSUCHSTRUCT 0" config.h]],
379 AT_CHECK_MACRO_CROSS([AC_CHECK_SIZEOF],
380 [[AC_CHECK_SIZEOF(char)
381 AC_CHECK_SIZEOF(charchar,,
383 typedef char charchar[2];]])
384 AC_CHECK_SIZEOF(charcharchar)
387 [#define SIZEOF_CHAR 1
388 #define SIZEOF_CHARCHAR 2
389 #define SIZEOF_CHARCHARCHAR 0
393 # AC_CHECK_SIZEOF struct
394 # ----------------------
395 AT_CHECK_MACRO_CROSS([AC_CHECK_SIZEOF struct],
397 AC_CHECK_SIZEOF([struct x], [], [struct x { char c; int x; };])
398 AC_CHECK_SIZEOF([const struct x], [], [struct x { const char *p; int x; };])
399 AC_CHECK_SIZEOF([struct nosuchstruct])
400 # Taken from autoconf.texi:Generic Compiler Characteristics.
401 AC_CHECK_SIZEOF([int *])
403 [AT_CHECK([[grep "#define SIZEOF_STRUCT_X [1-9]" config.h]],
405 AT_CHECK([[grep "#define SIZEOF_CONST_STRUCT_X [1-9]" config.h]],
407 AT_CHECK([[grep "#define SIZEOF_STRUCT_NOSUCHSTRUCT 0" config.h]],
409 AT_CHECK([[grep "#define SIZEOF_INT_P [1-9]" config.h]],
416 # Check that it performs the correct actions.
417 # Must define HAVE_STRUCT_YES_S, HAVE_INT, but not HAVE_STRUCT_NO_S.
418 # `int' and `struct yes_s' are both checked to test both the compiler
419 # builtin types, and defined types.
420 AT_CHECK_MACRO([AC_CHECK_TYPES],
421 [[AC_CHECK_TYPES([int, struct yes_s, struct no_s],,,
422 [struct yes_s { int yes ;} ;])]],
425 /* #undef HAVE_STRUCT_NO_S */
426 #define HAVE_STRUCT_YES_S 1
432 # Check that we properly dispatch properly to the old implementation
434 AT_SETUP([AC_CHECK_TYPES: backward compatibility])
436 AT_DATA([configure.ac],
438 define([_AC_CHECK_TYPE_NEW], [NEW])
439 define([_AC_CHECK_TYPE_OLD], [OLD])
441 AC_CHECK_TYPE(ptrdiff_t)
442 AC_CHECK_TYPE(ptrdiff_t, int)
443 AC_CHECK_TYPE(quad, long long int)
444 AC_CHECK_TYPE(table_42, [int[42]])
446 AC_CHECK_TYPE(uint8_t, uint65536_t)
447 AC_CHECK_TYPE(a,b,c,d)
453 AT_CHECK([[sed -e '/^#(cut-from-here/,/^#to-here)/!d' -e '/^#/d' configure]],
468 # FIXME: To really test HAVE_AC_EXISTS2 and HAVE_AC_MISSING2 we need to
469 # open AH_TEMPLATE to `configure.ac', which is not yet the case.
470 AT_CHECK_MACRO([AC_CHECK_FILES],
471 [touch at-exists1 at-exists2
472 ac_exists2=at-exists2
473 ac_missing2=at-missing2
474 AC_CHECK_FILES(at-exists1 at-missing1 $ac_exists2 $ac_missing2)
475 rm at-exists1 at-exists2],
477 [#define HAVE_AT_EXISTS1 1
478 /* #undef HAVE_AT_MISSING1 */
483 ## ------------------------------ ##
484 ## AC_CHECK_PROG & AC_PATH_PROG. ##
485 ## ------------------------------ ##
488 # AT_CHECK_PROGS_PREPARE
489 # ----------------------
490 # Create a sub directory `path' with 6 subdirs which all 7 contain
491 # an executable `tool'. `6' contains a `better' tool.
492 m4_define([AT_CHECK_PROGS_PREPARE],
495 cat >path/tool <<\EOF
506 cp path/tool path/6/better])
509 # -------------------------------- #
510 # AC_CHECK_PROG & AC_CHECK_PROGS. #
511 # -------------------------------- #
513 AT_SETUP([AC_CHECK_PROG & AC_CHECK_PROGS])
515 AT_CHECK_PROGS_PREPARE
517 AT_DATA([configure.ac],
520 p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6"
521 path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'`
524 AC_CHECK_PROG(TOOL1, tool, found, not-found, $path)
525 test "$TOOL1" = found || fail=:
527 # Yes, the semantics of this macro is weird.
528 AC_CHECK_PROG(TOOL2, tool,, not-found, $path)
529 test "$TOOL2" = not-found || fail=:
531 AC_CHECK_PROG(TOOL3, tool, tool, not-found, $path, $pwd/path/1/tool)
532 test "$TOOL3" = "$pwd/path/2/tool" || fail=:
534 AC_CHECK_PROG(TOOL4, better, better, not-found, $path, $pwd/path/1/tool)
535 test "$TOOL4" = better || fail=:
537 # When a tool is not found, and no value is given for not-found,
538 # the variable is left empty.
539 AC_CHECK_PROGS(TOOL5, missing,, $path)
540 test -z "$TOOL5" || fail=:
542 AC_CHECK_PROGS(TOOL6, missing tool better,, $path)
543 test "$TOOL6" = tool || fail=:
545 # No AC-OUTPUT, we don't need config.status.
547 AC_MSG_ERROR([[CHECK_PROG failed]])
558 ## ---------------- ##
559 ## AC_C_BIGENDIAN. ##
560 ## ---------------- ##
562 AT_SETUP([AC_C_BIGENDIAN])
565 # Make sure that AC_C_BIGENDIAN behave the same whether we are
566 # cross-compiling or not.
573 [ac_endian=universal])
574 echo $ac_endian > at-endian
577 rm -f config.hin # So that next run of autoheader is quiet.
579 [[# Force cross compiling.
586 [ac_endian=universal])
587 ac_prevendian=`cat at-endian`
588 # Check that we have found the same result as in the previous run
589 # or unknown (because the cross-compiling check is allowed to fail;
590 # although it might be interesting to suppress this comparison, just
591 # to know on which system it fails if it ever does).
592 if test $ac_endian != $ac_prevendian && test $ac_endian != unknown; then
593 AC_MSG_ERROR([unexpected endianness: first run found '$ac_prevendian' but second run found '$ac_endian'])
597 # Make sure AC_C_BIGENDIAN with no argument will create a config.h template
598 # containing "WORDS_BIGENDIAN".
599 AT_CONFIGURE_AC([[AC_C_BIGENDIAN]])
600 # --force is necessary, the computer might be too fast.
601 AT_CHECK_AUTOHEADER([--force])
602 AT_CHECK([grep WORDS_BIGENDIAN config.hin], [], [ignore])
607 # ------------------------------ #
608 # AC_PATH_PROG & AC_PATH_PROGS. #
609 # ------------------------------ #
611 AT_SETUP([AC_PATH_PROG & AC_PATH_PROGS])
613 AT_CHECK_PROGS_PREPARE
615 AT_DATA([configure.ac],
618 p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6"
619 path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'`
622 AC_PATH_PROG(TOOL1, tool, not-found, $path)
623 test "$TOOL1" = "$pwd/path/1/tool" || fail=:
625 AC_PATH_PROG(TOOL2, better, not-found, $path)
626 test "$TOOL2" = "$pwd/path/6/better" || fail=:
628 # When a tool is not found, and no value is given for not-found,
629 # the variable is left empty.
630 AC_PATH_PROGS(TOOL3, missing,, $path)
631 test -z "$TOOL3" || fail=:
633 AC_PATH_PROGS(TOOL4, missing tool better,, $path)
634 test "$TOOL4" = "$pwd/path/1/tool" || fail=:
636 # No AC-OUTPUT, we don't need config.status.
638 AC_MSG_ERROR([[PATH_PROG failed]])
649 # ----------------------------- #
650 # AC_PATH_PROGS_FEATURE_CHECK. #
651 # ----------------------------- #
653 AT_SETUP([AC_PATH_PROGS_FEATURE_CHECK])
655 # This test doesn't work if `pwd` contains white space
657 *\ * | *\ *) AT_CHECK([exit 77]) ;;
660 AT_CHECK_PROGS_PREPARE
662 AT_DATA([configure.ac],
665 p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6"
666 path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'`
669 # Find first candidate and stop search
670 AC_PATH_PROGS_FEATURE_CHECK(TOOL1, [tool better],
671 [$ac_path_TOOL1 && ac_cv_path_TOOL1=$ac_path_TOOL1 ac_path_TOOL1_found=:],
673 test -z "$TOOL1" || fail=:
674 test "$ac_cv_path_TOOL1" = "$pwd/path/1/tool" || fail=:
676 # Keep searching each candidate
677 AC_PATH_PROGS_FEATURE_CHECK(TOOL2, [tool better],
678 [$ac_path_TOOL2 && ac_cv_path_TOOL2=$ac_path_TOOL2],
680 test "$ac_cv_path_TOOL2" = "$pwd/path/6/better" || fail=:
682 # Only accept better candidate
683 AC_PATH_PROGS_FEATURE_CHECK(TOOL3, [tool better],
684 [case "$ac_path_TOOL3" in #(
685 *better) ac_cv_path_TOOL3=$ac_path_TOOL3;;
688 test "$ac_cv_path_TOOL3" = "$pwd/path/6/better" || fail=:
690 # When a tool is not found, and no action is given for not-found,
691 # the variable is left empty.
692 AC_PATH_PROGS_FEATURE_CHECK(TOOL4, missing,
693 [ac_cv_path_TOOL4=$ac_path_TOOL4], [], $path)
694 test -z "$ac_cv_path_TOOL4" || fail=:
696 # Test action when tool is not found
697 AC_PATH_PROGS_FEATURE_CHECK(TOOL5, missing, [],
698 [ac_cv_path_TOOL5='not found'], $path)
699 test "$ac_cv_path_TOOL5" = "not found" || fail=:
701 # Test that pre-set tool bypasses feature test
702 TOOL6=$pwd/path/6/better
703 AC_PATH_PROGS_FEATURE_CHECK(TOOL6, tool, fail=:, fail=:, $path)
704 test "$ac_cv_path_TOOL6" = "$pwd/path/6/better" || fail=:
706 # A blank pre-set does not bypass feature test
708 AC_PATH_PROGS_FEATURE_CHECK(TOOL7, [tool better],
709 [$ac_path_TOOL7 && ac_cv_path_TOOL7=$ac_path_TOOL7 ac_path_TOOL7_found=:],
711 test -z "$TOOL7" || fail=:
712 test "$ac_cv_path_TOOL7" = "$pwd/path/1/tool" || fail=:
714 # No AC-OUTPUT, we don't need config.status.
716 AC_MSG_ERROR([[PATH_PROG failed]])
733 AT_SETUP([AC_PATH_XTRA])
735 _AT_CHECK_AC_MACRO([AC_PATH_XTRA])
737 # Check X_DISPLAY_MISSING.
738 AT_CHECK_CONFIGURE([--without-x])
740 [#define X_DISPLAY_MISSING 1
746 ## ------------------------------- ##
747 ## Obsolete non-updatable macros. ##
748 ## ------------------------------- ##
751 AT_CHECK_MACRO([AC_SYS_RESTARTABLE_SYSCALLS], , ,[-W no-obsolete])
752 AT_CHECK_MACRO([AC_FUNC_SETVBUF_REVERSED], , ,[-W no-obsolete])
753 AT_CHECK_MACRO([AC_FUNC_WAIT3], , ,[-W no-obsolete])