openSUSE:Build Service 新手入门
什么是编译?
编译是划分「用户」和「半瓶水开发者」的一道门槛。技术上说,它是将源代码搞成执行程序或可被其他执行程序用的库文件的过程。Linux 是开放源代码运动的直接产物,源代码的范围很广泛,但怎么把代码弄得一般人能「用」而不只是「看看」而已,就需要编译。所以新人掌握编译就代表掌握了命运,而不再受制于发行版。
以上。本文的目的不是去让新手不再受制于 openSUSE。因此我不会教你本地编译。你可以把这看作是私心。因为使用构建服务编译的软件包,可以强制你分享你的成果,无论好坏。具体请见下面的本地编译与在线编译的比较章节。但如果你如果聪明的话,是能够从蛛丝马迹中掌握本地编译的。
本地编译和在线编译的对比
构建服务是 openSUSE 提供给 Linux 的强力工具,它完全颠覆了本地编译的逻辑。简化了折腾过程和技术宅的电力。
- 网速慢?不要紧,它可以帮你下载源代码。
- 内存不够大?CPU 不够强?不要紧,服务器替您服务。
- 担心本地编译的东西重装就不见了?不要紧,服务器替您存着。
- 担心本地编译的东西不能与友人分享?无法在自己的其他机器或服务器上使用?不要紧,构建服务自动帮你开启一个软件仓库,别的机器直接加源安装或一键安装。
- 担心编译过程太复杂?不要紧,你若不想改,那需要改的地方少得你会大叫哇
- 担心编译过程不够折腾?不要紧,你若想折腾,构建服务比本地编译可以折腾的地方多多了。
- 担心本地编译的东西升级之后全部要重新编译?构建服务一次编译出所有 openSUSE 版本的软件包。
- 担心本地编译的东西会造成「usr 污染」又毫无办法?构建服务生成的软件包完全是标准格式,可用 RPM 或 YaST 管理。
除此之外,还有如下好处:
- 装开发者。基本在 openSUSE 世界你要没有一个 home,出门都不好意思跟人家打招呼。
- 平稳过渡为一个开发者。如果说你当初开 home 是为了装开发者的话,那你使用本教程用的久了,是一定会遇见教程没有覆盖到的问题的(实际上我就没打算面面俱到),这时之前说出天花你也觉得烦的 Portal:Packaging 专题就会变得亲切起来了。然后慢慢的你就会发现在论坛问问题的新人变得有意思起来了。这时你已经不知不觉成为了一个开发者了。
- 养成不编译就手贱的毛病。本教学的方法用久了。你会发现看到什么新鲜的东西想到的不是第一时间下载编译,而是先建一个软件包。看到一个不是最新的官方包,想到的总是先升级一下它。然后通过比较简单的 如何向发行版提交软件包,你就真真正正的成为一个开发者了。
好,那本地编译还有什么存在的意义呢?
编译的种类
编译按照使用的编译器可划分为以下几种:
- automake。就是你看得够够的 configure && make && sudo make install。
- cmake。Fcitx 就是用的这个编译系统。
- scons。Sunpinyin 项目就是用的这个编译系统。
- python-distribute。也就是 python setup.py build 这样。
- copy。对,就是 copy。多见于数据文件,比如字体。
- .run。对,你见过,这是 NVIDIA 私有显卡和游戏的格式。这实际上是一个压缩包,捆绑了 bash 脚本用来做编译。
- gcc。这是最笨的方法。多见于单一库文件,不然作者好歹也会从上面选个编译系统的。
背景知识
在真正开始编译之前,需要扫盲一下名词解释,有个概念就可以。
依赖
Linux 是一个模块化的系统。它的哲学是把一块大蛋糕切得足够小,每个开发者分到一小块的蛋糕去制作,做到最好,并且有替代(也就是实际上的蛋糕块够拼成好多个大蛋糕),然后发行版来拼蛋糕。这个哲学好不好另说,但这个哲学就产生了一种情况,某块蛋糕需要一个缺口,这个缺口是另一个或另外几个蛋糕块提供的。没有那几块蛋糕,这块蛋糕的形状放进去会让整个大蛋糕显得缺了一块,或者完全就放不进去。这就是依赖关系。
各种编译系统的编译指令
- automake: 1. configure 2. make 3. sudo make install
- cmake: 1. mkdir build 2. cd build 3. cmake ../ 4. make 5. sudo make install
- scons: 1. scons 2. sudo scons install
- python-distribute: 1. python setup.py build 2 sudo python setup.py install
- copy: 1. mkdir $DEST_DIR(要复制到的文件夹) 2. cp -r * $DEST_DIR
- .run: 1. chmod +x *.run 2. sh *.run
- gcc: 1. gcc *.c -o *.so
软件包
软件包按照 Windows 那边的解释,就是一个自解压包,跟 .exe 一样的预制包,只不过不能双击即用。从软件仓库安装或使用 rpm -ivh *.rpm 安装后,直接就可以用,完全让新人感觉不到编译之神的存在。(这里我使用的 RPM 的例子,软件包格式还有比如 .deb,.pkg 以及各种小众的 .ebuild,.run, .sh 等,严格说能称之为软件包的只有 .deb,.rpm,.run,.sh。
prefix
这类似于 Windows 安装软件包时的 C:Programs Files 一样,只不过 Linux 是通过 prefix 来变更软件的安装位置。默认的安装位置是 /usr/local。但是这个目录的角色很尴尬。它里面的可执行文件不属于系统的一部分,系统重装时又会干掉它。所以我们大部分时候都要使用 --prefix=/usr 这样的方法来安装到系统里。但这又产生了一个问题:
你必须保留编译的源代码文件夹才能卸载。否则你永远不知道安装了多少个文件,到什么地方。而有些编译系统比如 python-distribute,你保留了文件夹也没有用,它就没有卸载机制。我管着叫做 usr 污染。会导致你的 usr 目录不断增大你又毫无办法,乱删就可能导致删除系统文件(不删除系统文件的方法是对每一个想要删除的文件使用 rpm -qf 查询,但那太慢),最后只能重装。
-- help
无论何种编译系统,命令 + --help 永远能给你提供必要的帮助信息。比如你在编译 automake 系统的软件时,想要知道软件作者提供了哪些定制选项,就可以使用 configure --help。命令用法不会用,也可以使用该命令查看。
RPM SPEC
全称是 RPM sepcfile。RPM 规范文件。是 RPM 打包的最关键的引导文件。叫它规范文件是因为一方面它自己完全是照章办事,就像填表格一样,每个字段都提供给了你选项和写法;一方面是它自己就是指引,指引软件把自己安装到系统规定的位置,生成完全合规的拿到同样系统上完全无痛安装的规范软件包。它的完整写法可见 openSUSE:Spec 文件指南。但你现在不需要看。
build.opensuse.org
这是构建服务的网址。openSUSEer 口中的缩写是 b.o.o。所以下次让你「自己去 s.o.o 搜索」就不要一头雾水了。你需要注册一个 Novell 帐号来使用。注册帐号的教学看这里 SDB:注册 Novell 帐号。
注册帐号后按照下面教你的做法的话,设置方法也很简单,只需要创建你的 home 即可。别的什么都不用管。
最简单的一个小例子
下面我就假设你已经有了一个 Novell 帐号来使用构建服务了。
这个小例子可能成功也可能失败,而它的失败都是可以解决的,小的编译错误 Google 错误本身就能解决,大的编译错误可以向上游报 bug。总之它若出错,那这个错误在本地编译一样会出现。要是悲剧在格式弄错的话,有详细的 openSUSE:Specfile_guidelines 或 opensuse_zh@im.partych.at 聊天室可以解决。
好,下面开始这个非常典型的用户例子。你想使用一个软件,于是到 s.o.o/s (software.opensuse.org/search) 搜索。如图:
搜索软件包
查看软件包详情
点击,「直接安装」右下角的「查看详情」。
查看软件仓库状态
如果你的软件包在查看软件包详情的时候不需要点击「Show unstable packages」,而直接显示的就是 openSUSE Factory 和 official release 的话,可以点下图这里,就能来到一个类似上图的页面了。
查看软件包版本
查找上游版本
怎么找的?自然是 Google 了。
派生软件包
太旧了?想升级?点击这里:
派生的软件仓库
于是你就会被转向到你的派生软件仓库,是不是和 Github 很像?
上传新的源代码
点击 Sources 选项卡,上传新的源代码。
修改压缩格式
有时候上游的版本可能提供的是 xz,这里却是 bz2。之所以使用与上游不一样的格式,打包者自然是有他的考虑的。所以我们要改进我们的格式。常见解压命令:
- tar.gz:tar -xzvf *.tar.gz
- tar.bz2: tar -xjvf *.tar.bz2
- tar.xz: tar -xvf *.tar.xz
常见压缩命令:
- tar.gz: tar -czvf 文件名.tar.gz 文件夹名
- tar.bz2: tar -cjvf 文件名.tar.bz2 文件夹名
- tar.xz: tar -cvf 文件名.tar 文件夹名
然后 xz -z *.tar
修改版本号
点击 .spec 那个文件,然后下拉到 Version 这里,改成你的新源代码的版本号。
如果需要定制的话,继续下拉到 %install 这个章节,里面有个 %configure 指令,你在本地编译时可用的 configure 选项这里都可以用。
保存。
添加修订日志
点击 .changes 文件,下拉一下,因为你是升级新版嘛,你就看看人家升级新版的修订日志都是怎么写的。比如:
- update to 2.2.0 * 1 * 2 * 3
这个 1,2,3 条是哪里找到,官网找的,比如我就是在 csslayer 的博客上找,他一条条给我写好,其他上游也有比如 Release Note 这样的链接,或者是在压缩包的 ChangeLog 里。具体还是看 openSUSE:Specfile_guidelines
保存。
等结果
下载软件包
在上面「查看软件包版本」的位置,直接点击想要下载的软件包,然后点下图这里:
添加软件仓库
还是在「查看软件包版本」的位置,点击这里,就会自动转到一个 d.o.o(http://download.opensuse.org)前缀的网址,在 YaST 中将这个网址添加为软件仓库即可。
提交给官方
在「Source」选项卡下点这里: