一个带注释的autoconf脚本(2)
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指令来确认这个测试的结果.
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指令来确认这个测试的结果.