GNU AutoTools 简介  Automake, Autoconf and Libtool 黄  颂  2004-10-09
GNU Package 的典型安装 <ul><li>FAQ 0039 @ smth </li></ul><ul><ul><li>下载源代码包 foo-1.0.tar.gz </li></ul></ul><ul><ul><li>tar xvzf ...
Makefile’s way to develop <ul><li>三元组 (Target, Dependency, Command) </li></ul><ul><li>Target : Dep1 Dep2 </li></ul><ul><ul...
Makefile’s Big Trouble? <ul><li>GNU 的 Makefile 规范相当复杂,随着项目复杂性的增加,要写出一个正确而高效的 Makefile 相当困难,对新手而言更是如此。 </li></ul><ul><li>越是...
All in One Solution? <ul><li>GNU Auto Tools 是上个世纪 90 年代开始发展起来的一系列辅助开发、打安装包的自动化工具。 </li></ul><ul><li>各种工具分别开发,但是协同工作的很好。比如 ...
Hello World – Step by Step <ul><li>1. hello.c </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>int main() { printf(“...
Hello World!  演示 —— 如何杀鸡用牛刀
来龙去脉 autoscan configure.scan configure.in Makefile.am Makefile.in Makefile automake edit aclocal.m4 aclocal configure auto...
configure.in(1) <ul><li>是 configure 脚本的输入文件,为了解决在不同 unix 变种之间移植程序的问题:库名可能不同,应用程序名可能不同,结构和常量的定义可能不同…… </li></ul><ul><li>con...
configure.in(2) <ul><li>configure.in 的八股文 </li></ul><ul><li>基本初始化部分:包括 AC_INIT ( 必须第一个出现 ), AM_INIT_AUTOMAKE( 程序包名,版本号 ), ...
configure.in(3) <ul><li>检查某些头文件是否存在。 </li></ul><ul><li>检查 Typedefs and structures 。 </li></ul><ul><li>检查 Functions 。 </li>...
Makefile.am(1) <ul><li>一种比 Makefile 更高层次的规则。只指定要生成什么目标,它由什么源文件生成,要安装到什么目录。 </li></ul><ul><li>Just simple and stupid!   </...
Makefile.am(2) <ul><li>对静态库: </li></ul><ul><li>lib_LIBRARIES = libfoo.a </li></ul><ul><li>foo_a_SOURCES = </li></ul><ul><l...
Makefile.am(3) <ul><li>全局变量 ( 对所有目标都适用 ) </li></ul><ul><li>INCLUDES = -I/dir1 -I/dir2 </li></ul><ul><li>LDFLAGS = -L/dir1 ...
Makefile.am(4) <ul><li>标准安装路径 </li></ul><ul><li>$(prefix) = /usr/local  是所有安装目录的默认前缀,可以通过 ./configure --prefix=<new_prefix...
Makefile.am(5) <ul><li>尽量用相对路径引用源程序的位置,以下两个变量是预定义好的: </li></ul><ul><ul><li>$(top_srcdir) 无论在哪个目录层次,该变量定义了包含 src 目录的目录位置,用于...
configure’s Gifts <ul><li>configure 脚本生成的 Makefile 中已经带了很多常用的目标如: check, all, install, uninstall, clean, dist, distcheck, ...
天网千帆的目录结构
libtool 简介 <ul><li>生成各种程序库的方便工具。 </li></ul><ul><li>提供一个统一的接口,程序员不用关心各种烦人的底层细节:不同的平台的库可能要求不同的后缀,不同平台对库的安装方法不同,有些平台不支持动态库等等。...
使用 libtool <ul><li>在 configure.in 文件中加上 AC_PROG_LIBTOOL 宏,如果原来有 AC_PROG_RANLIB 宏,删去它。 </li></ul><ul><li>在 Makefile.am 文件中:...
小结 <ul><li>Autoconf :根据用户提供的 configure.in 文件,生成一个名为 configure 的脚本。该脚本可以搜集有关移植性的平台相关信息,这些信息被用来生成 Makefiles ,配置头文件和其它平台相关的文件...
References <ul><li>ToolsManual: </li></ul><ul><li>http://www.amath.washington.edu/~lf/tutorials/autoconf/ </li></ul><ul><l...
<ul><li>Thanks. </li></ul><ul><li>Any questions? </li></ul>
Upcoming SlideShare
Loading in...5
×

Gnu

1,073

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,073
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Gnu"

  1. 1. GNU AutoTools 简介 Automake, Autoconf and Libtool 黄 颂 2004-10-09
  2. 2. GNU Package 的典型安装 <ul><li>FAQ 0039 @ smth </li></ul><ul><ul><li>下载源代码包 foo-1.0.tar.gz </li></ul></ul><ul><ul><li>tar xvzf foo-1.0.tar.gz </li></ul></ul><ul><ul><li>cd foo-1.0 </li></ul></ul><ul><ul><li>./configure </li></ul></ul><ul><ul><li>make </li></ul></ul><ul><ul><li>(su) make install </li></ul></ul>问题 1 :配置脚本 configure 是怎么生成的? 问题 2 : configure 脚本怎么知道该如何生成 Makefile 幕后英雄—— GNU Auto Tools : autoconf, automake, libtool, autoscan, autoheader……
  3. 3. Makefile’s way to develop <ul><li>三元组 (Target, Dependency, Command) </li></ul><ul><li>Target : Dep1 Dep2 </li></ul><ul><ul><li><TAB>Cmd1 </li></ul></ul><ul><ul><li><TAB>Cmd2 </li></ul></ul><ul><ul><li>[Blank Line] </li></ul></ul><ul><li>.s1 .s2 : </li></ul><ul><ul><li><TAB>Cmd1 </li></ul></ul><ul><li>$(var), $<, $@ </li></ul><ul><li>…… </li></ul>
  4. 4. Makefile’s Big Trouble? <ul><li>GNU 的 Makefile 规范相当复杂,随着项目复杂性的增加,要写出一个正确而高效的 Makefile 相当困难,对新手而言更是如此。 </li></ul><ul><li>越是复杂的软件越有可能有自己独特的 build 方法,怎么办?每次都重新学习?! </li></ul><ul><li>不同的类 Unix 操作系统之间存在着差异,移植性如何保证?需要大量手工编写的脚本和条件编译。 </li></ul>
  5. 5. All in One Solution? <ul><li>GNU Auto Tools 是上个世纪 90 年代开始发展起来的一系列辅助开发、打安装包的自动化工具。 </li></ul><ul><li>各种工具分别开发,但是协同工作的很好。比如 autoconf, automake, libtool 等等。 </li></ul><ul><li>但是,连开发者自己也承认,这套工具虽然好用,但是学习曲线很陡峭。 </li></ul><ul><li>困难在于:一套新的思路和习惯,一套自定义的宏和规则,使用者的交流  </li></ul>
  6. 6. Hello World – Step by Step <ul><li>1. hello.c </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>int main() { printf(“Hello World! ”); return 0; } </li></ul><ul><li>2. Makefile.am </li></ul><ul><li>bin_PROGRAMS = hello </li></ul><ul><li>hello_SOURCES = hello.c </li></ul><ul><li>3. configure.in </li></ul><ul><li>AC_INIT(hello.c) </li></ul><ul><li>AM_INIT_AUTOMAKE(hello, 0.1) </li></ul><ul><li>AC_PROG_CC </li></ul><ul><li>AC_OUTPUT(Makefile) </li></ul><ul><li>4. aclocal </li></ul><ul><li>5. autoconf </li></ul><ul><li>6. automake --add-missing --foreign </li></ul><ul><li>7. ./configure </li></ul><ul><li>8. make (make install 安装, make dist 产生安装包 ) </li></ul>
  7. 7. Hello World! 演示 —— 如何杀鸡用牛刀
  8. 8. 来龙去脉 autoscan configure.scan configure.in Makefile.am Makefile.in Makefile automake edit aclocal.m4 aclocal configure autoconf
  9. 9. configure.in(1) <ul><li>是 configure 脚本的输入文件,为了解决在不同 unix 变种之间移植程序的问题:库名可能不同,应用程序名可能不同,结构和常量的定义可能不同…… </li></ul><ul><li>configure 脚本完成 autoconf 与 automake 的初始化工作,为不同的平台定义相应的宏,检测并指定适当的程序名、库名、结构和常量名等等,指定要为哪些目录输出 Makefile 文件。总之,为编译程序做好一切准备工作。 </li></ul>
  10. 10. configure.in(2) <ul><li>configure.in 的八股文 </li></ul><ul><li>基本初始化部分:包括 AC_INIT ( 必须第一个出现 ), AM_INIT_AUTOMAKE( 程序包名,版本号 ), AC_CONFIG_HEADER </li></ul><ul><li>可选宏:如 AC_ARG_ENABLE </li></ul><ul><li>检测某些程序的存在性 </li></ul><ul><li>检查程序用到的库 </li></ul>
  11. 11. configure.in(3) <ul><li>检查某些头文件是否存在。 </li></ul><ul><li>检查 Typedefs and structures 。 </li></ul><ul><li>检查 Functions 。 </li></ul><ul><li>指定在哪些目录输出 Makefile 。 </li></ul><ul><li>Seems troublesome, mmm? Don’t worry, autoscan will do most of the work for you. </li></ul>
  12. 12. Makefile.am(1) <ul><li>一种比 Makefile 更高层次的规则。只指定要生成什么目标,它由什么源文件生成,要安装到什么目录。 </li></ul><ul><li>Just simple and stupid!  </li></ul><ul><li>可执行文件: </li></ul><ul><li>bin_PROGRAMS = foo </li></ul><ul><li>foo_SOURCES = foo1.c foo1.h foo2.c </li></ul><ul><li>foo_LDADD = foo3.o -lm foo4.a </li></ul><ul><li>foo_LDFLAGS = -L<lib_path> </li></ul><ul><li>foo_DEPENDENCIES = </li></ul>
  13. 13. Makefile.am(2) <ul><li>对静态库: </li></ul><ul><li>lib_LIBRARIES = libfoo.a </li></ul><ul><li>foo_a_SOURCES = </li></ul><ul><li>foo_a_LDADD = </li></ul><ul><li>foo_a_LIBADD = </li></ul><ul><li>foo_a_LDFLAGS = </li></ul><ul><li>只在 make 时做静态连接用,不安装的库: </li></ul><ul><li>noinst_LIBRARIES = libfoo.a </li></ul><ul><li>…… </li></ul><ul><li>对头文件: include_HEADERS = foo.h </li></ul><ul><li>对数据文件: data_DATA = data1 data2 </li></ul>
  14. 14. Makefile.am(3) <ul><li>全局变量 ( 对所有目标都适用 ) </li></ul><ul><li>INCLUDES = -I/dir1 -I/dir2 </li></ul><ul><li>LDFLAGS = -L/dir1 -L/dir2 </li></ul><ul><li>LDADD = foo.o foo.a -lfoo </li></ul><ul><li>EXTRA_DIST = file1 file2 源程序和一些默认的文件自动打入 .tar.gz 包,其它文件若要进入 .tar.gz 包可以用这种办法,比如配置文件 , 数据文件等等 。 </li></ul><ul><li>SUBDIRS = dir1 dir2 在处理本目录之前要递归处理哪些子目录 </li></ul>
  15. 15. Makefile.am(4) <ul><li>标准安装路径 </li></ul><ul><li>$(prefix) = /usr/local 是所有安装目录的默认前缀,可以通过 ./configure --prefix=<new_prefix> 的方法覆盖。 </li></ul><ul><li>其它的预定义目录如: bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc, … </li></ul><ul><li>想定义一个新的安装路径?比如 config, 可定义 </li></ul><ul><li>confdir = $(prefix)/config, 然后 conf_DATA = file1 file2 ,则 file1, file2 会作为数据文件安装到 $(prefix)/config 目录下。 </li></ul>
  16. 16. Makefile.am(5) <ul><li>尽量用相对路径引用源程序的位置,以下两个变量是预定义好的: </li></ul><ul><ul><li>$(top_srcdir) 无论在哪个目录层次,该变量定义了包含 src 目录的目录位置,用于引用源程序; </li></ul></ul><ul><ul><li>$(top_builddir) 定义了生成目标文件上最上层目录,用于引用 .o 等编译出来的目标文件。 </li></ul></ul><ul><ul><li>…… </li></ul></ul>
  17. 17. configure’s Gifts <ul><li>configure 脚本生成的 Makefile 中已经带了很多常用的目标如: check, all, install, uninstall, clean, dist, distcheck, distclean, tags, maintainerclean. </li></ul><ul><ul><li>If configure or make did it, make distclean undoes it. </li></ul></ul><ul><ul><li>If make did it, make clean undoes it. </li></ul></ul><ul><ul><li>If make install did it, make uninstall undoes it. </li></ul></ul><ul><ul><li>If you did it, make maintainer-clean undoes it. </li></ul></ul>
  18. 18. 天网千帆的目录结构
  19. 19. libtool 简介 <ul><li>生成各种程序库的方便工具。 </li></ul><ul><li>提供一个统一的接口,程序员不用关心各种烦人的底层细节:不同的平台的库可能要求不同的后缀,不同平台对库的安装方法不同,有些平台不支持动态库等等。 </li></ul><ul><li>生成高层次的库,称为 libtool library ,后缀是 .la 。用它连接时,默认产生动态连接库,也可以用 -static 参数指定生成静态连接库。 </li></ul><ul><li>既可单独使用又可与 automake 和 autoconf 一起使用更加强大、方便。 </li></ul>
  20. 20. 使用 libtool <ul><li>在 configure.in 文件中加上 AC_PROG_LIBTOOL 宏,如果原来有 AC_PROG_RANLIB 宏,删去它。 </li></ul><ul><li>在 Makefile.am 文件中: </li></ul><ul><li>lib_LTLIBRARIES = libshell.la </li></ul><ul><li>libshell_la_SOURCES = object.c subr.c symbol.c </li></ul><ul><li>与原来的写法非常相似! </li></ul><ul><li>.la 库只能连入 .lo( 使用 libtool 生成的目标文件 ) </li></ul><ul><li>libshell_la_LDADD = xmalloc.lo @LTLIBOBJS@ </li></ul><ul><li>传入库的版本号: </li></ul><ul><li>libshell_la_LDFLAGS = -version-info 1:0:1 </li></ul><ul><li>与其它目标文件连接时用 LDFLAGS 指定连接的方式 ( 默认是动态方式): -static, --all-static 指定静态连接。 </li></ul>
  21. 21. 小结 <ul><li>Autoconf :根据用户提供的 configure.in 文件,生成一个名为 configure 的脚本。该脚本可以搜集有关移植性的平台相关信息,这些信息被用来生成 Makefiles ,配置头文件和其它平台相关的文件。 </li></ul><ul><li>Automake :根据用户提供的一个高层次的生成规则 Makefile.am ,生成 Makefile 文件的模板 Makefile.in 。 Automake 生成的 Makefiles 符合 GNU 的 Makefile 标准,用户无需再手工编写 Makefile 文件。 </li></ul><ul><li>Libtool :使得生成内存位置无关的代码且让共享库在不同平台间移成为可能。它可以不依赖 autoconf 和 automake 单独运行,另一方面, automake 和 libtool 可以无缝地集成使用。 </li></ul>
  22. 22. References <ul><li>ToolsManual: </li></ul><ul><li>http://www.amath.washington.edu/~lf/tutorials/autoconf/ </li></ul><ul><li>AutoBook: </li></ul><ul><li>http://sources.redhat.com/autobook/ </li></ul><ul><li>info & man </li></ul><ul><li>GNU Projects ( 学习其他人的技巧 ) </li></ul>
  23. 23. <ul><li>Thanks. </li></ul><ul><li>Any questions? </li></ul>

×