KDE SC 4 packaging policies
Contents
Package application naming
All application packages (or subpackages) should have exactly the same name as they have in their 'main' package, e.g.:
- okular - Coming from package kdegraphics and splitted
- akregator - Coming from package kdepim and splitted
- konversation - Coming from their own package konversation
Library policy
Every library should be split in a package with proper soname. There is a common complain to have too many subpackages, but this is just a excuse for laziness. Some reasons behind splits:
- Developers need to change soname and binary api. If we a have library inside a package, upgrade would be hard
- Legacy applications should need the library only, no the whole package. If we decide to install an application like akregator only, there is no reason to have the whole kdepim package installed
- Development packages can require only library subpackages, not the whole package.
Package should not require libraries explicitly. Rpmbuild in ROSA sets all necessary dependencies automatically.
How does this look like in a spec file following the standard ROSA style?
%define kfoo_major 1 %define libkfoo %mklibname kfoo %{kfoo_major} %package -n %libkfoo Summary: Kfoo library Group: System/Libraries %description -n %libkfoo Kfoo library. %files -n %libkfoo %defattr(-,root,roo,-) %_kde_libdir/libkfoo.so.%{kfoo_major}*
- Should not need ldconfig
- Must go together with main application subpackage, not split into separate library package
Patch policy
Every patch for a kde package MUST have this header :
# # Description: # Forwarded: # Bug: # Author: #
Basic requires for every common KDE 4 application
- kdelibs4-devel
Configure and building with one line ( be free from auto*hell )
Since start of KDE 4, the cmake build utility was adopted. Cmake is a good easy text base build utility that provides common ways to make out of the source buildings. With kde4-macros package, we provide a common framework to make the most complex build in kde4 easy.
So, to build a kde4 package, you will need just this in %build section:
%build %cmake_kde4 %make
If you need debug packages, just define _with_debug=1 in the rpm command line or bm. We strongly recommend use bm tool to build your specs.
bm -l --define _with_debug=1
SPEC defines provided by kde4-macros
Macro | Value | Description |
---|---|---|
%_kde_prefix | /usr | Main prefix for kde applications |
%_kde_libdir | %_kde_prefix/%_lib | Library directory |
%_kde_iconsdir | %_kde_prefix/share/icons | Icons directory |
%_kde_sysconfdir | %_sysconfdir | System configuration directory |
%_kde_datadir | %_kde_prefix/share | Common data dir for kde |
%_kde_configdir | %_kde_datadir/config | kde config dir |
%_kde_appsdir | %_kde_datadir/apps | Application specific dir |
%_kde_docdir | %_kde_prefix/share/doc | Documentation dir |
%_kde_bindir | %_kde_prefix/bin | Binary dir |
%_kde_sbindir | %_kde_prefix/sbin | SBinary dir |
%_kde_includedir | %_kde_prefix/include | Include dir |
%_kde_mandir | %_kde_prefix/share/man | Man dir for kde |
%_kde_autostart | %_kde_prefix/share/autostart | Autostart |
%_kde_services | %_kde_prefix/share/kde4/services | Sycoca services |
kde_servicetypes | %_kde_prefix/share/kde4/servicetypes | Service mimes |
SPEC Layout
This is kind of controversial for many old school packagers, but the nested layout style was adopted since some time and proves to be more efficient in big packages for edit. The basic idea is, all subpackages have all related entries nested in one block on their spec, instead of havin all definitions, then all descriptions, then all post/postun sections then the files sections. In the template below we show an package kmanyfoo, which have two apps and one library.
Template
Name: kmanyfoo Summary: K Desktop Environment Version: 4.0.70 Group: Graphical desktop/KDE License: GPL URL: http://www.kde.org Release: 1 Source:· ftp://ftp.kde.org/pub/kde/stable/%version/src/kfoo-%version.tar.bz2 BuildRequires: kdelibs4-devel BuildRequires: desktop-file-utils Requires: kfooblue Requires: kfoored %description - kmanyfoo is a kfoo metapackage for all kfoo applications # we let the files section empty or with a README to assure package is generated. # If the main package is just a convenience main description and don't need a meta pack, we even don't need this section %files #------------------------------------------------------ %package kfooblue Summary: KFoo Blue package Group: Graphical desktop/KDE %descriton kfooblue KFoo Blue package %files kfooblue %defattr(-,root,root,-) %_kde_bindir/kfooblue %_kde_libdir/kde4/bluemodule.so %_kde_appsdir/kfooblue # You don't need made all iconspaths explicit, use glob %_kde_iconsdir/*/*/*/kfooblue.* #------------------------------------------------------ %package kfoored Summary: KFoo RED package Group: Graphical desktop/KDE %descriton kfoored KFoo RED package %files kfoored %defattr(-,root,root,-) %_kde_bindir/kfoored # You don't need made all iconspaths explicit, use glob %_kde_iconsdir/*/*/*/kfoored.* %_kde_servicesdir/kfoored.desktop #------------------------------------------------------ %define kfoo_major 1 %define libkfoo %mklibname kfoo %{kfoo_major} %package -n %libkfoo Summary: Kfoo library Group: System/Libraries %description -n %libkfoo Kfoo library. %post -n %libkfoo -p /sbin/ldconfig %postun -n %libkfoo -p /sbin/ldconfig %files -n %libkfoo %defattr(-,root,root,-) %_kde_libdir/libkfoo.so.%{kfoo_major}* #------------------------------------------------------ %prep %setup -q %build %cmake_kde4 %make %install rm -fr %buildroot make -C build DESTDIR=%buildroot install %check for f in %{buildroot}%{_kde_datadir}/applications/kde4/*.desktop ; do desktop-file-validate $f done