automake/autoconf的简单例子
参考文章1:http://loftor.com/archives/automake.html
参考文章2:http://www.blogjava.net/huyi2006/articles/187908.html
项目一 helloworld
整个基础上仅有一个helloworld.c文件,功能也非常简单,只是向屏蔽输出一句hello。
新建一个helloworld目录,然后在里面新建一个文件helloworld.c,内容为:
#include <stdio.h> int main(int argc, char **agrv) { printf("Hello, Merlin\n"); return 0; }
执行命令autoscan生成一个架构configure.scan,将其重新命名为configure.ac(新版本使用ac后缀名,不再使用in后缀),此时目录中含有以下文件
merlin@tfAnalysis:~/t/hellworld$ ls autoscan.log configure.ac helloworld.c
原configure.scan的内容为:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([helloworld.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT
将其修改为以下样子:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT(helloworld, 0.1, tfa2012@foxmail.com) AC_CONFIG_SRCDIR(helloworld.c) #AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile)
AC_CONFIG_SRCDIR(helloworld.c)的功能是在./configure时检测文件helloworld.c是否存在,从而检测源码的正确性。
依次执行aclocal和autoconf两人个命令,此时文件夹中内容为:
merlin@tfAnalysis:~/t/hellworld$ ls aclocal.m4 autom4te.cache autoscan.log configure configure.ac helloworld.c
新建文件Makefile.am文件,并填写入以下内容:
AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = helloworld helloworld_SOURCES = helloworld.c
执行automake --add-missing
merlin@tfAnalysis:~/t/hellworld$ automake --add-missing configure.ac:11: installing './compile' configure.ac:8: installing './install-sh' configure.ac:8: installing './missing' Makefile.am: installing './depcomp'
此时文件夹中内容为:
merlin@tfAnalysis:~/t/hellworld$ ls aclocal.m4 compile depcomp Makefile.am autom4te.cache configure helloworld.c Makefile.in autoscan.log configure.ac install-sh missing
这个时候就可以使用./configure来生成Makefile文件了
merlin@tfAnalysis:~/t/hellworld$ ./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... /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 whether gcc understands -c and -o together... yes checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating Makefile config.status: executing depfiles commands
编译出来试试:
merlin@tfAnalysis:~/t/hellworld$ make gcc -DPACKAGE_NAME=\"helloworld\" -DPACKAGE_TARNAME=\"helloworld\" -DPACKAGE_VERSION=\"0.1\" -DPACKAGE_STRING=\"helloworld\ 0.1\" -DPACKAGE_BUGREPORT=\"tfa2012@foxmail.com\" -DPACKAGE_URL=\"\" -DPACKAGE=\"helloworld\" -DVERSION=\"0.1\" -I. -g -O2 -MT helloworld.o -MD -MP -MF .deps/helloworld.Tpo -c -o helloworld.o helloworld.c mv -f .deps/helloworld.Tpo .deps/helloworld.Po gcc -g -O2 -o helloworld helloworld.o merlin@tfAnalysis:~/t/hellworld$ ls aclocal.m4 config.log depcomp install-sh missing autom4te.cache config.status helloworld Makefile autoscan.log configure helloworld.c Makefile.am compile configure.ac helloworld.o Makefile.in merlin@tfAnalysis:~/t/hellworld$ ./helloworld Hello, Merlin
项目二 tfadc
这个工程稍微复杂一些,具体的结构是这样子的:
tfadc/
scripts/
src/
cmdline.c
confile.c
main.c
network.c
db/
include/
tfadp/
tfadp.c
tfana/
tfana.c
在tfadc目录下面运行autoscan命令,此时获得的configure.scan需要修改成configure.ac,是以下样子:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([tfadc], [0.2], [tfa2012@foxmail.com]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([netinet/in.h stdlib.h string.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CHECK_FUNCS([bzero socket strerror]) #AC_CONFIG_FILES([Makefile]) AC_OUTPUT( Makefile src/Makefile )
在tfadc目录下面新建一个Makefile.am,这里指示还有子目录为src,表明子目录中有Makefile.am文件:
AUTOMAKE_OPTIONS = foreign SUBDIRS = src #EXTRA_DIST = doc/userguide
新建另外一个文件src/Makefile.am,这里没有指示其还有子目录的Makefile.am,而是让如tfadp下的源码使用tfadp/tfadp.c这样的形式引入到本Makefile.am中来,这个时候需要在AUTOMAKE_OPTIONS中加入subdir-objects参数:
AUTOMAKE_OPTIONS = foreign subdir-objects bin_PROGRAMS = tfadc tfadc_SOURCES = cmdline.c confile.c main.c network.c tfadp/tfadp.c tfana/tfana.c #tfadc_LDADD = db/db.a tfana/tfana.a
如果想要把tfana中的文件编译成库文件的话,则需要在tfana中新建一个Makefile.am,那么上面的src/Makefile.am就需要添加一个SUBDIRS = tfana了,并且还需要修改src/Makefile.am加上tfadc_LDADD = tfana/tfana.a这一行。具体如何操作还需要看一看网上的例程(参数链接2)。
添加完两个Makefile.am之后就可以使用automake --add-missing生成configure文件了,后面的步骤就简单了./configure && make...
本文将持续完善,将在未来的实际项目时添加以下内容
1 配置安装路径等选项
2 添加配置选项(./configure --enable-xxx)
3 如果软件有配置文件则如何拷贝到实际环境中
4 静态库生成与动态库生成方法