前言:该文从《Linux应用开发基础》一书中摘要所得。
首先确认系统已经安装以下软件:
GNU automake
GNU autoconf
GNU m4
perl
GUN Lib工具
第一步,用编辑器vi生成hello.c文件,然后用autoscan命令产生一个configure.in的雏形configure.scan,如下编辑configure.scan文件并将文件名改为configure.in。
autoscan
vi configure.scan
----------------------------------------------
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)
#..........................
AC_PROG_CC
#...........................
AC_OUTPUT(makefile)
-----------------------------------------------
mv configure.scan configure.in
第二步,执行aclocal和autoconf,分别产生aclocal.m4和configure两个文件。configure文件内信息由configure.in和aclocal产生的巨集生成。
aclocal
autoconf
第三步,编辑makefile.am文档,内容如下:
vi makefile.am
-----------------------
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
----------------------
然后执行automake –add-missing,automake会根据makefile.am文件产生一些文件,包含最重要的makefile.in。
automake –add-missing
第四步,执行./configure,生成makefile文档。大功告成,接下来执行make指令就可以编译hello.c生成可执行文件。
./configure
make
./hello
注意:除了make指令之外,还有make clean / make install / make dist等指令。
步骤详细解释:
autoconf:
autoconf是用来产生configure档的工具,configure是一个shell script,它可以自动核定原始程序以符合各种不同平台上Unix系统的特性,并且根据系统参数及环境产生合适的makefile档或者header file档,让原始程序可以很方便地在这些平台上被编译。autoconf读取configure.in档然后产生configure这个shell script。
configure.in档的内容是一连串GNU m4的巨集,这些巨集经过autoconf处理后会变成检查系统特征的shell script configure.in内巨集的顺序要求:每一个configure.in档必须在所有巨集前加入AC_INIT巨集,然后在所有巨集后面加上AC_OUTPUT巨集。
先用autoscan扫描原始档以产生一个configure.scan档,在对该档做些修改,产生configure.in档,在范例中用到的巨集如下:
AC_INIT(file):用来检查原始文件所在的路径。
AM_INIT_AUTOMAKE(PACKAGE, VERSION):使用automake必备的巨集,PACKAGE是要产生软件套件的名称,VERSION是版本编号。
AC_PROG_CC:检查系统可用的C编译器,如果原始程序是用C写的就需要用这个巨集。
AC_OUTPUT(file):设定configure所要产生的文档名,如果是makefile的话,configure便会把它检查出来的结果带入makefile.in中然后产生合适的makefile。
在使用automake时,还需要一些其他的巨集,这个额外巨集我们用aclocal来产生。执行aclocal会产生aclocal.m4档,一般来说不用修改。有了configure.in和aclocal.m4档,就可以执行autoconf来产生configure档了。
automake:
automake会根据configure.in中的巨集把makefile.am转成makefile.in档。在makefile.am档中需要定义要产生的目标,具体包括:
AUTOMAKE_OPTIONS:设定automake的选项。automake主要是帮助开发GNU软件的人员维护软件套件,一般在执行automake时会检查目录下是否存在标准GNU套件中应具备的文件档案,例如NEWS、AUTHOR、ChangeLog等,设成foreign时,automake会改用一般软件套件标准来检查,而gnu是缺省设置,该级别下将尽可能地检查包是否服从GNU标准,gnits是严格标准,不推荐。
bin_PROGRAMS:定义要产生的执行档名称,产生多个执行档的话,需要用空格符隔开。
hello_SOURCES:定义hello这个执行档的原始档,如果该程序由多个原始档产生,必须把所用到的原始档都列出来,空格符隔开,例如hello_SOURCES=hello.c main.c hello.h。如果定义了多个执行档,则对每个执行档都要定义相对的filename_SOURCES。
automake --add-missing指令可以用makefile.am来产生makefile.in,加上--add-missing是要automake顺便将软件套件必备的档案加入包装。
之后再执行./configure,根据makefile.in档产生makefile文档,有几个预设的目标可供使用:
make all:产生设定的目标,即可执行文件。和只打make的结果相同,此时开始编译原始码,然后连接,并产生最终执行文档。
make clean:清除之前所编译的执行文件和目标代码文件。
make distclean:除了清楚执行文件和目标代码文件外,也把configure产生的makefile清除掉。
make install:将程序安装至系统中(系统预设的执行文件存放路径)。使用bin_PROGRAMS巨集的话,程序会被安装到user/local/bin这个目录。
make dist:将程序和相关档案定制成压缩包的形式,名称为PACKAGE-VERSION.tar.gz,其中PACKAGE和VERSION以configure.in中的AM_INIT_AUTOMAKE(PACKAGE, VERSION)为准。
make distcheck:压缩并且检查压缩包是否正常,有相应显示。