Packaging for SLES
构建服务教学 - 技巧和花样 - 跨发行版打包 - Debian 打包指南 - 打包检查
桌面菜单分类 - 打包常用的 RPM 宏 - 小脚本片段 - SysVinit 脚本 - 源代码服务
OBS 打包互助问答 - 打包黑名单
目录
什么是 SLES?
SuSE 的企业版分两个版本,一个版本叫 SLED,一个版本叫 SLES。
SLED 是 SuSE Linux Enterprise Desktop 桌面版, SLES 是 SuSE Linux Enterprise Server 服务器版。
两种版本在老人的口中都叫做 SuSE Linux。在 SuSE 10 以前是没有 openSUSE 的。openSUSE 的版本开始于 11.1。在那以前 SuSE 的企业版和开源版是不分家的。这就是为什么论坛上一些老人会说我最早用的是 SuSE Linux,一些人也会把 SuSE 和 openSUSE 混着叫的原因。
参考:
SLES 打包常见错误来源与解决办法
%fdupes
%fdupes 这个宏 SLE_10 也就是老人们常说的 SuSE Linux 10 是没有的,因此如果使用了这样的代码,在 SLE_10 上就会出错:
BuildRequires: fdupes
%install [...] %fdupes (-s) %{buildroot}
正确的做法是使用版本宏把 %fdupes 括起来:
%if 0%{?suse_version} > 1020 BuildRequires: fdupes %endif
%install [...] %if 0%{?suse_version} > 1020 %fdupes (-s) %{buildroot} %endif
xz
不得不说,这种压缩格式确实很省空间,因此特别受欢迎,但是 SLE_11_SP2 及以下是不支持这种压缩格式的。
所以要以仅次于 xz 的 tar.bz2 来保存你的 Source。
Group 标签
在划分子软件包的时候,类似 Version, Group, License 这样的标签都是不必须的,必须的只有 Name 和 Summary,还有对主包的 Requires。
但是上面的情况只对 openSUSE >= 1140 适用,也就是说,SLES 系列你得加上 Group 标签。
Cmake
SLE_10 没有 cmake。所以任何使用 cmake 构建的软件包在 SLE_10 上没等编译就会出错。
没有解决办法。只能
osc meta prj -e home:MargueriteSu
里面添加下面的行,禁用编译:
<build> <disable repository="SLE_10"/> </build>
SLE_11 上面的 cmake 版本不够,是 2.6.2, 一般现在都需要 2.8.2 以上,解决办法有两种:
对于开发源,比如 M17N, 使用下面的命令链接一个 cmake 进来。
osc linkpac devel:tools:building cmake M17N cmake
对于个人源,用上面的方法编辑 project config, 在 <repository name="SLE_11"> 里面加上:
<path project="devel:tools:building" repository="SLE_11"/>
%make_install
这个宏是 openSUSE 专有宏,SLES 里面是没有的。解决办法是替换为 RPM 通用宏 %makeinstall。
PreReq: sysinit(network) 和 pkgconfig(gtk+-2.0)
这种写法和 pkgconfig(gtk+-2.0) 差不多,是 openSUSE/Fedora 中引入进来的。SLES 系列是没有的。
解决办法是替换为它实际指代的包,PreReq: sysconfig 和 BuildRequires: gtk2-devel。
差不多这种错误都是由于跑了 spec-cleaner -i *.spec 或者 osc service localrun format_spec_file 引起的。跑完一定要检查一下。
%ghost
有时候, SLES 系列会报错提示你 /var/adm 或者其他 /var 下面的文件没有被打包。
/var 是个缓存目录,在 openSUSE 里这样的文件即使在打包过程中被创建出来,也是会自己删除掉的,但是 SLES 不会。因此我们要引入幽灵文件这个概念,把它标记为幽灵文件。
幽灵文件的意思是说,这个文件可以像文件夹一样被多个软件包拥有,甚至你都不需要有一个有内容的这个文件,只要 touch 一下就可以。一般幽灵文件都是在缓存目录中的配置文件,软件包需要占有它的文件名,比如 /var/adm/ibus.conf 必须是 ibus 的配置,因此要被 ibus 软件包占有,但是 ibus 软件包又不需要在打包时候就提供这样的完整配置,而且这个配置甚至可以被比如 kimpanel 或者 kimtoy 提供,所以叫做幽灵文件,似有实无,需要的只是这个名字而已。
正确的做法是:
%files %defattr(-,root,root) %ghost /var/adm/ibus.conf
gettext
在 gcc > 4.7 中,configure 是无法在 libtool 和 libc 中找到 gettext 的。
正确的办法是:
%build export CFLAGS 或 CXXFLAGS="-fpermissvie"
依赖版本
这个比较通用,一般 SLES 系列带的都是经长久测试,非常稳定的旧版本,所以需要用版本标签来强制使用这些版本。例如:
%if 0%{?suse_version} >= 1140 BuildRequires: libdb-4_8-devel %endif %if 0%{?sles_version} BuildRequires: libdb-4_5-devel %endif
定义宏
大部分打包专案中使用的宏变量都是在 openSUSE_11.3 中使用的,在 SLES 中我们要在 spec 范式文件的开头定义它们,不然就会出现 no job control 错误。例如:
%define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")
只有这样才能在后续使用 %{python_sitelib} 这样的宏。
GTK 版本
只有 openSUSE >= 1140 的版本中才有 GTK3, 只有 openSUSE >= 1210 的版本中才有 GTK3.2。因此使用 gtk 模块的包要尤其注意,不要对 SLES 开启 GTK3, 那样是必须出错的。例如:
%if 0%{?suse_version} >= 1140 BuildRequires: gtk3-devel %endif %if 0%{?suse_version} >= 1210 BuildRequires: gtk3-devel >= 3.2 %endif
GTK 常见编译错误
GTK 每个版本都会引入一些新函数,同时有相应的老版本函数跟它兼容,有时候我们在 SLES 上打包会报错比如:
undefined reference gtk_widget_get_visible
这是因为这个函数是 gtk >= 2.18 之后才引入的,所以我们要做一个补丁把该函数替换为老版本的函数,也就是 GTK_WIDGET_VISIBLE(注意大小写)。
同样的还有 gtk_widget_get_state 替换成 GTK_WIDGET_STATE,gtkwindow 替换成 widget->window 等等。具体可见: http://developer.gnome.org/gtk/2.24/GtkWidget.html
QT 版本
一般开发者使用的 QT 函数都是 QT 4.5 以后定义的,而 SLES 使用的 QT 是 4.4.3, 因此无法编译依赖 QT 的软件包。
X11
openSUSE OBS 中的 X11 项目取消了对 SLE_10 的支持,因此任何需要 X11 的软件包,比如在 LDFLAGS 里带有 -lX11 的软件包在 SLE_10 上基本都无法编译。因为服务器版是很少用 X11 图形窗口系统的。