使用autotools生成Makefile(四) 总结

一、configure.ac文件

常用宏

AC_PREREQ
原型:AC_PREREQ(VERSION)
功能:需要的最低autoconf版本

AC_PREREQ([2.65])

AC_INIT
原型:AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)
功能:autoconf初始化。告诉autoconf包名称,版本,报告bug的Email

AM_INIT_AUTOMAKE
原型:AM_INIT_AUTOMAKE([OPTIONS…])
功能:初始化automake
参数:

参数描述
-Wall打开全部警告
-Werror将警告当错误处理
-foreign放宽一些GNU标准需求
-1.11.1需要automake的最低版本
-dist-bzip2在使用make dist和make distcheck期间同时创建tar.bz2存档
-tar-ustar使用ustar格式创建tar存档

AM_INIT_AUTOMAKE([foreign -Wall -Werror])

AC_CHECK_HEADERS 或 AC_CHECK_HEADER
原型:
AC_CHECK_HEADERS(HEADERS…)
AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT])
功能:检查头文件。代码中可以使用HAVE_XXX_H的方式检查该头文件是否存在

# 配置文件中的定义
AC_CHECK_HEADERS([string.h])

# 代码中的定义
#if HAVE_STRING_H
#include <string.h>
#else
/* replace header file */
#endif

AC_CONFIG_SRCDIR
原型:AC_CONFIG_SRCDIR ( unique-file-in-source-dir )
功能:确认某些关键文件在正确的目录中

AC_CONFIG_HEADERS
原型:AC_CONFIG_HEADERS(HEADERS…)
功能:创建头文件

# 创建config.h
AC_CONFIG_HEADERS([config.h])

# 创建config.h, 它的输入文件是config.h.ini, 在autoheader时被创建
AC_CONFIG_HEADERS([config.h:config.h.ini])

AC_CHECK_PROGS
原型:AC_CHECK_PROGS (variable, progs-to-check-for, [ value-if-not-found ], [ path = ‘$PATH’])
功能:将variable定义为第一个发现的程序,如果没有发现就设置为VAL-IF-NOT-FOUND

# 如果发现tar,gtar,就设置到变量$TAR中,如果没有发现就设置为‘:’
AC_CHECK_PROGS([TAR], [tar gtar], [:])
if test "$TAR" = :; then
AC_MSG_ERROR([This package needs tar])
fi

AC_DEFINE
原型:AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)
功能:定义一个宏并输出到config.h中
注意:该宏是用于生成C语言的宏。如果value是一个shell变量可以使用AC_DEFINE_UNQUOTED

AC_SUBST
原型:AC_SUBST(VARIABLE, [VALUE])
功能:定义一个宏到Makefile中,可以在Makefile.am中以@XXX@的形式使用

AC_CHECK_LIB
原型:AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])
功能:检查库是否存在并且包括函数FUNCT

AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence])
AC_SUBST([EFENCELIB])

AM_CONDITIONAL
原型:AM_CONDITIONAL(NAME, CONDITION)
功能:执行CONDITION中的shell语句,如果成功则定义变量NAME

# 仅当系统中存在bar.h文件时定义WANT_BAR
AC_CHECK_HEADER([bar.h], [use_bar=yes])
AM_CONDITIONAL([WANT_BAR], [test "$use_bar" = yes])

编译器和工具检查

功能
AC_PROG_CC检查C编译器
AC_PROG_CPP检查C++编译器
AC_PROG_INSTALL检查install工具
LT_INIT检查libtool
AC_PROG_SED检查sed工具
AC_PROG_YACC检查YACC工具
AC_PROG_LEX检查LEX工具

错误处理

功能
AC_MSG_ERROR打印错误信息并退出
AC_MSG_WARN打印错误信息但不退出

configure.ac 常用宏总结

标签名说明
AC_PREREQ声明autoconf要求的版本号
AC_INIT定义软件名称、版本号、联系方式
AM_INIT_AUTOMAKE必须要的,指定编译参数
AC_CONFIG_SRCDIR用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性
AC_CONFIG_HEADER指定产生的配置文件名称(一般是config.h),用于生成config.h文件,以便 autoheader 命令使用
AC_PROG_CC用以探测当前系统的C编译器
AC_PROG_RANLIB用于生成静态库
AC_PROG_LIBTOOL用于生成动态库
AM_PROG_AR生成静态库时使用,用于指定打包工具,一般指ar
AC_CONFIG_FILES告知autoconf本工程生成哪些相应的Makefile文件,不同文件夹下的Makefile通过空格分隔
AC_OUTPUT最后一个必须的宏,用以输出需要产生的文件
AC_PROG_CXX用于探测系统的c++编译器
AC_CHECK_LIB探测工程中出现的库文件及库文件中的方法
PKG_CHECK_MODULES利用pkg-config生成 _CFLAGS _LIBS
AC_SUBST输出能够被Makefile.am使用的变量

二、Makefile.am文件

父目录

使用SUBDIRS = XXX的格式增加子目录。

子目录
在autotools中,编译和安装的规则是在一起的:安装目录_编译类型=编译目标

安装目录

安装目录Makefile中的变量使用方式
prefix默认/usr/local通过–prefix指定
exec_prefix${prefix}同prefix
bindir${exec_prefix}/binbin_编译类型
libdir${exec_prefix}/liblib_编译类型
includedir${prefix}/includeinclude_编译类型
noinstdir不安装
  • 设置编译目标时需要去掉dir后缀
  • 如果自定义一个安装目录时需要加上dir的后缀

编译类型

编译类型说明使用方式
PROGRAMS可执行程序bin_PROGRAMS
LIBRARIES库文件lib_LIBRARIES
LTLIBRARIESlibtool库文件lib_LTLIBRARIES
HEADERS头文件include_HEADERS
SCRIPTS脚本文件script_SCRIPTS
DATA数据文件conf_DATA
  • script_SCRIPTS和conf_DATA中的安装目录需要手动配置

编译目标

参数含义
_SOURCES源代码文件
_LIBADD需要链接的库
_LDADD需要链接的库
_LDFLAGS对应-L, -l, -shared, -fpic等选项
_LIBTOOLFLAGSlibtool编译时的选项
  • 编译选项也可以使用宏AM_CFLAGS进行配置
  • 如果你的编译目标为lib时,需要使用_LIBADD
  • 如果你的编译目标为bin时,需要使用_LDADD

特别注意
一般在Makefile.am中用以下关键字表示make最终要生成的目标

  1. bin_PROGRAMS 该条目后列举的若成功编译,则会生成二进制可执行文件
  2. noinst_LIBRARIES 该条目后列举的若成功编译,则最终会生成中间文件
  3. lib_LTLIBRARIES 该条目后列举的若成功编译,则会生成库文件(.so .a文件)

其余一些关键字:

  1. _CFLAGS 或 _CPPFLAGS 列举预处理阶段源码中包含的头文件的寻找路径

  2. _SOURCES 列举要生成的目标文件所依赖的源码文件(.c .cpp等)

  3. _LIBADD 和 _LDADD
    均表示链接阶段要链接的库名
    不同:
    _LIBADD 用于Makefile生成中间文件(.la等)或库文件(.so .a)的情况
    _LDADD 用于Makefile生成二进制可执行文件的情况

  4. 涉及到make install操作时要注意三个关键字(后2个需要成对出现)
    DESTDIR : 该变量默认为空,安装时需要sudo权限,可安装到系统目录
    _include_HEADERS : 列举要安装的头文件
    _includedir : 指定头文件的安装路径


三、其他

安装配置文件

某些时候,我们需要将一些配置文件安装到特殊的位置,可以使用下面的方式:

# 定义一个编译目标,安装目录为conf,编译类型为数据文件
confdir = ${exec_prefix}/conf
conf_DATA = utils.conf

打包

缺省情况下打包内容如下:

  • 所有源文件。
  • 所有[Makefile.am]/[Makefile.in]。
  • configure需要读取的文件。
  • [Makefile.am]和[configure.ac]包含的文件。
  • 缺省文件,如README,ChangeLog,NEWS,AUTHORS。

如果需要打包其它文件(包括一些库,特殊的头文件,配置文件,帮助文件),需要特殊指定:

使用EXTRA_DIST来指定。
在编译目标前添加dist或nodist前缀。


为configure定义特殊接口

使用AC_ARG_WITH,添加–with-package参数
使用AC_ARG_ENABLE,添加-–enable-feature参数


配置特殊宏

  • 新建一个单独的目录,用于存放自定义宏,一般定义为m4
  • 为每个宏定义一个文件,以.m4结尾
  • 使用AC_DEFUN定义具体的宏
  • 运行aclocal -Im4生成aclocal.m4
  • 在根目录下的Makefile.am中添加ACLOCAL_AMFLAGS = -I m4
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值