Presentation is loading. Please wait.

Presentation is loading. Please wait.

永远的 Autotools ——GNU Build System 简介(一)

Similar presentations


Presentation on theme: "永远的 Autotools ——GNU Build System 简介(一)"— Presentation transcript:

1 永远的 Autotools ——GNU Build System 简介(一)
GMT+8 杨博远 ("hosiet")

2 一点声明 本次演示文稿可在 LUG 网站获得: 本人能力时间有限,如有错误欢迎指出 本次由基础讲起,下一次再涉及高级用法
本人能力时间有限,如有错误欢迎指出 本次由基础讲起,下一次再涉及高级用法

3 引子:开发一个C语言的项目 让我们回顾一下简单C/C++程序如何完成: (以C语言,类UNIX系统环境为例)
编译 链接 运行、查错、等等 看起来很简单?

4 引子:开发一个C语言的项目 以上需要的命令: cc example.c -o example_program
如果需要体现出编译与链接两步,如下: cc -c example.c example.o cc example.o -o example_program 你要说有ld这个工具的话我也没办法啦╮(╯_╰)╭

5 引子:开发一个C语言的项目 问题出现在项目规模增大的情况下:
项目中有数十个甚至上百个.h头文件,.c源文件,该如何方便地编译整个项目?要敲的命令太多了。 写 Shell 脚本批处理 使用 Make 工具

6 科普:make 工具 看起来是向自动化的方向迈进了一步? 语法有 Shell 脚本的风格 目标:自动化
OBJECTS = main.o text.o INSTALL_PATH = /usr/local editor: $(OBJECTS) gcc -o editor $(OBJECTS) main.o: main.c gcc -c main.c text.o: text.c gcc -c text.c install:editor mv editor $(INSTALL_PATH) 在软件开发中,make 是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。它是一种转化文件形式的工具,……与此同时,它也检查文件的依赖关系,如果需要的话,它会调用一些外部软件来完成任务。它的依赖关系检查系统非常简单,主要根据依赖文件的修改时间进行判断。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做“makefile”的文件来确定一个target文件的依赖关系,然后把生成这个target的相关命令传给shell去执行。——来自维基百科 看起来是向自动化的方向迈进了一步? 语法有 Shell 脚本的风格 目标:自动化

7 引子:开发一个C语言的项目 但是这还不够。问题继续出现:
类 UNIX 环境同样多种多样:Linux, BSD, Solaris, HP-UX, AIX, 甚至 Windows 上的 MINGW... 你面临程序可移植性的问题。

8 来源见参考文献

9 引子:开发一个C语言的项目 谁来处理这些问题? 程序员? 需要大量的测试代码 需要大量的条件编译 #if #else 需要记牢各个平台的特性
明显不现实。 需要在自动编译链接过程中隐藏平台差异的程序 目标:可移植性

10 引子:开发一个C语言的项目 也许你还想同时解决以下问题: 使用配置文件规定程序与附带文件应该安装到哪里去(坚决不手写 Makefile!)
安装简单,卸载也简单(不要手动删文件!) 自动探测平台,可以结合脚本进行条件化编译、安装(我就是喜欢 Shell 脚本!) 在安装之前探测系统依赖关系,避免编译过程中缺库缺头文件,保证程序能正常运行(编译一半报个错,感觉不好)

11 引子:开发一个C语言的项目 也许你还想同时解决以下问题: 解决链接库版本依赖问题 能自动打个源文件的 tar 压缩包,方便发布
程序国际化(i18n)问题 …… 有需求,就有动力。 以上问题,Autotools 都能解决。

12 Autotools 是什么? 所谓 GNU 构建系统(GNU Build System)主要是指通过 autoconf,automake 和 libtool 这三个工具构建出来的软件结构体系,又名 Autotools。通常和 GNU make,gettext 以及 GCC 一起配套使用。这个软件结构体系也是所有 GNU 项目的打包方式。 ——维基百科 这是一套工具,可以配合使用以完成编译、链接到分发、安装、卸载的流程。

13 Autotools 是什么? 也许你听说过 Linux 下“从源代码安装 ”一说 大部分源码包的安装流程如下列三部曲:
./configure make [sudo] make install (注:卸载:[sudo] make uninstall) 可以说大多数有类似的类似源码包都是由 autotools 生成,再使用 make dist 命令生成的。

14 科普:GNU 工具链 (文本编辑器:GNU Emacs) 构建系统:GNU Autotools
编译器:GNU Compiler Collection(gcc) 自动工具:GNU make 代码调试:GNU Debugger(gdb) 其它工具:GNU Binutils 工具齐全,可以用来开发软件和操作系统

15 Autotools 包括的程序 核心:automake, autoconf, libtool 配套工具:gettext, make
命令行接口: autoconf (posix shell script) automake (awk script) libtool (bash script) libtoolize (posix shell script) autoreconf (awk script) autoheader (perl script) autom4te (awk script) autoupdate (awk script) 这帮人简直了…… 唯一一个不是脚本 的程序是宏处理器 GNU M4

16 Autotools 功能举例 自动处理隐藏平台处理差异 半自动探测库/函数/头文件依赖问题 半自动编译链接,生成可执行程序
与 shell 脚本的亲和性 使用 libtool,隐藏函数库的复杂性 与 make 连用,实现半自动源代码打包分发、程序安装、卸载 配合 gettext 实现程序国际化 (i18n)

17 最简易使用方法:前提 最简易: 不用 libtool,不用 gettext,不更改默认安装目录,不特意考虑平台区别 前提:
你已经编写了能够编译通过的源程序,知道源文件之间的关系 你安装了 automake, autoconf 和 make 你在类 UNIX 环境下工作

18 最简易使用方法:配置文件 用户需要编写两类文件: configure.ac(主要被 autoconf 使用)
Makefile.am(主要被 automake 使用) configure.ac 置于项目根目录 Makefile.am 必须有一个放在项目根目录,可以在所有有必要的子目录下单独编写放置 (类似.gitignore文件?)

19 理解两类配置文件 Makefile.am --(automake)--> Makefile.in
Makefile.in ---(./configure)--> Makefile 所以编写 Makefile.am 相当于编写每个子目录下的 Makefile 骨架供 make 工具使用 语法类似 Makefile 自动化编写 Makefile

20 理解两类配置文件 configure.ac ---(.....)->./configure config.h
主要用来判断依赖关系,保证平台可移植性 (同时用来生成 Makefile) (语法类似 shell 脚本……?)

21 理解两类配置文件 在生成 Makefile 与 config.h 之后,Autotools 的使命已经完成:它们已经生成了完成工作的“计划书” 剩下的一切交给 make 完成 我们之后大多问题都在如何生成适当的 Makefile, configure, config.h 上面;即,如何编写 Makefile.am 和 configure.ac

22 理解两类配置文件 对两个文件的处理工作互有交叉;需要综合考虑两者才能生成恰当的中间文件与目标文件
搞清两者间的关系是学习 Autotools 的最大难题,是该工具最令人诟病的一点

23 一般处理流程 来源:Wikipedia

24 一般处理流程

25 一般处理流程

26 最简单操作流程 前提:所有项目配置文件均已完成
autoreconf #等于 aclocal+autoheader+libtool+autoconf+automake ./configure make (make install / make dist, etc)

27 编写两类配置文件:configure.ac configure.ac,历史上被称为 configure.in, 包含项目基本信息、子目录(Makefile.am)信息、可移植性探测信息等 它是一个 M4 宏处理脚本 % pwd /home/hosiet/src-nosync/github/ptex-ng % file ./configure.ac ./configure.ac: M4 macro processor script, ASCII text

28 编写两类配置文件:configure.ac 顾名思义,该文件是一堆宏的集合,需要经过宏处理器(GNU M4)处理展开
展开后是 shell 脚本 M4 很古老,语法很奇怪,间接导致 configure.ac 语法有些难理解 宏的性质导致我们可以在 configure.ac 中直接编写 shell 脚本进行自定义处理 % pwd /home/hosiet/src-nosync/github/ptex-ng % file ./configure ./configure: POSIX shell script, ASCII text executable

29 编写两类配置文件:configure.ac 好消息是,你不需要从头开始手动写;我们有autoscan 这个工具!
在项目根目录运行 autoscan,自动生成 configure.scan,这通常是使用 Autotools 万里长征的第一步 编辑 configure.scan 得到能用的 configure.ac 请看示例

30 编写两类配置文件:configure.ac 注意事项:
AM_INIT_AUTOMAKE([]) 宏内使用 foreign 参数可避免 GNU 的严格文件要求 需要在 AC_CONFIG_FILES([]) 宏内填入所有 Makefile.am 所在位置 最后调用 AC_OUTPUT 宏输出结果 有各类宏可以作为参数,请见参考手册

31 编写两类配置文件:Makefile.am 说明: 顾名思义,它可以用来生成 Makefile 所以可以在里面使用 Makefile 语法
超前缀_前缀_名称_后缀 = 值 值 值 值 ↑大概类似这样。注意如果值太多,换行需要加反斜杠转义!

32 编写两类配置文件:Makefile.am 编写说明:
"SUBDIRS = aaa bbb src" 进行递归处理 可以使用 "AM_CPPFLAGS = -I.. -DAABBCC" 向编译器传递参数;请一定添加 "-I$(top_srcdir)" 可以使用 "LDADD = -lrt -lz" 添加链接库信息(相当于 -L 参数,区别在于可以配合libtool使用;详情请见 libtool 的使用)

33 编写两类配置文件:Makefile.am 编写说明(二):
使用 "XXXX_PROGRAMS" 指定最终需要生成的可执行文件名;使用 "可执行文件名_SOURCES" 可进一步指定生成可执行文件所需的源文件名。例: (当前目录有 editor.c common.c test_c.c editor.h) (当前目录下有 scripts 子目录) AM_CFLAGS = -I.. -I$(top_srcdir) -I. LDADD = $(top_srcdir)/lib/libpro.la bin_PROGRAMS = editor test_c editor_SOURCES = editor.c common.c editor_LDADD = -lz test_c_DEPENDENCIES = test.stamp test.stamp: @echo "#built on $$(date)" > $(srcdir)/scripts/test.sh EXTRA_DISTS = README noinst_HEADERS = editor.h

34 编写两类配置文件:Makefile.am 编写说明(三): 使用变量名的“递归”进行处理步骤的说明 变量名中如果有特殊字符,一律用下划线代替

35 实战:从零开始 编写源代码 确认文件关系 使用 autoscan 编辑 configure.scan,存成 configure.ac
编写 Makefile.am autoreconf --install --verbose ./configure make make dist sudo make install / uninstall

36 编写两类配置文件:建议 有条件有时间的话,请一定看一遍官方使用手册再来使用;能够少走很多弯路。(见演示文稿后的参考文献)
去找找其它使用 Autotools 的中小型项目的配置文件作参考 遇到问题请使用英文在 Google 搜索 autoconf 的宏与 automake 的前后缀参数很多,功能强大;有需要请查阅资料

37 最简单操作流程 前提:只有源文件;从头开始 autoscan (编辑 configure.scan,重命名为 configure.ac)
(手写各个 Makefile.am) (保证项目内有 #include "config.h" 语句)

38 最简单操作流程 前提:所有项目配置文件均已完成
autoreconf #等于 aclocal+autoheader+libtool+autoconf+automake ./configure make (make install / make dist, etc) 建议用autoreconf --verbose --install进行查错

39 下期预告 为什么 configure.ac 这么奇怪?——m4 语法简介 automake 高级用法,源代码打包
自定义文件安装路径,指定安装额外文件(如man手册、库文件) autoconf 高级用法 条件编译的实现(配合 config.h) 配套工具:libtool, gettext 后继者:cmake,…… 以及其它内容!

40 扩展阅读与参考文献 推荐阅读 Autotools Mythbuster GNU Automake && GNU Autoconf
GNU Automake && GNU Autoconf Autotools Turtorial & Introduction Official Manual(s) 推荐阅读

41 扩展阅读与参考文献 Wikipedia: GNU Build System 版权声明:
所有引用材料版权见原作者声明;个人材料文字以 CC-BY-NC 4.0 International协议发布。

42 Q & A

43 谢 谢 !


Download ppt "永远的 Autotools ——GNU Build System 简介(一)"

Similar presentations


Ads by Google