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

Slides:



Advertisements
Similar presentations
Linux管理与应用 Linux 诞生历史 主讲教师:张美平. 主要内容 Linux诞生的几个要素及背景 GNU项目 Linux系统诞生与发展过程.
Advertisements

海阔凭鱼跃 天高任鸟飞 Autoconf 介绍 李俊良 2010/08/18. 内容大纲 学习目的 Autoconf 介绍 Autoconf 框架图 Autoconf 流程 Autoconf 优化 Autoconf 小结 FAQ.
大教育家孔子 年 1 月 11 日,一座总高为 9.5 米的孔 子青铜雕像在国家博物馆北广场落成。 2011 年 1 月 11 日,一座总高为 9.5 米的孔 子青铜雕像在国家博物馆北广场落成。
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
2017/2/ /2/25 1 公職考試與證照考試簡介 考選部 1.
世界读书日 4月23日.
SCILAB 科學軟體教學 撰寫者: 1.中央大學大氣科學系 楊善文 2. (為本文有貢獻者,記得在此留名。)
Linux 安裝入門與基本管理 課程目標: 學習Linux平台下的安裝設定 與 建置一個基本的Linux伺服器
Unix 指令4.
上課教材 Database Slide Windows筆電 (32 bit)
Linux 软件开发工具简介 设计 编码/调试 部署 维护.
作文训练: 突出中心.
命令行操作 shell介绍 常见三种Shell ---Bourne shell(sh) ---C shell(csh)
贴近教学 服务师生 方便老师.
健康選擇飲品 營養師 顏妤蓉 2017/3/13.
Lecture-III-Linux生活应用 许光全 计算机科学与技术学院
Linux并行计算平台搭建及应用 王彦棡 2010年5月.
红旗Linux认证培训 课程介绍.
健康選擇飲品 洪菱窕 營養師 2017/3/15.
Lecture-III-Linux生活应用 许光全 计算机科学与技术学院
安全訓練研習 工教 陳志杰.
操作系统原理 Principles of Operating System
第1章 Linux概述 马丽洁.
大肚宮廟巡禮.
有趣的linux入门文章 By dogfox 制作.
營建自動化 -營建管理資訊化 授課老師:劉俊杰 副教授 中華民國89年9月27日.
嵌入式系统讲义 第5章 嵌入式系统软件开发环境与工具
第三章 古代汉语语法 3—1古汉语语法及其研究 一、《马氏文通》以前的《古汉语研究》
第1讲 实验环境.
香港明愛 綜合家居照顧服務 PWD個案分享.
LINUX 环境下程序开发基础 曙光用户培训课程系列 课程时间:1.5小时 更新日期:2008年3月.
词 五 首.
2017/4/7 國立臺東大學 國家考試講座- 如何準備國家考試 2017/4/7 1 1.
UNIX系統與資料庫安裝 Why UNIX 常用的工具程式介紹 資料庫的安裝.
第16章 編譯與升級Kernel系統核心 課前指引
5.1 – 表格(FORM) 輸入元素 : 兩種傳遞方法 : GET or POST 範例 1. 文字欄位 Text box
QtiPlot-實驗室數據分析與繪圖 撰文者: 1.海洋大學光電所 楊善文 2. (如對本文有貢獻者,記得在此留名)
Linux.
Linux的認識與使用 2013/01/05.
IBM DB2 Personal Edition 試用報告
Computer Network Lab 資碩一 黃麒瑋
台灣大學計算機及資訊網路中心 教學研究組 張傑生
Linux环境下程序编译 曙光信息产业(北京)有限公司.
Shell Script 程式設計.
陈炎 南京大学软件学院 Ant简介 Ant一个优秀的构建工具 Ant意思是Another Neat Tool 陈炎 南京大学软件学院
Linux 的一些事儿 系统管理 宁波市高校慕课联盟课程
编译与多文件.
第二天 计算机基础技能培训 (一)linux基础知识
曙光集群简明使用手册 技术支持中心.
线程(Thread).
第1章、系統軟體 作者:陳鍾誠 旗標出版社.
16 葡萄沟.
Linux核心編譯與模組管理 2013/01/19.
编辑文本文件 软件包管理 Samba 在Linux下使用Windows共享打印机
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3.
东软集团(大连)有限公司 SVVD事业部-于忠华
序及第0章.
系统管理员培训(I期) 浙江省基层人民法院 -V8版介绍及系统管理培训 二OO八年四月二十三日 法院事业部经理:周春宏
第二章 UNIX系统安装与常用命令.
第六章 Shell基础.
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab3.
杨振伟 清华大学 第一讲:Linux环境下编程(1)
Compute System Administration Homework 2: Shell Script
实验一:编译运行Linux内核并使用gdb进行调试
架构师成长感悟 吴隆烽
粒子物理与核物理实验中的数据分析 杨振伟 清华大学 第1讲:Linux环境下的编程.
助教:田成锦、汪睿、游翎璟 吴加禹、李佳伟、唐凯成
杨振伟 清华大学 第一讲:Linux环境下编程(1)
课程介绍 1、嵌入式系统开发先序课程; 2、共32+8课时: 3、本期采用混合式教学成绩计算方式:
Presentation transcript:

永远的 Autotools ——GNU Build System 简介(一) 20150418-1146-GMT+8 杨博远 ("hosiet") 073plan@gmail.com hosiet@mail.ustc.edu.cn

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

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

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

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

科普: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 脚本的风格 目标:自动化

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

来源见参考文献

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

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

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

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

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

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

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

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

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

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

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

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

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

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

一般处理流程 来源:Wikipedia

一般处理流程

一般处理流程

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

编写两类配置文件: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

编写两类配置文件: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

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

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

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

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

编写两类配置文件: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

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

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

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

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

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

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

扩展阅读与参考文献 推荐阅读 Autotools Mythbuster GNU Automake && GNU Autoconf https://autotools.io/ GNU Automake && GNU Autoconf http://www.gnu.org/software/automake/ http://www.gnu.org/software/autoconf/ Autotools Turtorial & Introduction https://www.lrde.epita.fr/~adl/dl/autotools.pdf Official Manual(s) https://www.gnu.org/software/autoconf/manual/{autoconf,automake,m4}.pdf 推荐阅读

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

Q & A

谢 谢 !