autoconf/automake 产生Makefile过程
autotools是一系列工具集,要使用这些工具当然首先要确认系统已经安装了下列工具:
autoscan
aclocal
autoconf
autoheader
automake
GNU Libtool (如果你需要产生 shared library)
使用命令which is common可查看到命令的路径,如果没有就没装,就安装
(debin系列的就用类似的dpkg包管理命令查看)。
下面还是以helloworld.c来完成我们的test。假设在现在目录下有一个helloworld.c文件。
建立可执行文件工程
1:autoscan 产生configure.scan、autoscan.log;利用configure.scan作为configure.in的基本框架。
2:configure.scan名字改为configure.in并对其内容作修改。
源文件:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/helloworld.c])
AC_CONFIG_HEADER([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.61)
AC_INIT(hello, 1.0, xxx@xxx.com)
AM_INIT_AUTOMAKE(hello, 1.0)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([sys/time.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_TIME
# Checks for library functions.
AC_CHECK_FUNCS([gettimeofday])
#AC_CONFIG_FILES([Makefile])
AC_OUTPUT(Makefile)
3:aclocal 产生aclocal.m4文件和autom4te.cache目录
4:autoconf autoconf会读取configure.in档然後产生“configure”这个 shell script,“configure”他使程序能在各种LINUX平台产生合适的Makefile或是C的头文件(header file),让原程序可以很方便地在这些不同的平台上被编 译出来。
5:autoheader
5:新建并编辑Makefile.am
AUTOMAKE_OPTIONS=foreign //必须
bin_PROGRAMS=hello //产生bin文件名
hello_SOURCES=hello.c //指定原文件
6:automake —add-missing 根据makefile.am生成makefile.in
—add-missing选项告诉automake加入包装一个软件套件所必备的档案。
7:新建NEWS README ChangeLog AUTHORS空文件。
建立共享库工程
前提:
项目目录:helloworld
源文件:test_automake/src/helloworld.c
头文件:test_automake/src/include/helloworld.h
库文件:test_automake/src/lib/
a:autoscan 用autoscan产生configure.in的框架;在src目录下产生autoscan.log和configure.am,修改生成的configure.am为configure.in并修改其内容。
Original content
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/helloworld.c])
AC_CONFIG_HEADER([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
Modified content
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(helloworld, 0.1, xxx@xxx.com)
AC_CONFIG_SRCDIR([src/helloworld.c])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(helloworld, 0.1)
# Checks for programs.
AC_PROG_CC
AC_LIBTOOL_DLOPEN
AC_PROG_LIBTOOL
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([
Makefile
src/Makefile
])
b:aclocal 产生aclocal.m4文件和autom4te.cache目录
c:autoconf autoconf会读取configure.in产生顶层“configure”这个 shell script,“configure”他使程序能在各种LINUX平台产生合适的Makefile或是C的头文件(header file),让原程序可以很方便地在这些不同的平台上被编 译出来。
d:autoheader 产出config.h.in
e:建立src目录中的Makefile.am。
这里我们生成的共享文件名为libhelloworld.la,安装目录为${prefix}/lib,头文件安装到${prefix}/include/helloworld/。
Makefile.am content
lib_LTLIBRARIES = libhelloworld.la
libhelloworld_la_SOURCES=helloworld.c
libhelloworld_la_CFLAGS=-I./
libhelloworld_la_LDFLAGS=
helloworldincludedir=$(includedir)/helloworld
helloworldinclude_HEADERS= helloworld.h
f:复制依赖文件
cp -f /usr/share/automake-1.9/depcomp .
cp -f /usr/share/libtool/config/ltmain.sh .
g:automake —add-missing
在顶层目录建立 NEWS README ChangeLog AUTHORS 空文件
深入分析
针对上述步骤在做分析。
1、Autoscan
autoscanshi用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但shi如果你不使用 参数的话,那么autoscan将认为使用的shi当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。
2、 configure.scan
configure.scan包含了系统设置的基本选项,里面都shi一些宏定义。我们需要将它改名为configure.in。
3、 aclocal
aclocalshi一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义shi:“aclocal - create aclocal.m4 by scanning configure.ac”。
4、 autoconf
autoconf用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。
configure.in文件的内容shi一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但shi你必须在所有宏的 最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。
在configure.in中:
#号表示注释,这个宏后面的内容将被忽略。
AC_PREREQ
这个宏用来表明本文件要求的autoconf版本。
AC_INIT(FILE)
这个宏用来检查源代码所在的路径。
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
这个宏是必须的,它描述了我们将要生成的软件包的名称和版本等信息;
FULL-PACKAGE-NAME:软件包名称
VERSION:软件包版本
BUG-REPORT-ADDRESS:为bug报告地址(一般为作者邮箱)
AC_CONFIG_SRCDIR
这个宏用来侦测所指定源代码文件是否存在,来确定源代码目录的有效性。此处应为hello.c
AC_CONFIG_HEADER
这个宏用来生成config.h文件,以便autoheader使用。
AC_PROG_CC
这个宏将用来指定编译器,如果不指定,选用默认gcc。
AC_OUTPUT(FILE)
这个宏用来设定configure所要产生的文件;如果是makefile,configure会把它检测出来的结果带给Makefile.in文件产生合适的makefile。使用automake时,还需要一些其他的参数,这些额外的宏参数用aclocal工具产生。
中间的注释可以分别添加用户测试程序、测试函数库和测试头文件等宏定义。
我们在使用automake时,实际上还需要用到其他的一些宏,但shi我们可以用aclocal 来帮我们自动产生。执行aclocal后我们会得到aclocal.m4文件。
5、autoheader工具生成config.h.in文件
autoheader工具负责生成config.h.in文件。此步骤可以在3、4之前完成。
6、autoconf
产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了。
7、automake 生成Makefile.in文件
8、 使用 Makefile
利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下:
make all
产生设定的目标,既次范例中的执行文件。只敲入make 也可以,此时会开始编译源代码,然后连接并产生执行文件。
make clean
清除之前所编译的执行文件及目标文件(object file, *.o)。
make distclean
除了清除执行文件和目的文件以外,也把 configure 所产生的 Makefile 清除掉。
make install
将程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用 bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。
Make uninstall
把目标文件从系统删除
make dist
将程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和 VERSION 这两个参数是根据 configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。在此范例中会产生 'hello-1.0.tar.gz' 的文件。
make distcheck
和 make dist 类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz 文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all ,确认编译无错误以后,户显示这个 tar.gz 文件已经准备好可以发布了。这个检查非常有用,检查过关的套件,基本上可以给任何具备 GNU 开发环境的人去重新编译成功。
阅读(1097) | 评论(0) | 转发(0) |