openSUSE:Build Service 新手入门

跳转至: 导航, 搜索
本文旨在引导 openSUSE 新人从本地编译顺利过渡到 编译服务在线编译或 osc 标准环境编译。也可以用于指引完全不懂本地编译的新人顺利踏入神圣的编译之门。可能与 User:MargueriteSu学姐的其他教学有重复,但书读百遍其义自现,还请耐心把它看完。

什么是编译?

编译是划分「用户」和「半瓶水开发者」的一道门槛。技术上说,它是将源代码搞成执行程序或可被其他执行程序用的库文件的过程。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) 搜索。如图:

搜索软件包

Marguerite-soos-search.png

查看软件包详情

点击,「直接安装」右下角的「查看详情」。

Marguerite-soos-package-detail.png

查看软件仓库状态

Marguerite-boo-repository-status.png

如果你的软件包在查看软件包详情的时候不需要点击「Show unstable packages」,而直接显示的就是 openSUSE Factory 和 official release 的话,可以点下图这里,就能来到一个类似上图的页面了。

Marguerite-boo-factory-developed-at.png

查看软件包版本

Marguerite-boo-package-status.png

查找上游版本

Marguerite-upstream-version.png

怎么找的?自然是 Google 了。

派生软件包

太旧了?想升级?点击这里:

Marguerite-boo-branch-package.png

派生的软件仓库

于是你就会被转向到你的派生软件仓库,是不是和 Github 很像?

Marguerite-boo-branched-repository.png

上传新的源代码

点击 Sources 选项卡,上传新的源代码。

Marguerite-boo-upload-source.png

修改压缩格式

有时候上游的版本可能提供的是 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 这里,改成你的新源代码的版本号。

Marguerite-boo-bump-version.png

如果需要定制的话,继续下拉到 %install 这个章节,里面有个 %configure 指令,你在本地编译时可用的 configure 选项这里都可以用。

注意 记住,自用的话,你可以使用任何选项,但如果有想法提交给发行版的话,请尽量使用标准选项(对你来说就是不要动它),也就是说,能开的功能都打开,除非这个功能不适用这个操作系统比如 Mac 的功能,或者这个功能已知对系统稳定性有妨碍。

保存。

添加修订日志

点击 .changes 文件,下拉一下,因为你是升级新版嘛,你就看看人家升级新版的修订日志都是怎么写的。比如:

- update to 2.2.0
  * 1
  * 2
  * 3

这个 1,2,3 条是哪里找到,官网找的,比如我就是在 csslayer 的博客上找,他一条条给我写好,其他上游也有比如 Release Note 这样的链接,或者是在压缩包的 ChangeLog 里。具体还是看 openSUSE:Specfile_guidelines

保存。

等结果

下载软件包

在上面「查看软件包版本」的位置,直接点击想要下载的软件包,然后点下图这里:

Marguerite-boo-download-package.png

添加软件仓库

还是在「查看软件包版本」的位置,点击这里,就会自动转到一个 d.o.o(http://download.opensuse.org)前缀的网址,在 YaST 中将这个网址添加为软件仓库即可。

Marguerite-boo-find-repository.png

出现「Object not found」是因为编译好了,但是编译服务的计划器(scheduler)还没将编好的软件包发布到下载服务器上。稍等即可。

提交给官方

在「Source」选项卡下点这里:

Marguerite-boo-submit-package.png

Marguerite-boo-preview-changes.png


Enjoy it!