在 Unix 上写过程序的人尤其是用 C 来开发程序的人一般都遇到过 Makefile,用 make 来开发和编译程序的确很方便,可是要写出一个 Makefile 就不那么简单了。GNU Make 那份几百页的文件,让许多人害怕。当然,现在关于 make的文档比较多,不过写一个 Makefile 总是一件很烦人的事情,GNU Autoconf 及Automake 这两个软件就是帮助程序开发者轻松产生 Makefile 文件的。现在的 GNU 软件如 Apache, MySQL Minigui 等都是利用 Autoconf,Automake实现自动编译的。用户只要使用 “./configure”, “make”, “make install” 就可以把程序安裝到系统中。
Makefile 基本上就是『目标』(target), 『关联』(dependencies) 和『动作』三者所组成的一系列规则。而 make 就是根据 Makefile 的规则决定如何编译 (compile) 和连接 (link) 程序或者其它动作。当然,make 可做的不只是编译和连接程序,例如 FreeBSD 的 port collection 中 ,Makefile 还可以做到自动下载远程程序,解压缩 (extract) ,打补丁 (patch),设定,然后编译,安装到系统中。Makefile 基本结构虽然很简单,但是妥善运用这些规则就可以变换出许多不同的花样。却也因为这样,许多人刚开始学写 Makefile 时会觉得没有规范可以遵循,每个人写出来的 Makefile 都不大一样,不知道从哪里下手,而且常常会受到开发环境的限制,只要环境参数不同或者路径更改,可能 Makefile 就得跟着修改。虽然有 GNU MakefileConventions (GNU Makefile 惯例)制订出一些在进行 GNU 程序设计时写 Makefile 的一些标准和规范,但是其内容很长而且很复杂,并且经常作一些调整,为了减轻程序开发人员维护 Makefile 的负担,就出现了 Automake。利用 Automake,编程者只需要写一些预先定义好的宏 (macro),提交给 Automake 处理,就会产生一个可以供Autoconf 使用的 Makefile.in 文件。再配合使用 Autoconf 产生的自动配置文件 configure 即可产生一份符合 GNUMakefile 惯例的 Makeifle 了。
下面使用一个简单的例子来介绍automake产生makefile的步骤,后面会具体介绍如何使用automake来编译静态库、动态库以及编译整个项目。
本例只是简单的把一个hello.c文件编译成hello可执行文件,具体的步骤如下:
1、执行autoscan命令生成autoscan.log和configure.scan文件
2、mv configure.scan configure.ac且修改configure.ac(早期使用configure.in)
- -*- Autoconf -*-
- # Process this file with autoconf to produce a configure script.
- AC_PREREQ([2.68])
- AC_INIT(hello, 1.0,[email])
- AM_INIT_AUTOMAKE(hello, 1.0)
- AC_CONFIG_SRCDIR([hello.c]) #用于检测源码目录的有效性,任选一个源码文件即可
- AC_CONFIG_HEADERS([config.h]) #用于生成config.h文件,以便autoheader使用
- # Checks for programs.
- AC_PROG_CXX
- AC_PROG_CC
- #LT_INIT #编译libtool必须添加的两行,这里直接编译成so,故不需要
- #AC_PROG_LIBTOOL
- # Checks for libraries.
- # Checks for header files.
- # Checks for typedefs, structures, and compiler characteristics.
- # Checks for library functions.
- AC_CONFIG_FILES([Makefile ]) #需要生成的所有Makefile
- AC_OUTPUT
3、使用aclocal生成aclocal.m4文件
4、执行autoconf命令生成configure文件
5、执行autoheader命令生成config.h和config.h.in
6、创建一个Makefile.am文件,内容如下:
- AUTOMAKE_OPTIONS= foreign
- bin_PROGRAMS= hello
- hello_SOURCES= hello.c
7、touch NEWS README AUTHORS ChangeLog
8、执行 automake –add-missing ,Automake 会根据 Makefile.am 文件产生一些文件,包含最重要的Makefile.in
9、执行./configure 命令生成Makefile文件
说明:
上述产生 Makefile 的过程和以往自行编写的方式非常不一样,使用 Automake 只需用到一些已经定义好的宏就可以了。我们把宏及目标 (target)写在 Makefile.am 文件内,Automake 读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的 Makefile.in 文件,然后再由 configure 这个 shell script 根据 Makefile.in 产生合适的 Makefile。
在上面产生的中间文件中,开发者需要设置的有configure.ac和Makefile.am,下面介绍这两个文件中常用宏的意义。
configure.ac文件:autoconf 是用来产生 ‘configure’文件的工具。’configure’ 是一个 shell script,它可以自动设定一些编译参数使程序能够条件编译以符合各种不同平台的 Unix 系统。autoconf 会读取 configure.ac文件然后产生’configure’ 这个shell script。configure.ac文件内容是一系列 GNU m4 的宏,这些宏经 autoconf 处理后会变成检查系统特性的 shell scripts。configure.ac文件中宏的顺序并没有特别的规定,但是每一个 configure.in 文件必须在所有其它宏前加入 AC_INIT宏,然后在所有其它宏的最后加上 AC_OUTPUT 宏。常用到的宏如下:
dnl和#:这个宏后面的内容不会被处理,可以视为注释
AC_INIT(FILE):该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION):这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版本编号。一般autoscan不会产生,需要手动添加
AC_PROG_CC:检查系统可用的 C 编译器,若源代码是用 C 写的就需要这个宏。
AC_OUTPUT(FILE):设置 configure 所要产生的文件,若是 Makefile ,configure 便会把它检查出来的结果填充到 Makefile.ac文件后产生合适的 Makefile。
实际上,在使用 automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal 来帮助产生。执行 aclocal 会产生 aclocal.m4 文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉 automake 如何动作。有了 configure.ac 及 aclocal.m4 两个文件以后,便可以执行 autoconf 来产生configure 文件了.
具体的参考文献见官方文档:http://www.gnu.org/software/autoconf/manual/autoconf.html
Makefile.am 文件:Automake 会根据 configure.ac 中的宏并在 perl 的帮助下把 Makefile.am 转成 Makefile.in 文件。Makefile.am 文件定义所要产生的目标,下面一张图中,列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件的一般规则:
下面是上图中全局变量的含义:
在编写Makefile.am文件时,尽可能的用相对路径,要不在不同的地方编译,安装可能是到不同的目录了,
整个Makefile.am就是按照上面三个表格来编写的,不管是编写可执行文件还是动态库。对照着上面的表格,来解释我们hello程序的Makefile.am:
AUTOMAKE_OPTIONS:设置 Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行 Automake 时 ,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 ‘NEWS’、’AUTHOR’、’ChangeLog’ 等文件。设置为 foreign 时,Automake 会改用一般软件的标准来检查,此时不需要这些文件
bin_PROGRAMS:定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。
hello_SOURCES:定义 ‘hello’ 这个执行程序所需要的原始文件。如果 ‘hello’这个程序是由多个原始文件所产生,必須把它所用到的所有原始文件都列出来,以空白符隔开。假设 ‘hello’ 还需要 ‘hello.c’、’main.c’、’hello.h’ 三个文件的话,则定义hello_SOURCES= hello.c main.c hello.h。如果定义多个执行文件,则对每个执行程序都要定义相对的 filename_SOURCES。
LDADD:一般用于指明本项目自己生成的库,而LDFLAGS一般使用-l等指明本项目依赖的第三方库,如opencv库。另外由于一个Makefile.am中可能会生成多个动态库、可执行文件等,所以如果使用LDADD,则是为所有的库或者执行文件指定依赖库,如果使用hello_LDADD则是为hello应用程序指定依赖库,类似于全局变量和局部变量的关系
其他的宏的用法可以参考下一篇automake编写完整的项目—动态库+可执行文件
具体参考automake官方文档:http://www.gnu.org/software/automake/manual/automake.html
今天的文章automake原理_AUTO汽车的什么功能分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/74522.html