编写configure.ac
configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便)
最基本的组成可以是下面的
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-FOUND
AC_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
原文链接:http://blog.csdn.net/john_crash/article/details/49889949
编写configure.ac的更多相关文章
- configure.ac和Makefile.am的格式解析概述
1. configure.ac和Makefile.am的格式解析概述 1.1. Autotools相关工具链 1.1.1. Autotools 1.1.2. 其他相关工具 1.2. 工具链的流程 1. ...
- configure.ac:32: error: possibly undefined macro: AC_DEFINE
在ubuntu 下编译snappy时,在检查依赖关系时,处理autoconf的包时,在相关依赖包都已经安装的情况下,报如下错误,死活不过. configure.ac:32: error: possib ...
- configure.ac:20: error: Autoconf version 2.65 or higher is required
安装thrift例如,下面的问题出现: configure.ac:20: error: Autoconf version 2.65 or higher is required wget http:// ...
- 解决 configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL
当安装configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are le ...
- configure.ac中AC_CHECK_LIB的问题
编译Linux程序时,使用configure.ac生成的configure程序,时常会出现AC_CHECK_LIB检查某个库失败 而相应库通常是存在的,只是依赖于其他的库,此时,需要乃至AC_CHEC ...
- configure.ac:8: error: Autoconf version 2.64 or higher is required
安装Resource Agents的时候出现错误:configure.ac:9: error: Autoconf version 2.63 or higher is required.指的是autoc ...
- 懒人学习automake, Makefile.am,configure.ac(转)
已经存在Makefile.am,如何生成Makefile? 步骤: [root@localhost hello]# autoscan .///在当前文件夹中搜索 [root@localhost hel ...
- configure.ac:3: error: Autoconf version 2.68 or higher is required
configure.ac:3: error: Autoconf version 2.68 or higher is required 参考博客:https://blog.csdn.net/pretty ...
- 如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile
1 2 3 4 5 6 7 8 9 //根据configure.in和Makefile.am生成makefile的步骤,基于UBUNTU 12.04 1.autoscan (可选) 2.aclocal ...
随机推荐
- 根据iframe获取window
今天使用layui弹出窗口,需要将函数写在弹出的窗口,但是按钮事件是在父层窗口绑定的,这样就要在父层窗口调用子层窗口的函数. 子层函数与父层函数 function topup() { console. ...
- iframe跨页面调用函数
在项目中难免会遇到这样一个问题就是页面引入了IFrame并且需要父页面调用子页面函数或者子页面需要调用父页面函数.比如说:现在有两个页面parent.html和child.html.其中parent. ...
- 20145216史婧瑶《Java程序设计》第二次实验报告
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20145333 《Java程序设计》第7周学习总结
20145333 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 1.格林威治标准时间(GMT):常被不严谨地当成是UTC时间,现已不作为标准时间使用. 2.世界时(UT ...
- Java 安装教程(Eclipse) + 汉化 + 简单创建java项目
Java 安装教程(Eclipse) 要安装Java 要分两个步骤: 1.JDK的安装 2.Eclipse的安装 3.Eclipse汉化 4.Eclipse创建简单java项目 1和2的顺序不能颠倒, ...
- Vim 基本設置 – 使用Vim-plug管理插件 (3)【转】
本文转载自:https://staryoru.github.io/vim-plugin-manager/ Vim中有很多非常好用的插件(plugin),對於這些插件的安裝.更新與移除等等,使用一個插件 ...
- scrapy之手机app抓包爬虫
手机App抓包爬虫 1. items.py class DouyuspiderItem(scrapy.Item): name = scrapy.Field()# 存储照片的名字 imagesUrls ...
- ThinkPHP的URL重写时遇到No input file specified的解决方法
因为在Fastcgi模式下,php不支持rewrite的目标网址的PATH_INFO的解析 ThinkPHP运行在URL_MODEL=2时,会出现 No input file specified.的情 ...
- canvas实现鼠标拖拽矩形移动改变大小
项目的一个新需求,动态生成矩形框,鼠标点击拖动改变矩形框的位置,并可以调整大小. 之前做过一个小demo,需求类似,但是在canvas内只有一个矩形框,拖动移动,当时记得是用isPointInPath ...
- Integer 类型数值判断相等的坑
题目: public static void main(String[] args) { Integer a = 100, b = 100; Integer c = 150, d = 150; Sys ...