Packaging for SLES

跳转至: 导航, 搜索


本文介绍了一些针对 SuSE 企业版 SLES 打包的注意事项。以供打包侦错参考。

什么是 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 图形窗口系统的。

未完待续