1# -*- Autotest -*- 2 3AT_BANNER([Semantics.]) 4 5# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Free Software 6# Foundation, Inc. 7# 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 2, or (at your option) 11# any later version. 12# 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. 17# 18# You should have received a copy of the GNU General Public License 19# along with this program; if not, write to the Free Software 20# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 21# 02110-1301, USA. 22 23 24## -------------------------------- ## 25## Members of the AC_CHECK family. ## 26## -------------------------------- ## 27 28 29# AC_CHECK_LIB 30# ------------ 31# Well, I can't imagine a system where `cos' is neither in libc, nor 32# in libm. Nor can I imagine a lib more likely to exists than libm. 33# But there are systems without libm, on which we don't want to have 34# this test fail, so exit successfully if `cos' is in libc. 35AT_CHECK_MACRO([AC_CHECK_LIB], 36[AC_TRY_LINK_FUNC(cos, 37 [AC_MSG_ERROR([`cos' is in `libc'], 77)]) 38 39AC_CHECK_LIB(m, cos,, 40 [AC_MSG_ERROR([cannot find `cos' in `libm'])]) 41 42# No kidding, using variables was broken in 2.50 :( 43ac_sin=sin 44AC_CHECK_LIB(m, $ac_sin,, 45 [AC_MSG_ERROR([cannot find `\$ac_sin' (= `$ac_sin') in `libm'])]) 46 47ac_m=m 48AC_CHECK_LIB($ac_m, acos,, 49 [AC_MSG_ERROR([cannot find `acos' in `\$ac_m' (= `$ac_m')])]) 50 51ac_asin=asin 52AC_CHECK_LIB($ac_m, $ac_asin,, 53 [AC_MSG_ERROR([cannot find `\$ac_asin' (= `$ac_asin') in `\$ac_m' (= `$at_m')])]) 54 55# But if the bug is in the caching mechanism, then be sure we 56# correctly detect failures. 57 58AC_CHECK_LIB(m, cossack, 59 [AC_MSG_ERROR([found `cossack' in `libm'])]) 60 61# No kidding, using variables was broken in 2.50 :( 62ac_sinner=sinner 63AC_CHECK_LIB(m, $ac_sinner, 64 [AC_MSG_ERROR([found `\$ac_sinner' (= `$ac_sinner') in `libm'])]) 65 66ac_m=m 67AC_CHECK_LIB($ac_m, acossack, 68 [AC_MSG_ERROR([found `acossack' in `\$ac_m' (= `$ac_m')])]) 69 70ac_asinner=asinner 71AC_CHECK_LIB($ac_m, $ac_asinner, 72 [AC_MSG_ERROR([found `\$ac_asinner' (= `$ac_asinner') in `\$ac_m' (= `$at_m')])]) 73 74]) 75 76 77# AC_SEARCH_LIBS 78# -------------- 79AT_CHECK_MACRO([AC_SEARCH_LIBS], 80[ 81AC_SEARCH_LIBS(cos, oser m ust,, 82 [AC_MSG_ERROR([cannot find `cos'])]) 83 84case "$ac_cv_search_cos" in 85 -loser|-lust) AC_MSG_ERROR([jeez, $ac_cv_search_cos must be a cool library!]) ;; 86esac 87]) 88 89 90# AC_SEARCH_LIBS (none needed) 91# ---------------------------- 92AT_CHECK_MACRO([AC_SEARCH_LIBS (none needed)], 93[ 94AC_SEARCH_LIBS(printf, oser c ust,, 95 [AC_MSG_ERROR([cannot find `printf'])]) 96 97case "$ac_cv_search_printf" in 98 -loser|-lust) AC_MSG_ERROR([jeez, $ac_cv_search_printf must be a cool library!]) ;; 99 -lc) AC_MSG_ERROR([huh, you need to give -lc?]) 100esac 101]) 102 103 104# AC_CHECK_DECLS 105# -------------- 106# Check that it performs the correct actions: 107AT_CHECK_MACRO([AC_CHECK_DECLS], 108[[AC_CHECK_DECLS([yes, no, myenum, mystruct, myfunc, mymacro1, mymacro2],,, 109 [[int yes = 1; 110 enum { myenum }; 111 struct { int x[20]; } mystruct; 112 extern int myfunc(); 113 #define mymacro1(arg) arg 114 #define mymacro2]])]], 115[AT_CHECK_DEFINES( 116[#define HAVE_DECL_MYENUM 1 117#define HAVE_DECL_MYFUNC 1 118#define HAVE_DECL_MYMACRO1 1 119#define HAVE_DECL_MYMACRO2 1 120#define HAVE_DECL_MYSTRUCT 1 121#define HAVE_DECL_NO 0 122#define HAVE_DECL_YES 1 123])]) 124 125 126# AC_CHECK_FUNCS 127# -------------- 128# Check that it performs the correct actions: 129# Must define HAVE_PRINTF, but not HAVE_AUTOCONF_FTNIRP 130AT_CHECK_MACRO([AC_CHECK_FUNCS], 131[AC_CHECK_FUNCS(printf autoconf_ftnirp)], 132[AT_CHECK_DEFINES( 133[/* #undef HAVE_AUTOCONF_FTNIRP */ 134#define HAVE_PRINTF 1 135])]) 136 137 138# AC_REPLACE_FUNCS 139# ---------------- 140# Check that it performs the correct actions: autoconf_ftnirp.c must 141# be compiled, and must define HAVE_PRINTF, but not HAVE_AUTOCONF_FTNIRP 142# FIXME: Maybe check the traces? 143AT_SETUP([AC_REPLACE_FUNCS]) 144 145AT_DATA([config.in], 146[@LIBOBJS@ 147]) 148 149AT_CONFIGURE_AC( 150[AC_CONFIG_FILES(config.libobjs:config.in) 151AC_REPLACE_FUNCS(printf autoconf_ftnirp)]) 152 153AT_CHECK_AUTOCONF([-W obsolete]) 154AT_CHECK_AUTOHEADER 155AT_CHECK_CONFIGURE 156AT_CHECK_ENV 157AT_CHECK_DEFINES( 158[/* #undef HAVE_AUTOCONF_FTNIRP */ 159#define HAVE_PRINTF 1 160]) 161 162AT_CHECK([sed 's/ */ /g;s/^ //;s/ $//' config.libobjs], [], 163 [${LIBOBJDIR}autoconf_ftnirp$U.o 164]) 165 166AT_CLEANUP([config.libobjs]) 167 168 169# AC_CHECK_HEADERS 170# ---------------- 171# Check that it performs the correct actions: 172# Must define HAVE_STDIO_H, but not HAVE_AUTOCONF_IO_H. 173AT_CHECK_MACRO([AC_CHECK_HEADERS], 174[AC_CHECK_HEADERS(stdio.h autoconf_io.h)], 175[AT_CHECK_DEFINES( 176[/* #undef HAVE_AUTOCONF_IO_H */ 177#define HAVE_STDIO_H 1 178])]) 179 180 181# AC_CHECK_HEADERS_OLD 182# -------------------- 183# Check that it performs the correct actions: 184# Must not check prerequisites, hence define header2.h 185AT_SETUP([AC_CHECK_HEADERS_OLD]) 186 187AT_DATA([header1.h], 188[typedef int foo; 189]) 190 191AT_DATA([header2.h], 192[typedef foo bar; 193]) 194 195AT_CONFIGURE_AC([AC_CHECK_HEADERS(header2.h, [], [], -)]) 196 197AT_CHECK_AUTOCONF([-W obsolete]) 198AT_CHECK_AUTOHEADER 199AT_CHECK_CONFIGURE([CPPFLAGS=-I.]) 200AT_CHECK_ENV 201AT_CHECK_DEFINES( 202[#define HAVE_HEADER2_H 1 203]) 204 205AT_CLEANUP([header1.h header2.h]) 206 207 208# AC_CHECK_HEADERS_NEW 209# -------------------- 210# Check that it performs the correct actions: 211# Must check prerequisites, hence define header2.h but not header3.h 212AT_SETUP([AC_CHECK_HEADERS_NEW]) 213 214AT_DATA([header1.h], 215[typedef int foo; 216]) 217 218AT_DATA([header2.h], 219[typedef foo bar; 220]) 221 222AT_DATA([header3.h], 223[typedef bar wow; 224]) 225 226AT_CONFIGURE_AC( 227[AC_CHECK_HEADERS(header2.h header3.h, [], [], [[@%:@include "header1.h"]])]) 228 229AT_CHECK_AUTOCONF([-W obsolete]) 230AT_CHECK_AUTOHEADER 231AT_CHECK_CONFIGURE([CPPFLAGS=-I.]) 232AT_CHECK_ENV 233AT_CHECK_DEFINES( 234[#define HAVE_HEADER2_H 1 235/* #undef HAVE_HEADER3_H */ 236]) 237 238AT_CLEANUP([header1.h header2.h header3.h]) 239 240 241# AC_CHECK_MEMBERS 242# ---------------- 243# Check that it performs the correct actions. 244# Must define HAVE_STRUCT_YES_S_YES, but not HAVE_STRUCT_YES_S_NO. 245AT_CHECK_MACRO([AC_CHECK_MEMBERS], 246[[AC_CHECK_MEMBERS([struct yes_s.yes, struct yes_s.no, struct yes_s.substruct],,, 247 [struct sub { int x; }; 248 struct yes_s { int yes; struct sub substruct; };])]], 249[AT_CHECK_DEFINES( 250[/* #undef HAVE_STRUCT_YES_S_NO */ 251#define HAVE_STRUCT_YES_S_SUBSTRUCT 1 252#define HAVE_STRUCT_YES_S_YES 1 253])]) 254 255 256# AC_CHECK_ALIGNOF 257# ---------------- 258AT_CHECK_MACRO_CROSS([AC_CHECK_ALIGNOF], 259[[AC_CHECK_ALIGNOF(char) 260AC_CHECK_ALIGNOF(charchar, 261[[#include <stddef.h> 262#include <stdio.h> 263typedef char charchar[2];]]) 264AC_CHECK_ALIGNOF(charcharchar) 265]], 266[AT_CHECK_DEFINES( 267[#define ALIGNOF_CHAR 1 268#define ALIGNOF_CHARCHAR 1 269#define ALIGNOF_CHARCHARCHAR 0 270])]) 271 272 273# AC_CHECK_ALIGNOF struct 274# ----------------------- 275AT_CHECK_MACRO_CROSS([AC_CHECK_ALIGNOF struct], 276[[AC_CHECK_ALIGNOF([struct { char c; }]) 277AC_CHECK_ALIGNOF([struct nosuchstruct]) 278]], 279[AT_CHECK([[grep "#define ALIGNOF_STRUCT___CHAR_C___ [^0]" config.h]], 280 0, ignore) 281AT_CHECK([[grep "#define ALIGNOF_STRUCT_NOSUCHSTRUCT 0" config.h]], 282 0, ignore) 283]) 284 285# AC_CHECK_SIZEOF 286# --------------- 287AT_CHECK_MACRO_CROSS([AC_CHECK_SIZEOF], 288[[AC_CHECK_SIZEOF(char) 289AC_CHECK_SIZEOF(charchar,, 290[[#include <stdio.h> 291typedef char charchar[2];]]) 292AC_CHECK_SIZEOF(charcharchar) 293]], 294[AT_CHECK_DEFINES( 295[#define SIZEOF_CHAR 1 296#define SIZEOF_CHARCHAR 2 297#define SIZEOF_CHARCHARCHAR 0 298])]) 299 300 301# AC_CHECK_SIZEOF struct 302# ---------------------- 303AT_CHECK_MACRO_CROSS([AC_CHECK_SIZEOF struct], 304[[AC_C_CONST 305AC_CHECK_SIZEOF([struct { char c; int x; }]) 306AC_CHECK_SIZEOF([const struct { const char *p; int x; }]) 307AC_CHECK_SIZEOF([struct nosuchstruct]) 308]], 309[AT_CHECK([[grep "#define SIZEOF_STRUCT___CHAR_C__INT_X___ [^0]" config.h]], 310 0, ignore) 311AT_CHECK([[grep "#define SIZEOF_CONST_STRUCT___CONST_CHAR_PP__INT_X___ [^0]" config.h]], 312 0, ignore) 313AT_CHECK([[grep "#define SIZEOF_STRUCT_NOSUCHSTRUCT 0" config.h]], 314 0, ignore) 315]) 316 317 318# AC_CHECK_TYPES 319# -------------- 320# Check that it performs the correct actions. 321# Must define HAVE_STRUCT_YES_S, HAVE_INT, but not HAVE_STRUCT_NO_S. 322# `int' and `struct yes_s' are both checked to test both the compiler 323# builtin types, and defined types. 324AT_CHECK_MACRO([AC_CHECK_TYPES], 325[[AC_CHECK_TYPES([int, struct yes_s, struct no_s],,, 326 [struct yes_s { int yes ;} ;])]], 327[AT_CHECK_DEFINES( 328[#define HAVE_INT 1 329/* #undef HAVE_STRUCT_NO_S */ 330#define HAVE_STRUCT_YES_S 1 331])]) 332 333 334# AC_CHECK_TYPES 335# -------------- 336# Check that we properly dispatch properly to the old implementation 337# or to the new one. 338AT_SETUP([AC_CHECK_TYPES: backward compatibility]) 339 340AT_DATA([configure.ac], 341[[AC_INIT 342define([_AC_CHECK_TYPE_NEW], [NEW]) 343define([_AC_CHECK_TYPE_OLD], [OLD]) 344#(cut-from-here 345AC_CHECK_TYPE(ptrdiff_t) 346AC_CHECK_TYPE(ptrdiff_t, int) 347AC_CHECK_TYPE(quad, long long int) 348AC_CHECK_TYPE(table_42, [int[42]]) 349# Nice machine! 350AC_CHECK_TYPE(uint8_t, uint65536_t) 351AC_CHECK_TYPE(a,b,c,d) 352#to-here) 353AC_OUTPUT 354]]) 355 356AT_CHECK_AUTOCONF 357AT_CHECK([[sed -e '/^#(cut-from-here/,/^#to-here)/!d' -e '/^#/d' configure]], 358 0, 359 [NEW 360OLD 361OLD 362OLD 363OLD 364NEW 365]) 366 367AT_CLEANUP 368 369 370# AC_CHECK_FILES 371# -------------- 372# FIXME: To really test HAVE_AC_EXISTS2 and HAVE_AC_MISSING2 we need to 373# open AH_TEMPLATE to `configure.ac', which is not yet the case. 374AT_CHECK_MACRO([AC_CHECK_FILES], 375[touch at-exists1 at-exists2 376ac_exists2=at-exists2 377ac_missing2=at-missing2 378AC_CHECK_FILES(at-exists1 at-missing1 $ac_exists2 $ac_missing2) 379rm at-exists1 at-exists2], 380[AT_CHECK_DEFINES( 381[#define HAVE_AT_EXISTS1 1 382/* #undef HAVE_AT_MISSING1 */ 383])]) 384 385 386 387## ------------------------------ ## 388## AC_CHECK_PROG & AC_PATH_PROG. ## 389## ------------------------------ ## 390 391 392# AT_CHECK_PROGS_PREPARE 393# ---------------------- 394# Create a sub directory `path' with 6 subdirs which all 7 contain 395# an executable `tool'. `6' contains a `better' tool. 396m4_define([AT_CHECK_PROGS_PREPARE], 397[mkdir path 398 399cat >path/tool <<\EOF 400#! /bin/sh 401exit 0 402EOF 403chmod +x path/tool 404 405for i in 1 2 3 4 5 6 406do 407 mkdir path/$i 408 cp path/tool path/$i 409done 410cp path/tool path/6/better]) 411 412 413# -------------------------------- # 414# AC_CHECK_PROG & AC_CHECK_PROGS. # 415# -------------------------------- # 416 417AT_SETUP([AC_CHECK_PROG & AC_CHECK_PROGS]) 418 419AT_CHECK_PROGS_PREPARE 420 421AT_DATA([configure.ac], 422[[AC_INIT 423pwd=`pwd` 424p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6" 425path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'` 426fail=false 427 428AC_CHECK_PROG(TOOL1, tool, found, not-found, $path) 429test "$TOOL1" = found || fail=: 430 431# Yes, the semantics of this macro is weird. 432AC_CHECK_PROG(TOOL2, tool,, not-found, $path) 433test "$TOOL2" = not-found || fail=: 434 435AC_CHECK_PROG(TOOL3, tool, tool, not-found, $path, $pwd/path/1/tool) 436test "$TOOL3" = "$pwd/path/2/tool" || fail=: 437 438AC_CHECK_PROG(TOOL4, better, better, not-found, $path, $pwd/path/1/tool) 439test "$TOOL4" = better || fail=: 440 441# When a tool is not found, and no value is given for not-found, 442# the variable is left empty. 443AC_CHECK_PROGS(TOOL5, missing,, $path) 444test -z "$TOOL5" || fail=: 445 446AC_CHECK_PROGS(TOOL6, missing tool better,, $path) 447test "$TOOL6" = tool || fail=: 448 449# No AC-OUTPUT, we don't need config.status. 450$fail && 451 AC_MSG_ERROR([[CHECK_PROG failed]]) 452AS_EXIT(0) 453]]) 454 455AT_CHECK_AUTOCONF 456AT_CHECK_CONFIGURE 457 458AT_CLEANUP(path) 459 460 461 462## ---------------- ## 463## AC_C_BIGENDIAN. ## 464## ---------------- ## 465 466AT_SETUP([AC_C_BIGENDIAN]) 467AT_KEYWORDS([cross]) 468 469# Make sure that AC_C_BIGENDIAN behave the same whether we are 470# cross-compiling or not. 471 472_AT_CHECK_AC_MACRO( 473 [[AC_C_BIGENDIAN([ac_endian=big],[ac_endian=little],[ac_endian=unknown]) 474 echo $ac_endian > at-endian 475]]) 476 477rm -f config.hin # So that next run of autoheader is quiet. 478_AT_CHECK_AC_MACRO( 479 [[# Force cross compiling. 480 cross_compiling=yes 481 ac_tool_warned=yes 482 AC_C_BIGENDIAN([ac_endian=big],[ac_endian=little],[ac_endian=unknown]) 483 ac_prevendian=`cat at-endian` 484 # Check that we have found the same result as in the previous run 485 # or unknown (because the cross-compiling check is allowed to fail; 486 # although it might be interesting to suppress this comparison, just 487 # to know on which system it fails if it ever does). 488 if test $ac_endian != $ac_prevendian && test $ac_endian != unknown; then 489 AC_MSG_ERROR([unexpected endianness: first run found '$ac_prevendian' but second run found '$ac_endian']) 490 fi 491]]) 492 493# Make sure AC_C_BIGENDIAN with no argument will define WORDS_BIGENDIAN 494AT_CONFIGURE_AC([[AC_C_BIGENDIAN]]) 495# --force is necessary, the computer might be too fast. 496AT_CHECK_AUTOHEADER([--force]) 497AT_CHECK([grep WORDS_BIGENDIAN config.hin], [], [ignore]) 498 499AT_CLEANUP(at-endian) 500 501 502# ------------------------------ # 503# AC_PATH_PROG & AC_PATH_PROGS. # 504# ------------------------------ # 505 506AT_SETUP([AC_PATH_PROG & AC_PATH_PROGS]) 507 508AT_CHECK_PROGS_PREPARE 509 510AT_DATA([configure.ac], 511[[AC_INIT 512pwd=`pwd` 513p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6" 514path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'` 515fail=false 516 517AC_PATH_PROG(TOOL1, tool, not-found, $path) 518test "$TOOL1" = "$pwd/path/1/tool" || fail=: 519 520AC_PATH_PROG(TOOL2, better, not-found, $path) 521test "$TOOL2" = "$pwd/path/6/better" || fail=: 522 523# When a tool is not found, and no value is given for not-found, 524# the variable is left empty. 525AC_PATH_PROGS(TOOL3, missing,, $path) 526test -z "$TOOL3" || fail=: 527 528AC_PATH_PROGS(TOOL4, missing tool better,, $path) 529test "$TOOL4" = "$pwd/path/1/tool" || fail=: 530 531# No AC-OUTPUT, we don't need config.status. 532$fail && 533 AC_MSG_ERROR([[PATH_PROG failed]]) 534AS_EXIT(0) 535]]) 536 537AT_CHECK_AUTOCONF 538AT_CHECK_CONFIGURE 539 540AT_CLEANUP(path) 541 542 543 544 545## -------------- ## 546## AC_PATH_XTRA. ## 547## -------------- ## 548 549 550AT_SETUP([AC_PATH_XTRA]) 551 552_AT_CHECK_AC_MACRO([AC_PATH_XTRA]) 553 554# Check X_DISPLAY_MISSING. 555AT_CHECK_CONFIGURE([--without-x]) 556AT_CHECK_DEFINES( 557[#define X_DISPLAY_MISSING 1 558]) 559 560AT_CLEANUP 561 562 563## ------------------------------- ## 564## Obsolete non-updatable macros. ## 565## ------------------------------- ## 566 567 568AT_CHECK_MACRO([AC_SYS_RESTARTABLE_SYSCALLS], , ,[-W no-obsolete]) 569AT_CHECK_MACRO([AC_FUNC_WAIT3], , ,[-W no-obsolete]) 570