AutomakeAutoconf

automake是由Perl語言所写的,必須和GNU autoconf一并使用,它用于从makefile.am文件生成 Makefile.in。Automake的作用是避免繁杂的makefile编写和适配,而将负担转移给Automake来生成跨平台的makefile。
一个makefile.am文件包含了多个make的变量定义。Automake做了一些项目的限制:1.必须使用Autoconf 2.configure.ac有一些写法限制。用Automake生成makefile.in需要Perl语言支持,但是直接从makefile构建项目不需要。
一个常见的automake项目包含以下文件: configure, configure.ac, Makefile.in, Makefile.am, aclocal.m4, …,

教程:Autotools Tutorial
makefile经常需要调整,因此诞生了configure脚本,为了更方便的生成makefile和configure,分别诞生了automake和autoconf,一个经典的GNU build过程包括:./configure&&make&&make install,./configure会生成makefile,有时会在make后执行make check进行测试。一般情况下,make install会把二进制可执行文件放在/usr/local/bin,库文件放在/usr/local/lib,文档放在/usr/local/share/doc/.还可以执行 make installcheck命令来测试安装好的文件,主要是检查文件树不同的运行有无错误。

标准makefile目标(Standard Makefile Targets)

make命令跟的参数叫makefile目标,比如make,make install,make uninstall,make check的目标分别就是all,install,uninstall,check,注意make all等价于make,默认参数就是all。

1
make distcheck

将文件打成安装包.tar.gz,并且执行检查(区分于dist不检查)

标准环境变量

Directory variable Default value
prefix /usr/local
exec_prefix ${prefix}
bindir ${exec_prefix}/bin
libdir ${exec_prefix}/lib
includedir ${prefix}/include
datarootdir ${prefix}/share
datadir ${datarootdir}
mandir ${datarootdir}/man
infodir ${datarootdir}/info
docdir ${datarootdir}/doc/${PACKAGE}
可以通过参数指定安装的位置,比如:
1
./configure --prefix ~/usr

上面的指令会让安装路径从 /usr/local变为/usr

GNU配置变量

  • CC:C编译器指令
  • C XX: C++编译指令
  • CFLAGS: C编译器标志
  • CXXFLAGS: C++编译器标志
  • LDFLAGS: 链接器标志
  • CPPFLAGS:C/C++预处理标志
    示例:
    1
    ./configure CC=gcc-3 CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib
    使用gcc-3作为C编译器,编译时使用/usr/include中的头文件, 连接时使用/usr/lib的库文件。这里的-I和-L是参数标志指定,即-Include和-Lib

典型Autotools过程——基于hello项目的demo,not passed

步骤:
1.创建源文件src/main.c

1
2
3
4
5
6
7
8
9
10
11
> cat src/main.c
#include <config.h>
#include <stdio.h>

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

2.创建一个简单的README

1
2
3
> cat README
This is a demonstration package for GNU Automake.
Type 'info Automake' to read the Automake manual.

3.创建Makefile.am和src/Makefile.am,在里面进行变量声明

1
2
3
4
5
6
> cat src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = main.c
> cat Makefile.am
SUBDIRS = src
dist_doc_DATA = README

4.创建configure.ac,在里面写制作configure脚本的规则

1
2
3
4
5
6
7
8
9
10
> configure.ac
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT

5.执行命令autoreconf –install

1
2
3
4
5
> autoreconf --install
configure.ac: installing './install-sh'
configure.ac: installing './missing'
configure.ac: installing './compile'
src/Makefile.am: installing './depcomp'

autoreconf命令会生成configure, config.h.in, Makefile.in, and src/Makefile.in.四个文件,后面三个文件会根据系统分别用来生成config.h, Makefile, and src/Makefile,生成命令就是./configure

1
2
3
4
5
6
> ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
...

6.接下来就是正常的安装命令

1
2
3
make
src/hello #运行
make distcheck #打包

总结:Autoreconf –install从Makefile.am和configure.ac文件生成configure, config.h.in, Makefile.in, and src/Makefile.in.文件用于./configure。

[参考](Using GNU Autotools (epita.fr))
Autotools Tutorial

libtool:跨平台的共享库搭建方法

通常,一个人不仅想构建程序,还想构建库,这样其他程序就可以从你的劳动成果中受益。理想情况下,人们希望生成共享(动态链接)库,这些库可以由多个程序使用,而不会在磁盘或内存中重复,并且可以独立于链接的程序进行更新。然而,以便携方式生成共享库是噩梦——每个系统都有自己不兼容的工具、编译器标志和魔法咒语。幸运的是,GNU提供了一个解决方案:Libtool。

Libtool为您处理构建共享库的所有需求,目前看来,这是实现任何可移植性的唯一方法。它还处理了许多其他令人头疼的问题,例如:Make规则与共享库的变量后缀的交互,在超级用户安装共享库之前与共享库可靠地链接,以及提供一致的版本控制系统(这样就可以在不破坏二进制兼容性的情况下安装或升级库的不同版本)。尽管Libtool和Autoconf一样,可以在没有Automake的情况下使用,但它最简单地与Automake结合使用——在那里,只要需要共享库,Libtool就会自动使用,而且您不需要知道它的语法。