最后更新:2016年11月27日
 by FreeFind
title ?
开始
1. 简介
2. 改用 GNU/Linux
3. 获取 openSUSE
4. 安装
日常应用
5. KDE 桌面环境
6. 常用软件
7. 安全设置
8. 终端命令行
9. 管理员设置 (YaST)
10. 软件安装
11. 软件源
12. 与Windows世界兼容
设置
13. 多媒体编解码器
14. 浏览器插件
15. 显卡驱动
16. 无线网
17. 开发环境
18. 软件打包服务OBS
19. LAMP和LNMP
20. 其他常见服务软件
附录
A: 帮助和文档
B: 游戏
C. 深入了解
D. 提示和解决方法
E. 历史和背景
F: 重在参与
GNU自由文档许可证
18. 软件打包服务 - Open Build Service
觉得看文字教程无聊的同学可以直接去看玛噶学姐的优酷视频教程:
openSUSE 下构建 RPM 软件包

18.1 软件打包简介
前面17章介绍了代码编译工具、集成开发环境(IDE)、源码的发布管理(版本控制系统),软件源码从开发到管理、发布走了一遍,下面到怎样把软件源码打包成适合各个版本的Linux,比如Debian/Ubuntu/Deepin会使用deb包,Fedora/openSUSE使用rpm包。不同的Linux发行版和同一发行版的不同版本号的Linux,通常都需要将软件从源码编译组建成二进制格式的deb或rpm包。通过安装deb或rpm包,省去了普通用户编译源码、寻找软件依赖库的繁琐过程,就可以实现傻瓜式安装,省时省力。

当然还有将一些头文件、库文件打包成devel(或dev)系列的deb或rpm包,用于开发。
通常以devel(或dev)结尾的deb或rpm包,就是开发和编译代码用的。
以debuginfo和debugsource结尾的就是专用于该软件的调试信息和调试源码包。
以source结尾的包(如kernel-source)就是该软件完整的源代码的打包。
以lang结尾的包(如anjuta-lang)就是该软件的多国语言包。

各种各样的Linux都是这些打好的软件包的集合,如果没有deb或rpm之类现成的软件包,那么从源代码编译软件,生成可执行程序或库,对新手来说是一件麻烦的事。软件基本都不是独立的个体,通常会依赖这样或那样的库,很可能在网上找了软件源码来编译,发现怎么搞都不行,很多时候就是依赖的库太多,剪不断理还乱,所以新手就很难弄。

当然,这些东西搞多了就轻车熟路了。作为新世纪的好青年,不能总是指望老外搞。作为世界人口第一的大国,我们也应该为开源社区出一份力。写17和18章的内容也是期望大家多作贡献。

18.2 Open Build Service
下面介绍Open Build Service(OBS),Open Build Service原本叫openSUSE Build Service,最初是openSUSE社区人员为openSUSE生成rpm软件安装包而打造的平台,现在已经发展成支持各种Linux发行版软件打包的服务平台,由于支持的Linux系统的广泛性,2011年openSUSE Build Service正式改名为Open Build Service。其主页:
http://openbuildservice.org/

目前支持的操作系统包括:openSUSE, Debian, Fedora, Ubuntu, Red Hat Enterprise Linux, SUSE Linux Enterprise等。

在openSUSE 12.1的时候,还需要添加OBS安装源:
http://download.opensuse.org/repositories/openSUSE:/Tools/openSUSE_12.1/

现在新版本中发现其发行DVD盘里面就有OBS的各种软件。所以省事了,直接在root命令行执行:
zypper in osc

查看内置帮助文档命令:
osc help

osc就是OBS命令行的意思,软件包管理器会自动安装相关的软件包,所以安装是非常容易的。 OBS软件直接放到发行DVD里面,也可以看出openSUSE社区和其他开源社区对大家的召唤啊。

18.3 简单的OBS之旅
OBS打包服务的大致工作流程是在本地准备好源代码包,编辑好SPEC文件,然后将各种相关文件提交给OBS服务器,服务器自动根据SPEC文件进行编译链接源代码,为各个版本Linux打包,并检查软件包信息。所以通常都是需要连网操作的。既然是贡献软件包,自然是公开在OBS网站的。 下面先介绍命令行下的osc打包。下节介绍Web页面的提交方式。

下面就用hellolq.cpp作为例子,打包成rpm发到OBS网站上去。
//hellolq.cpp
#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
     cout << "Hello LQ!" << endl;
     return 5201314;
}

本章用到的代码、SPEC等文件压缩包下载:
18.hellolq.tar.gz


(1)注册OBS帐号
去这个网站:
https://build.opensuse.org/
点击右上角“Sign Up”,注册自己喜欢的帐号;
注册完成后,重新回到上面网址;
点击右上角的“Login”,用新账户登录进去。
登录后会看到页面变了,中间有个“New Project”,点击一下,
obs01

填写新建的项目:
obs02

最下面两个复选框不要选,直接点“Create Project”。如果刚注册的用户名为iloveliuqing,那么就会出现新建的项目 home:iloveliuqing 。第一步成功。

(2)在本地创建OBS打包项目文件夹
在用户主文件夹下建立一个文件夹,专门用于OBS打包:
mkdir ~/OBSProjects

比如用户主文件夹是/home/suse123,那么OBS项目文件夹就是/home/suse123/OBSProjects 。

(3)把服务器上的OBS项目同步到本地OBSProjects。
OBS命令类似SVN的命令,这里先和服务器上的同步一下。
cd ~/OBSProjects
osc checkout home:username

checkout可以简写成co,username就是前面注册的账户名,比如
osc co home:iloveliuqing
连网同步的时候,命令行会提示需要自己前面注册的用户名和密码。然后等待下载同步过程。由于新账户没东西,所以本地OBSProjects/home:username文件夹是空的。

(4)设定想为哪些发行版打包
命令行下可以用如下命令打开配置文件:
osc meta prj -e home:username

这时会看到vim里的配置条目:
<project name="home:iloveliuqing">
  <title>iloveliuqing's Home Project</title>
  <description>Test hellolq.</description>
  <person userid="iloveliuqing" role="maintainer"/>
  <person userid="iloveliuqing" role="bugowner"/>
</project>

在vim界面按i键开启编辑模式,在</project>上面添加几行:
<repository name="openSUSE_12.3">
  <path project="openSUSE:12.3" repository="standard"/>
  <arch>i586</arch>
  <arch>x86_64</arch>
</repository>

输入好之后就是这个样子:
obs03

然后按ESC键退出编辑模式,再打字 :wq 就可以保存退出vim了。 添加的一段就是表示为openSUSE 12.3版本的32位和64位系统打包。这里做测试,只加了一个,还可以类似地添加多个目标版本。这配置文件是OBS服务器上的,通过远程编辑方式改变配置条目。

(5)准备好源码包和spec 文件
实际上的源码包当然不会只有一个hellolq.cpp,所以这里按照GNU标准,用自动配置工具如autoconf、automake等打了一个带有一些配置文件的源码包:hellolq-1.0.tar.gz 。 一般自动配置工作都是集成开发环境自动做的,所以不用在意生成的一堆配置文件和脚本。其实源代码就只有一个hellolq.cpp。当然感兴趣的可以去搜一下“Linux自动生成Makefile”。
(需要注意的是automake处理时会添加install-sh、depcomp、missing三个快捷方式到源码文件夹里,这三个快捷方式在本地能用,但远程OBS服务器上是没有的。必须把它们三个的文件本体,从/usr/share/auotomake-version/ 里面,复制到源码文件夹里,再做成压缩包。)

在解决好依赖关系之后,Linux下的软件源代码编译安装通常都是非常简单的三板斧:
./configure
make
sudo make install

第一步是检查配置环境,看看有没有依赖的工具、头文件、库等。第二步是正式编译链接,生成目标文件和可执行的程序。第三步是安装到系统中。

得到要打包的源代码后,怎么让OBS打包系统知道编译、打包、安装、卸载这个软件时具体执行什么命令呢?

这就要靠 spec 文件了。除了软件源码,就数 spec 文件重要了。在OBS上打包,至少需要这两个东西。 spec 文件的编写知识很多,但通常情况下,找个差不多的模板, 把软件包的名字、版本、依赖关系之类的改改就差不多了。 对于这里简单的软件包,找了个模板套一下,然后把名字改为 hellolq.spec 。

详细的编写方法参考:
http://fedoraproject.org/wiki/How_to_create_an_RPM_package
改好的hellolq.spec如下:
Name:      hellolq
Version:   1.0
Release:   1
License:   GPL-2.0+
Source:    hellolq-1.0.tar.gz
Group:     Productivity/Other
Summary:   Test hellolq

# List of additional build dependencies
BuildRequires: gcc-c++ , libstdc++-devel
BuildRoot: %{_tmppath}/%{name}-%{version}-build

%description
hellolq-1.0


%prep
%setup -q

%build

# Assume that the package is built by plain 'make' if there's no ./configure.
# This test is there only because the wizard doesn't know much about the
# package, feel free to clean it up
if test -x ./configure; then
     %configure
fi
make


%install

make DESTDIR=%buildroot install


# Write a proper %%files section and remove these two commands and
# the '-f filelist' option to %%files
echo '%%defattr(-,root,root)' >filelist
find %buildroot -type f -printf '/%%P*\n' >>filelist


%clean
rm -rf %buildroot

%files -f filelist
%defattr(-,root,root)

# This is a place for a proper filelist:
# /usr/bin/Qt4
# You can also use shell wildcards:
# /usr/share/Qt4/*
# This installs documentation files from the top build directory
# into /usr/share/doc/...
# %doc README COPYING
# The advantage of using a real filelist instead of the '-f filelist' trick is
# that rpmbuild will detect if the install section forgets to install
# something that is listed here


%changelog
* Tue Mar 26 2013 Winland <winland0704@126.com> 1.0
- Build for 1.0.

这倒数第二段的注释深深地出卖了我,这是从一个打包qt的项目里弄来的spec模板。这个是最简单的模板,可以自己试着玩玩,但是正式的写法最好参考opensuse_zh项目上的软件包的spec文件写法。比如Dr.COM 包页面,打开页面里的drcom.spec文件就可以看到里面的内容了。
https://build.opensuse.org/package/show?package=Dr.COM&project=home%3Aopensuse_zh
准备好源码包hellolq-1.0.tar.gz和spec文件hellolq.spec之后,就可以进入下一步了。

(6)创建一个具体的打包项目
继续在~/OBSProjects里面执行命令,来新建一个打包项目:
osc meta pkg -e home:username packagename
username是之前的用户名,packagename就是软件包的名字。 比如执行
osc meta pkg -e home:iloveliuqing hellolq
命令行下会打开vim,编辑配置文件,按 i 键编辑,
在 <title> </title> 中间填写软件名字,如 hellolq 。
在 <description> </description> 中间填写软件描述,如 Test hellolq 。
然后按ESC,再输入 :wq 。就可以保存退出了。

这个是在OBS服务器上创建了打包项目,本地需要更新一下:
osc up home:username
显示结果如下:
suse123@linux-9ppl:~/OBSProjects> osc up home:iloveliuqing
checking out new package hellolq
A      home:iloveliuqing/hellolq
At revision None.

这时就会和OBS服务器同步了。

(7)写打包记录,添加文件到打包项目
把之前准备的hellolq-1.0.tar.gz 和 hellolq.spec 复制到这个目录里:
~/OBSProjects/home:username/packagename/
比如OBSProjects/home:iloveliuqing/hellolq/目录。然后进入这个目录:
cd ~/OBSProjects/home:username/packagename/

先在打包目录里面执行:
osc vc

这会打开一个hellolq.changes文件,用于记录打包者做的事情,比如记录打包开始日期、什么时候修复了什么问题之类的。这里输入的是:
-------------------------------------------------------------------
Tue Mar 26 2013 Winland <winland0704@126.com>

- begin OBS test
- build hellolq-1.0


编辑好后,按ESC键,在输入 :wq 保存退出。

执行添加文件到打包项目的命令:
osc add *

这会把该目录里的文件都添加到打包项目里。
然后执行提交:
osc commit

提交时会提示要在“--This line, and those below, will be ignored--”上面输入一些关于本次提交打包的描述信息,比如 Fix bugs. Test hellolq 。 按i键编辑,编辑好后按ESC键,再输入 :wq 保存退出。
再等待文件都被上传到服务器。就差不多搞定了。

(8)查看打包结果
上传到的文件,OBS服务器会自动根据spec文件打成rpm包。
查看提交日志,执行:
osc log

查看打包结果,执行:
osc results

如果打包的过程结束,会看到finished字样。finished表示在某个系统平台执行编译链接、安装检查的过程结束,finished不是说成功也不是说失败。如果OBS服务器打包过程出错,以后查看results会出现failed字样。如果打包过程没问题,以后查看results会出现succeeded字样。

查看在某个版本系统架构上打包的日志,执行:
osc buildlog openSUSE_12.3 i586
osc buildlog openSUSE_12.3 x86_64

在finished之后就可以查看这些打包日志。
如果出错,会看到有些ERROR打头记录可以查看哪里出错的。
如果没问题,会看到类似这些记录:
RPMLINT report:
… …
... saving built packages
… …
build34 finished "build hellolq.spec" at Wed Mar 27 04:47:49 UTC 2013.

打包成功后,就可以在自己的OBS个人页面看到打好的包:
obs04

也可以从属于自己的打包软件源下载软件,比如:
http://download.opensuse.org/repositories/home:/iloveliuqing/openSUSE_12.3/
OBS个人空间
http://download.opensuse.org/repositories/home:/username/
就是自己专属的打包发布的地方。

18.4 Web界面提交打包
登录 https://build.opensuse.org/ 网站之后,点击右上角的Home Project,就会进入自己的打包项目管理页面。
注册帐号和新建个人项目同上一节的(1)步骤。下面示例Web界面操作。

obs05

(1)设置想为哪些发行版打包
到 Home Project 主界面,点击上面的 Repositories ,找到 Build Flag 字样上面的 Add repositories,点击它就可以选择添加要打包的平台。
obs06

(2)准备好源代码包和SPEC文件
这个同上一节的osc命令行方式步骤(5)介绍的。有changes文件更好,做好打包记录是好习惯。
changes文件可以自己用编辑器建一个,然后编辑,一样好使的。

(3)创建打包项目
回到HomeProject主界面,点击下面的“Create package”,就可以新建一个打包项目。
obs07

编辑好后保存。

(4)提交文件到打包项目
到Home Project主界面,可以看到建好的Packages,打开这个打包项目, 找到Revision字样上面的Add file就可以添加文件。Web界面很直观,就不细说了。
obs08

添加完文件后,就可以静候佳音。
右边的Build Results就是打包结果。
点击结果里面的链接“finished”或“failed”、“succeeded”就能看到打包日志。
有问题的就可以查看问题。

18.5 推荐的资料
OBS是很强大的平台,熟悉了SPEC文件打包之后,不管去其他哪个Linux平台打包都是可以举一反三的。学习打包可以锻炼自己,也能为开源社区出力。当然,可以学到很多知识。打包出了问题实在不好解决,就去 openSUSE中文社区 或openSUSE官方论坛求助。推荐几个网址,可以多去学学。

玛噶学姐的“带你学”系列:
(一) openSUSE Build Service 注册与安装
(二) OBS 常用命令:以创建一个包为例
不过玛噶学姐最厉害的是把打包过程做成优酷视频教程了,不喜欢看文字的同学有福了!视频空间:
http://u.youku.com/margueritesu

山木的 Open Build Service 软件建包简要教程:
(一)创建OBS项目
(二)从web页面构建发行版安装包
(三)利用osc工具构建发行版安装包
(四)编写跨平台spec文件

Fedora的RPM打包教程
http://fedoraproject.org/wiki/How_to_create_an_RPM_package
openSUSE的OBS打包指南
https://en.opensuse.org/openSUSE:Build_Service_Tutorial
openSUSE的OSC使用教程
https://en.opensuse.org/openSUSE:OSC

prev
next
本文档翻译自 http://opensuse-guide.org/ 不当之处,还望指正
使用e-mail发送您的英文评论给 admin [at] opensuse-guide.org
或发送意见和建议给中文译者:Libitum (hello[at]libitum.org); Winland (winland0704[at]126.com)