openSUSE:软件包条件构建依赖项
摘要
我们的基础软件包包含对各种功能的支持,这使得我们的基础操作系统由于依赖关系而非常庞大。虽然这对于例如 openSUSE Tumbleweed 来说不是问题,因为额外的软件包在整体大小上并不重要,但对于构建小型单用途操作系统,您想要一个真正小的操作系统而没有任何不必要的软件包时,这是一个大问题。这些“无用”的软件包又制造了另一个问题
为了不支持或无法正常工作的特性安装了库。例如,AppArmor 和 SELinux 是互斥的,那么为什么例如 ALP 要发布无法工作且不受支持的 AppArmor,从而在各方都造成了很高的维护开销,而没有任何好处?
每个项目的条件构建依赖
解决方案是在 spec 文件中使用 %bcond 为每个项目启用/禁用 BuildRequires 和代码(参见 https://en.opensuse.net.cn/openSUSE:Build_Service_prjconf#%25bcond)。
该功能应默认启用,对于特殊情况或新功能,情况可能不同。
一个 spec 文件对于 openssh 来说可能如下所示
...
# Enable kerberos by default
%bcond_without kerberos
...
%if %{with kerberos}
%if 0%{?suse_version} > 1500
BuildRequires: pkgconfig(krb5)
%else
BuildRequires: krb5-mini-devel
%endif
%endif
...
%if %{with kerberos}
--with-kerberos5=%{_prefix} \
%endif
...
%files common
...
%if %{with kerberos}
%doc README.kerberos
%endif
...
功能关键字
以下关键字将在 prjconf 中用于启用/禁用每个项目的功能
- aac
- acl_tests 仅用于 'acl' 包本身,以声明测试套件不要在 distro bootstrap 中运行
- ada 不应使用 - 有些 spec 错误地使用 bcond 来禁用其源代码中无法正常工作的特性(ncurses、plplot)
- apparmor
- aspell 利用 aspell 功能(例如 enchant)
- avif 通过 libavif 支持 avif(例如 gd)
- djvu 利用 djvu 功能(例如通过 djvulibre 在 ImageMagick 中)
- faac Freeware Advanced Audio Coder - 应该在参考 OBS 中禁用,有些第三方会重新构建启用此功能的源代码
- faad faad2 媒体支持;必须在参考 OBS 中禁用,但第三方会重新构建启用此功能的源代码
- fdk_aac Fraunhofer FDK AAC 支持 - 应该在参考 OBS 中禁用,由第三方启用
- ffmpeg
- fltk 将 fltk 用作后端(例如 pinentry)
- fluidsynth
- gnome
- gstreamer
- java
- kerberos
- ldap
- libnsl (NIS 支持)
- 第三个实例是
- openblas
- sbl (linux 屏幕阅读器;仅用于安装镜像以缩小 staging)
- selinux
- slp 启用/禁用 SLP 支持 (http://www.openslp.org/)
- utmp 启用/禁用应用程序中的 utmp 和 wtmp 支持
- vnc