automake应用小结

Configure、Makefile.am、Makefile.in、Makefile文件关系

在这里插入图片描述

autoscan(autoconf)

扫描源代码以搜寻普通的可移植性问题,比如检查编译器、库、头文件等,生成文件configure.scan,是configure.ac的雏形。
SourceFiles --> autoscan --> configure.scan --> configure.ac

aclocal(automake)

根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏,将configure.ac文件所需要的宏集中定义到文件aclocal.m4中,aclocal.m4是一个perl脚本程序。

autoheader(autoconf)

根据configure.ac中的某些宏,比如cpp宏定义,运行aclocal.m4,生成config.h.in

automake

automake将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile,如果configure.ac中定义了一些特殊的宏,如AC_PROG_LIBTOOL,将会调用libtoolize,否则将会自己生成config.guess和config.sub文件

autoconf

将configure.ac中的宏展开,生成configure脚本,这个过程可能用到aclocal.m4中定义的宏

automake操作流程

在这里插入图片描述

  • 在存放源代码目录下执行autoscan命令生成configure.scan文件
  • 将configure.scan文件改名为configure.in或者configure.ac,并对其默认配置进行修改
  • 执行aclocal、autoconf两个命令,分别生成aclocal.m4、configure文件
  • 执行autoheader命令,分别生成config.h.in文件
  • 创建一个名为Makefile.am的文件,并输入相应的内容
  • 执行automake --add-missing,根据Makefile.am文件,生成Makefile.in
  • 执行./configure脚本文件,它根据Makefile.in文件,生成最终的Makefile文件

configure.in内容修改

  • configure.in文件里基本内容就是一系列的m4宏,在运行时根据传递的参数,定义的宏就会被扩展为shell的脚本代码段
  • 通过简单的configure.ac文件,了解常用的宏和含义
    AC开头的宏来自autoconf,AM开头的宏来自automake。GNOME开头的宏来自Gnomemacros目录,都是用m4宏语言编写的。如果将autoconf和automake安装在/usr目录下,autoconf和automake的标准宏一般放在/usr/share/aclocal目录下。
#用于健全性检查,以保证configure脚本已正确定位源文件目录
AC_INIT(src/hello.c) #指定main函数所在的文件

#指定要创建的头文件
AM_CONFIG_HEADER(config.h)
#初始化automake,宏参数是要编译的应用程序的名称和版本号

AM_INIT_AUTOMAKE(GnomeHello,0.1) #指定程序名称和版本

AM_MAINTAINER_MODE
#指定一个附加的目录,用于搜索m4宏
AM_ACLOCAL_INCLUDE(macros)
GNOME_INIT

#检查可用的编译器
AC_PROG_CC #C语言编译器
AC_PROG_CPP #C++语言编译器
AC_PROG_CXX
AC_ISC_POSIX
AC_HEADER_STDC
AC_ARG_PROGRAM

AM_PROG_LIBTOOL
GNOME_COMPILE_WARNINGS
ALL_LINGUAS=”es”
AM_GNU_GETTEXT
#输出一个变量到由configure生成的文件中
AC_SUBST(CFLAGS)
AC_SUBST(CPPFLAGS)
AC_SUBST(LDFLAGS)
#列出由configure脚本创建的文件,这些文件由.in后缀的同名文件生成,例如src/Makefile由src/Makefile.in生成
AC_OUTPUT([
Makefile
macros/Makefile
src/Makefile
intl/Makefile
po/Makefile.in
pixmaps/Makefile
doc/Makefile
doc/C/Makefile
doc/es/Makefile
])

Makefile.am文件编写

全局变量说明
PROGRAMS表示可执行文件
SOURCES表示源文件
CPPFLAGS
LDFLAGS
INCLUDES
LDADD
HEADERS头文件
LIBRARIES表示库文件
LTLIBRARIES表示库文件,前面的LT表示libtool
DATA数据文件,不能执行
SCRIPTS脚本文件,可以被执行,如example_SCRIPTS

Makefile.am案例

#AUTOMAKE_OPTIONS用来设定automake的选项,一般执行automake时检查目录下是否存在标准GNU套件具有的文件档案,例如NEWS、AUTHOR、ChangeLog等
#设置成foreign时,automake改用一般软件套件标准来检查,而gnu是缺省设置,该ji'bie  尽可能检查是否服从GNU标准
AUTOMAKE_OPTIONS = foreign
# bin_PROGRAMS表示要生成可执行应用程序文件,这里bin表示可执行文件在安装时被安装到系统中
#如果不需要安装到系统,使用noinst_PROGRAMS替代
bin_PROGRAMS = client
#client_SOURCES表示生成可执行应用程序所用的所有源文件,多个文件空格隔开
#如果文件名含有".",则需要改为"_",如libcommon_a_SOURCES
client_SOURCES = key.c connect.c client.c main.c session.c hash.c
#client_CPPFLAGS表示C语言的预处理器参数
#例如:-DCONFIG_DIR=\“$(sysconfdir)\”等价#define CONFIG_DIR “$(sysconfdir)”
client_CPPFLAGS = -DCONFIG_DIR=\“$(sysconfdir)\” -DLIBRARY_DIR=\”$(pkglibdir)\”
#client_LDFLAGS表示连接时所需要的库文件选项标识,对应于-l,-shared等选项
client_LDFLAGS = -export-dynamic -lmemcached
#noinst_HEADERS表示该头文件只是参加可执行文件的编译,而不用安装到安装目录下
#如果需要安装到系统,使用include_HEADERS替代
noinst_HEADERS = client.h
#表示连接时所需要的头文件
INCLUDES = -I/usr/local/libmemcached/include/
#client_LDADD表示连接时所需要的库文件
client_LDADD = $(top_builddir)/sx/libsession.la \

可执行文件、静态库、头文件、数据文件的常规书写

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS、noinst_LIBRARIES代替lib_LIBRARIES,依次类推。
  • 全局变量,例如$(top_builddir)等全局变量,是Makefile.am系统定义的一个基本路径变量,表示生成目标文件的最上层目录,如果这个Makefile.am文件变成其他的$(top_srcdir),这个表示工程的最顶层目录,其实是第一个Makefile.am的入口目录,因为Makefile.am文件可以被递归性的调用。
  • $(sysconfdir):在系统安装工具的时候,经常遇到配置安装路径的命令,如:./configure -prefix=/install/apache,其实调用这个之后,就定义一个变量$(prefix),还有一些预定义好的目录,可以在顶层的Makefile文件中看到
bindir = $(prefix)/bin
libdir = $(prefix)/lib
datadir=$(prefix)/share
sysconfdir=$(prefix)/etc
includedir=$(prefix)/include
#这些变量可以用于定义其他目录
#例如将client.h安装到include/client目录下,可以写
#clientincludedir=$(includedir)/client
#clientinclude_HEADERS=$(top_srcdir)/client/client.h
#也可以定义新的安装目录下的路径
devicedir = ${prefix}/devices #在安装目录下,新建一个devices目录
device_DATA = pathdir/package #把pathdir/package拷贝到${prefix}/devices目录下
device_HEADERS = pathdir/xxx.h #把pathdir/xxx.h拷贝到${prefix}/devices目录下
#package文件就作为数据文件安装到device目录之下

配置静态库

  • 直接指定 XXXX_LTLIBRARIES或者XXXX_LIBRARIES就可以了。同样如果不需要安装到系统,将XXXX换成noinst就可以
  • 一般推荐使用libtool库编译目标,因为automake包含libtool,方便生成跨平台可移植的库
    案例:
noinst_LTLIBRARIES = libutil.la
oinst_HEADERS = inaddr.h util.h compat.h pool.h xhash.h url.h device.h
ibutil_la_SOURCES = access.c config.c datetime.c hex.c inaddr.c log.c device.c pool.c rate.c sha1.c stanza.c str.c xhash.c
ibutil_la_LIBADD = @LDFLAGS@
  • noinst_LTLIBRARIES,另外还有LIBRARIES,两个都表示库文件,前者表示libtool库。如果需要安装到系统中的话,用lib_LTLIBRARIES
  • .la为libtool自动生成的一些共享库,主要记录了一些配置信息。如下命令查看*.la文件的格式 $file *.la
  • .a为静态库,是好多个.o合在一起,用于静态连接
  • 如果想编译 .a 文件,那么上面的配置就改成如下结果:
noinst_LTLIBRARIES = xxx.a
noinst_HEADERS = a.h b.c
xxx_a_SOURCES = a.c b.c xxx.c
xxx_a_LIBADD = @LDFLAGS@

注意:静态库编译连接时需要其它的库的话,采用XXXX_LIBADD选项,而不是前面的XXXX_LDADD。编译静态库是比较简单的,因为直接可以指定其类型。

配置动态库

  • 如果想要编译XXX.so动态库文件,需要用到_PROGRAMS类型
  • 如果希望将动态库安装到lib目录下需要写成lib_PROGRAMS就可以了,lib表示安装的路径,但是automake不允许这样直接定义,所以可以采用下面的办法,同样是将动态库安装到lib目录下:
xxxlibdir=$(libdir)/dir  #新建一个目录,就是该目录就是lib目录,运行后xxx.so将安装到改目录下
xxxlib_PROGRAMS=xxx.so
xxx_so_SOURCES=xxx.C
xxx_so_LDFLAGS=-shared -fpic #GCC编译动态库的选项

SUBDIRS功能

  • 一个大型的工程项目是由许多个可执行文件和库文件组成,包含多个目录,每个目录下都有用于生成该目录下的目标文件的Makefile.am文件
  • SUBDIRS指示当前目录下哪些子目录需要编译,多个目录用空格隔开

顶层的Makefile.am文件

EXTRA_DIST = Doxyfile.in README.win32 README.protocol contrib UPGRADE
devicedir = ${prefix}/device
device_DATA = package
SUBDIRS = etc man
ifUSE_LIBSUBST
SUBDIRS += subst
endif
SUBDIRS += tools io sessions util client dispatch server hash storage sms
  • SUBDIRS表示在处理目录之前,要递归处理哪些子目录,要注意处理的顺序
  • EXTRA_DIST:将哪些文件一起打包

打包处理

Automake会自动的打包,自动打包的内容如下:

  • 所有程序的源文件
  • 所有子目录里的的Makefile.am文件
  • Makefile.am中包含的文件
  • ./configure所要读取的文件
  • EXTRA_DIST所指定的文件
  • dist和nodist指定的文件,也可将其中一个源文件指定为不打包:
    例如: nodist_client_SOURCES = client.c
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值