编写configure.ac
2015-11-17 17:52
417 查看
configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便)
最基本的组成可以是下面的
基本含义已经在上篇文章中介绍了,这里不再叙述。
例如:
并且这些名称将出现在config.h,你可以在程序直接引用这些宏。
如果发现tar,gtar,就设置到变量$TAR中,如果没有发现就是设置为‘:’
如:AC_SUBST([FOO],[foo])
等价于
FOO=foo
AC_SUBST([FOO])
或者
AC_SUBST([FOO])
FOO=foo
例如:
稍后可以使用(EFENCELIB)在链接规则中。如果没有使用ACT−IF−FOUND项,并且库被发现存在。ACCHECKLIB将会做下面的操作,LIBS=”−lLIBRARYLIBS"和#dedefine HAVE_LIB{LIBRARY}。Autmake会在链接的时候使用$LIBS。
例如:
检查sys/param.h unistd.h如果存在定义定义#define HAVE_SYS_PARAM_H,HAVE_UNISTD_H。
注意:一般情况下不能转换的符号都用‘_’代替。
你可以在你的头文件这么使用
例如:
AC_CONFIG_HEADERS([config.h])
将从config.h.in创建config.h。
script.in
.in是文件模板。@SED@、@TAR@将被AC_SUBST([SED]),AC_SUBST([TAR])替换。这样你就可以将配置中的变量传送到其他文件中去。
Makefile.in也使用@XYZ@作为替换部分,但是Automake已经做了将所有的XYZ=@XYZ@的定义,你只需要简单使用$(XYZ)就可以了。
例如:AM_INIT_AUTOMAKE([foreign -Wall -Werror])
一些可选的选项:
举例:configure.ac
仅当当前系统中存在bar.h文件时打开WANT_BAR。
具体细节可以参考
gnu automake
最基本的组成可以是下面的
AC_INIT([PACKAGE], [VERSION], [BUG-REPORT-ADDRESS]) # Checks for programs. # Checks for libraries. # Checks for header les. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. # Output les. AC_CONFIG_FILES([FILES]) AC_OUTPUT
基本含义已经在上篇文章中介绍了,这里不再叙述。
AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)
autoconf 强制性初始化。告诉autoconf包名称,版本,一个bug报告emall。例如:
AC_INIT([hello], [1.0], [bug-report@address])
并且这些名称将出现在config.h,你可以在程序直接引用这些宏。
/* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "BUG-REPORT-ADDRESS" /* Define to the full name of this package. */ #define PACKAGE_NAME "FULL-PACKAGE-NAME" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "FULL-PACKAGE-NAME VERSION" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "full-package-name" /* Define to the version of this package. */ #define PACKAGE_VERSION "VERSION"
AC_PREREQ(VERSION)
需要的最低autoconf版本,如:AC_PREREQ([2.65])AC_CONFIG_SRCDIR(FILE)
一个安全的检查。FILE将是一个发布的源文件。这让configure脚本确保自己运行在正确的目录中。如:AC_CONFIG_SRCDIR([src/main.c])AC_CONFIG_AUX_DIR(DIRECTORY)
配置辅助脚本位置,如install-sh和depcomp等。如:AC_CONFIG_AUX_DIR([build-aux])AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, …
编译器检测。AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, …
发现好的实现并且设置变量SED,YACC,$LEX等。AC_CHECK_PROGS(VAR, PROGS, [VAL-IF-NOT-FOUND])
将VAR定义为第一个发现的程序,如果没有发现就设置为VAL-IF-NOT-FOUNDAC_CHECK_PROGS([TAR], [tar gtar], [:]) if test "$TAR" = :; then AC_MSG_ERROR([This package needs tar.]) fi
如果发现tar,gtar,就设置到变量$TAR中,如果没有发现就是设置为‘:’
AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])
打印错误信息ERROR-DESCRIPTION并退出,EXIT-STATUS设置退出状态。AC_MSG_WARN(ERROR-DESCRIPTION)
打印但是不退出。AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)
输出到configu.h中。/* DESCRIPTION */ #define VARIABLE VALUE
AC_SUBST(VARIABLE, [VALUE])
定义变量$VARIABLE=VALUE,进入Makefile。如:AC_SUBST([FOO],[foo])
等价于
FOO=foo
AC_SUBST([FOO])
或者
AC_SUBST([FOO])
FOO=foo
AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])
检查库是否存在并且包括函数FUNCT。如果发现库就执行ACT-IF-FOUND,否则执行ACT-IF-NOT。例如:
AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence]) AC_SUBST([EFENCELIB])
稍后可以使用(EFENCELIB)在链接规则中。如果没有使用ACT−IF−FOUND项,并且库被发现存在。ACCHECKLIB将会做下面的操作,LIBS=”−lLIBRARYLIBS"和#dedefine HAVE_LIB{LIBRARY}。Autmake会在链接的时候使用$LIBS。
AC_CHECK_HEADERS(HEADERS…)
检查头HEADERS并且给每一个发现的头文件定义#define HAVE_HEADER_H例如:
AC_CHECK_HEADERS([sys/param.h unistd.h]) AC_CHECK_HEADERS([wchar.h])
检查sys/param.h unistd.h如果存在定义定义#define HAVE_SYS_PARAM_H,HAVE_UNISTD_H。
注意:一般情况下不能转换的符号都用‘_’代替。
你可以在你的头文件这么使用
#if HAVE_UNISTD_H #include <unistd.h> #endif
AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT])
检查一个头文件。AC_CONFIG_HEADERS(HEADERS…)
创建头文件的HEADER.in,HEADERS包含使用AC_DEFINE的定义。例如:
AC_CONFIG_HEADERS([config.h])
将从config.h.in创建config.h。
AC_CONFIG_FILES([Makefile sub/Makefile script.sh:script.in])
Automake创建FILE.in从每一个有FILE.am的FILE。他也可以出来非Makefile。script.in
#!/bin/sh SED='@SED@' TAR='@TAR@' d=$1; shift; mkdir "$d" for f; do "$SED" 's/#.*//' "$f" \ >"$d/$f" done "$TAR" cf "$d.tar" "$d"
.in是文件模板。@SED@、@TAR@将被AC_SUBST([SED]),AC_SUBST([TAR])替换。这样你就可以将配置中的变量传送到其他文件中去。
Makefile.in也使用@XYZ@作为替换部分,但是Automake已经做了将所有的XYZ=@XYZ@的定义,你只需要简单使用$(XYZ)就可以了。
AM_INIT_AUTOMAKE([OPTIONS…])
检查automake尝试Makefile时的必要的工具。例如:AM_INIT_AUTOMAKE([foreign -Wall -Werror])
一些可选的选项:
选项 | 解释 |
---|---|
-Wall | 打开全部警告 |
-Werror | 将警告当错误处理 |
-foreign | 放宽一些GNU标准需求 |
-1.11.1 | 需要automake的最低版本 |
-dist-bzip2 | 在使用make dist和make distcheck期间同时创建tar.bz2存档 |
-tar-ustar | 使用ustar格式创建tar存档 |
AC_CONFIG_FILES([Makefile sub/Makefile])
写入Makefile.am和sub/Makefile.am文件AM CONDITIONAL(NAME, CONDITION)
定义一个条件名NAME,CONDITION将由shell解释执行,如果成功NAME将被打开。举例:configure.ac
AC_CHECK_HEADER([bar.h], [use_bar=yes]) AM_CONDITIONAL([WANT_BAR], [test "$use_bar" = yes])
仅当当前系统中存在bar.h文件时打开WANT_BAR。
具体细节可以参考
gnu automake
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 浅谈汇编器、编译器和解释器
- 如何写好 C main 函数
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- 修复mysql数据库
- Lua和C语言的交互详解
- nodejs中的fiber(纤程)库详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结