Makefile纪事
在繁琐的事务或流程中,图表的表达能力是自然语言望尘莫及的。看了两个讲述Makefile自动生成的文章,冗长的赘述令我心烦。偶然见一图,觉得一目了然,省却千篇文字。大喜。贴到这里,以供借鉴。
另附两篇文章的链接:文章一
文章二
他们讲述的是旧版本的Automake,新版本略有一些变化,我试图用最简化和优化的方式说清楚此事,并且补上新版本的一些情况。
在Linux中,人们经常以源码形式发布程序。
这样做的原因之一是为了开源。另外的原因是为了便于在不同的平台和环境下能够更好地运行程序。
为了使程序适应不同的平台和环境,具有更好的兼容性,需要在相应的平台上编译程序。
这就要求有一个通用的,规范的,方便的编译程序的方法。
Automake提供了一个便利的解决方案。
程序一般均由make管理和生成,而make需要一个配置文件,叫做Makefile。
可以手工编写Makefile,但如果项目较大,那么这样做会很繁琐,且不易于维护。
手工编写的Makefile可能没有遵循GNU Makefile的惯例,致使Makefile的通用性差。
另外IDE环境需要一个Makefile自动生成的途径,以方便用户创建和处理工程。
基于以上考虑,可以使用Automake和Autoconf来自动生成一些脚本和配置文件。
把这些脚本和配置文件同程序的源代码一同发布。
当用户使用程序时,首先执行脚本(configure)自动生成适用于用户环境的Makefile,然后用make编译和安装程序。
这样,即使平台和环境有差异,人们也可以正常地使用程序。
举例说明:
Ubuntu6.06,automake1.9.
保证系统中已经安装了所需软件包:
gcc
g++
make
automake(目前Dapper的源中最新版是1.9)
autoconf
m4(Unix的一种宏处理器)
libtool(产生动态库需要这个包)
perl(aclocal是用perl编写的,所以需要安装perl)
1. 创建一个目录,于其下放入要编译的所有源文件。例如foo.c和main.c。
2. 创建一个名为Makefile.am的文件,该文件用于生成Makefile.in(用于生成Makefile的配置文件)。写入以下内容:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = foo
foo_SOURCES = foo.c main.c
如果没有设置AUTOMAKE_OPTIONS = foreign,
那么需要在当前目录中建立README,NEWS,AUTHORS,ChangeLog这几个文件。后两行设置了要生成的程序的名字以及所需要的源码等信息。
3. 到该目录中,执行autoscan来扫描目录中的所有源文件。
生成两个文件,configure.scan和autoscan.log(日志文件,可以删除)。执行autoscan时提示错误,但如果已经成功生成所需文件,那么忽略之。
4. 将configure.scan改名为configure.in或configure.ac(.ac为新版的格式,建议改为.in以和旧版兼容)。 mv configure.scan configure.in
5. 编辑configure.in,其中为一系列m4的宏。我常常去掉宏 AC_CONFIG_HEADER([config.h]),这样以后会省一些事。修改AC_INIT宏,对应写入程序名,版本,和作者联系地址。如AC_INIT(foo, 1.0, foo@gmail.com)。当然这个宏也可以不修改。在AC_INIT和AC_OUTPUT之间的任意位置添加一行AM_INIT_AUTOMAKE(foo, 1.0),用以指定生成程序的名字和版本。如果没有执行步骤2,则不会自动生成宏AC_CONFIG_FILES([Makefile]),需要手工添加。如果执行了步骤2,则该宏会自动生成。
6. 执行aclocal。
它将根据configure.in生成文件aclocal.m4和目录autom4te.cache(缓存目录,最后可以删除之)。aclocal.m4中包含了automake所需的一些宏。若未生成该文件,说明configure.in有问题。可以尝试执行automake来查看提示的错误信息,根据提示再次修改configure.in,直到正确为止。
[7]. 如果在步骤5的configure.in中去掉了宏 AC_CONFIG_HEADER([config.h]),则不再需要这一步。如果没有去掉则需要执行autoheader,它将根据configure.in生成文件config.h.in。
8. 执行automake --add-missing,生成Makefile.in。另外这一步还生成了三个符号链接(install-sh,missing,depcomp),分别指向automake目录中的三个可执行脚本。
9. 执行autoconf。
它将根据aclocal.m4和configure.in生成可执行的脚本configure。
到此,全部工作完成。将以下配置文件和脚本与程序的源码一同发布。(示例中有两个源码文件foo.c和main.c)
configure.in
configure
Makefile.am
Makefile.in
aclocal.m4
三个符号链接所指向的三个脚本install-sh,missing,depcomp也需要一起发布。
虽然在我有限的尝试中,没有发布missing脚本也没问题,但觉得还是发布了为好。
注意: 如果在configure.in中保留了宏 AC_CONFIG_HEADER([config.h]),则需要将config.h.in也一同发布。否则无法正常使用。觉得比较麻烦,所以我一般去掉那个宏,然后省略步骤7。
在用户编译程序时,到程序源码目录中执行脚本configure来生成Makefile,然后用make编译和安装。
./configure
make
如果需要安装,则继续运行:
make install
标签: Linux

Atom


0 条评论:
发表评论
<< 主页