Autotools简单使用

网上关于Autotools的教程已经有很多。这里记录一些自己在练习的笔记。

源代码的基本安装步骤

正常的源码安装步骤如下

~ % tar xvf amhello-1.0.tar.gz  # x为解压 v为显示过程 f 为指定解压的文件名
...
~ % cd amhello
~/amhello-1.0 % ./configure # 为当前系统创建Makefile文件
...
~/amhello-1.0 % make # 编译源代码
...
~/amhello-1.0 % su root # 切换到系统管理员
Password:
/home/adl/amhello-1.0 $ make install # 安装编译好的程序
...
/home/adl/amhello-1.0 $ exit
~/amhello-1.0 % make installcheck # 有些源码包会有一些安装成功的测试

如果没有系统管理权限,源码文件也可安装到当前用户目录下。

~/amhello-1.0 % ./configure --prefix ~/usr
...
~/amhello-1.0 % make
...
~/amhello-1.0 % make install
...

这些文件会安装在 ~/usr/bin/hello~/usr/share/doc/amhello/README

平形构建树(Parallel Build Trees 也就是 VPATH Builds)

在GNU构建体系中区分两种目录树。源码树(source tree)和构建树(build tree)
源码树目录包含着 configure。这个目录包含着所有源代码文件以及相关的子目录。
构建树目录是 configure 这个脚本程序所运行的目录。在这个目录下面生成Makefile文件,目标文件,库文件以及其他二进制文件。
通常情况下构建树与源码树共用同样的目录。
如果对源码树目录没有写的权限或者想要源码树整洁。我们可以在源码树目录之外创建构建树目录。
LFS编译源码就是用这样的方法。

~ % tar zxf ~/amhello-1.0.tar.gz
~ % cd amhello-1.0
~/amhello-1.0 % mkdir ../build && cd ../build
~/amhello-1.0/build % ../amhello-1.0/configure
...
~/amhello-1.0/build % make
...
下面开始正题 Autotools GNU构建系统

创建 amhello-1.0.tar.gz

新建立一个src目录,在里面创建main.c源码 ~/amhello/src/main.c

#include <config.h>
#include <stdio.h>

int
main(void)
{
puts("Hello World!");
puts("This is " PACKAGE_STRING". ");
return 0;
}

创建~/amhello/README

This is a demonstration package for GNU Automake.
Type 'info Automake' to read the Automake manual.

创建两个Makefile.am文件 ~/amhello/src/Makefile.am ~/amhello/Makefile.am

bin_PROGRAMS = hello
hello_SOURCES = main.c
SUBDIRS = src
dist_doc_DATA = README

最后创建configure.ac。这个文件应该由autoscan完成,如果源代码文件很多。~/amhello/configure.ac

AC_INIT([amhello], [1.0], [[email protected]])  # 参数为程序名,版本号,联系方式
AM_INIT_AUTOMAKE([-Wall -Werror foreign]) # 现在的版本AM_INIT_AUTOMAKE不用写程序与版本号。这样的方式已经不用。
# -Wall开启所有警告, -Werror所有警告报告按错误处理, foreign创建非标准的GNU包。
# 标准的GNU包包括有ChangeLog,AUTHORS,NEWS,COPYING等文件
AC_PROG_CC # 使用 C语言编译器
AC_CONFIG_HEADERS([config.h]) # 调用configure生成config.h文件。文件收集configure.ac里面宏的一些信息。
# 上面例子src/main.c中已经包含有config.h头文件。所以main.c源码可以用PACAGE_STRING。
# 在真实项目中这个config.h可以增长很大。
# 源码可以通过config.h得到很多系统信息。而不用为此专门写代码。
AC_CONFIG_FILES([ # 这个宏告诉automake在哪里创建Makefile.in模板文件。
Makefile # configure脚本可以对相应的模板生成Makefile文件。
src/Makefile
])
AC_OUTPUT # 一个关闭命令,实际上负责生成创建已注册文件(AC_CONFIG_FILES AC_CONFIG_HEADERS)的脚本。
# 简单例子可以把Makefile路径直接写在这里。
# 最好还是用AC_CONFIG_FILES注册文件。

上面几个文件创建好后,就可以用Autotools里的工具autoreconf --install来构建整个源代码编译系统了。

~/amhello % autoreconf --install
configure.ac: installing './install-sh'
configure.ac: installing './missing'
configure.ac: installing './compile'
src/Makefile.am: installing './depcomp'

在上面的命令执行完成后,我们可以得到configure, config.h.in, Makefile.in, src/Makefile.in等这些文件
接下来执行./configure这个脚本

~/amhello % ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for stdlib.h... (cached) yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands

最后几行我们可以看脚本生成了一些文件,如Makefile, src/Makefile, config.h
现在用make编译这个测试项目。然后测试是否可以打包发行。

~/amhello % make
...
~/amhello % src/hello
Hello World!
This is amhello 1.0.
~/amhello % make distcheck
...
=============================================
amhello-1.0 archives ready for distribution:
amhello-1.0.tar.gz
=============================================

autoconf是个脚本工具,他调用autoconf, automake等程序生成整个构建编译系统。如果是刚接触这些工具,会引起一些迷惑和疑问。Autoconf和Automake有自己独立的文档。现在我们只要知道autoscan扫描整个源码目录生成configure.scan(改名后为configure.ac)。autoconfconfigure.ac生成需要的configure脚本。automakeMakefile.amconfigure.ac生成Makefile.in模板文件。最后我们用configure生成了Makefile文件。

详细的文档可以查看这里