test -z "$LDFLAGS" && LDFLAGS="-I/usr/include"
AC_SUBST(LBFLAGS)
dnl Tests for UNIX
variants
dnl
AC_CANONICAL_HOST
AC_CANONICAL_HOST報告從GNU觀點看到的宿主機類型.它輸出cpu-company-system形式的系統
名稱.例如,筆者的一個系統上,AC_CANONICAL_HOST報告其類型為i686-unknown-linux.
dnl
Tests for
programs
dnl
AC_PROG_CC
AC_PROG_LEX
AC_PROG_AWK
AC_PROG_YACC
AC_CHECK_PROG(SHELL,bash,/bin/bash,/bin/sh)
這一代碼段按順序判斷并設置了編譯器,詞法分析器lexer,awk,yacc以及本地shell.
dnl
Tests for libraries
dnl
AC_CHECK_LIB(socket,
socket)
AC_CHECK_LIB(resolv,res_init,[echo"res_init() not in
libresolv"],
[echo "res_init() found int libresolv"])
"Test for
libraries"的這一代碼段展示了怎么為autoconf的宏編寫自定義的命令.
dnl Tests for header
files
dnl
AC_CHECK_HEADER(killer.h)
AC_CHECK_HEADERS([resolv.h
temio.h curses.h sys/time.h fcntl.h \
sys/fcntl.
memory.h])
AC_DECL_SYS_SIGLIST
AC_HEADER_STDC
以"\"結尾的一行說明了多參數續行的正確方式.前面已經介紹過,使用字符"\"告訴m4和shell需要續行,并且用m4的引用符號把整個參數括起來.
dnl
Tests for
typedefs
dnl
AC_TYPE_GETGROUPS
AC_TYPE_SIZE_T
AC_TYPE_PID_T
dnl
Tests for structures
AC_HEADER_TIME
AC_STRUCT_TIMEZONE
dnl Tests
of compiler
behavior
dnl
AC_C_BIGENDIAN
AC_C_INLINE
AC_CHECK_SIZEOF(int,
32)
AC_C_BIGENDIAN宏將產生一個警告,因為調用AC_TRY_RUN時沒有設置默認值以允許交叉編譯,可以忽略這個警告.
dnl
Tests for library
functions
dnl
AC_FUNC_GETLOADAVG
AC_FUNC_MMAP
AC_FUNC_UTIME_NULL
AC_FUNC_VFORK
dnl
Tests of system
services
dnl
AC_SYS_INTERPRETER
AC_PATH_X
AC_SYS_RESTARTABLE_SYSCALL
AC_SYS_RESTARTABLE_SYSCALLS宏將產生一個警告,因為調用AC_TRY_RUN時沒有默認值允許交叉編譯,可以忽略這個警告.
dnl
Tests in this section exercise a few of `autoconf' ''s generic
macros
dnl
dnl First, let's see if we have a usable void pointer
type
dnl
AC_MSG_CHECKING(for a usable void pointer
type)
現在情況開始變得有趣起來.基本上,普通宏允許你通過編寫自己的宏對autoconf進行擴展.例如,AC_MSG_CHECKING在屏幕上打印字符串"checking",隨后是一個空格以及傳入的參數
AC_TRY_COMPILE(
[ ],
[ char *ptr;
void *xmalloc();
ptr = (char *)
xmalloc(1);
],
[AC_DEFINE(HAVE_VOID_POINTER)
AC_MSG_RESULT(usable void pointer]
)
留意AC_TRY_COMPILE宏.autoconf能夠把C代碼嵌入到一個C程序框架中,并把這個程序寫入已生成的configure腳本中,以便在
運行configure時編譯這個程序;然后,configure捕獲編譯器的輸出并查找錯誤.AC_DEFINE
(HAVE_VOID_POINTER)產生了一個名為HAVE_VOID_POINTER的預處理器符號(必須將它放置在./acconfig.h中,
因為它并不在其他地方存在).如果編譯成功,configure把"#define HAVE_VOID_POINTER
1"寫入到config.h中并且在屏幕上打印"usable void pointer";如果編譯失敗則在config.h中寫入"/*
#undef HAVE_VOID_POINTER */,并顯示"no usable void
pointer".在你自己的源代碼文件中,只需按如下的方式測試這個預處理符號:
#ifdef HAVE_VOID_POINTER
/* do
something */
#else
/* do something else */
#endif
dnl Now,
let's exercises the preprocessor
dnl
AC_TRY_CPP(math.h, echo 'found
math.h', echo 'no math.h - deep doo
doo!)
如果configure找到了頭文件math.h,它會在屏幕上顯示"found math.h";否則它通知用戶出現了一個問題.
dnl
Next, we test the linker
dnl
AC_TRY_LINK([#ifndef
HAVE_UNISTD_H
#include <signal.h>
#endif],
[char *ret =
*(sys_siglist + 1);],
[AC_DEFINE(HAVE_SYS_SIGLIST), AC_MSG_RESULT(got
sys_siglist)],
[AC_MSG_RESULT(no
sys_siglist)])
這一段代碼測試連接器.同樣,因為HAVE_SYS_SIGLIST不是一個標準預處理器符合,你必須在./acconfig.h中聲明它.
dnl
Finally, set a default value for a ridiculous
type
dnl
AC_CHECK_TYPE(short_short_t, unsigned
short)
最后的測試只檢查一種(希望的)不存在C數據類型.如果確實沒有,則將short_short_t定義為unsigned
short.讀者可以到config.h中查找與short_short_t相關的#define指令來確認這個測試的結果.