It seems this it’s already 8 of this 10 part series of using GCC with openSUSE. This time topic is: RPM. RPM started as Redhat Package Manager and then it involved to RPM package manager (self explaining acronym like GNU). RPM packages are just files containing all the needed stuff to install application, font or something else in to openSUSE system.
RPM is currently wide adopted in Linux distributions openSUSE, embedded Yocto, Fedora and Madriva for name few. Although Yocto can use Debian packages also as base. I have been using an example program to show how to develop very easy application with openSUSE and GCC. Currently it uses Autotools tools. Take my advise your application is not worth of anything if you can’t delivery it to users. Most of the applications (especially closed source) under Linux are distributed as tar-ball format. RPM is not about having Windows style setup it’s about knowing what is installed in you system.
RPM agnostics
There is actually two kinds of RPMs. Binary RPM and then there is Source RPM. Source RPM contains everything needed to compile this package again. Source rpm ending is ‘.src.rpm’ or ‘nosrc.rpm’. Binary RPM is architecture specific. So if you have ‘arm7v.rpm’ it wont run your x86_64 or x86 machine because it’s ARM7 binary code. There is also noarch.rpm that is architectural non specific.
In openSUSE traditionally if you build RPM it goes to ‘/usr/src/packages’ directory and there is sub directories
BUILD/ - Building is done here SOURCES/ - Contains needed sources for building including patches SRPMS/ - Where Source RPMS are placed after build BUILDROOT/ - This is ROOT place where make install places installed files (because you don't want them to go real root dir) RPMS/ - All the RPMs are placed here (It contains i686, x86_64 and noarch subdirs where those arch files are placed) SPECS/ - Where .spec files are placed
So if you build i686 RPM with your x86 openSUSE then it would go to ‘/usr/src/packages/RPMS/i686’ directory and Source RPM ‘/usr/src/packages/SRPMS’ directory.
Example
Now you should read Part 7 and part 6 of this series to have example application and autotools installed. then we install rpm-build
zypper install rpm-build
and make distribution tar-ball of sdl_displaybitmap with
make dist
there should be ‘sdl_displaybitmap-1.0.tar.bz2’ file now in same directory. then copy this SPEC file to file named ‘sdl_displaybitmap.spec’ in same directory you have ‘sdl_displaybitmap-1.0.tar.bz2’
Name: sdl_displaybitmap Version: 1.0 Release: 1%{?dist} Summary: Some SDL Sample Group: Amusements/Toys/Other License: SUSE-Public-Domain URL: http://content.gpwiki.org/index.php/SDL:Tutorials:Displaying_a_Bitmap Source0: sdl_displaybitmap-1.0.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: gcc BuildRequires: SDL_image-devel BuildRequires: libtool BuildRequires: automake BuildRequires: autoconf %description Small example how to use SDL to display bitmap %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT # There is nothing to install so we do it with hand #make install DESTDIR=$RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_bindir} mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name} cp SDL_DisplayBitmap $RPM_BUILD_ROOT%{_bindir} chmod +x $RPM_BUILD_ROOT%{_bindir}/* cp image.bmp $RPM_BUILD_ROOT%{_datadir}/%{name} %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc LICENSE.TXT %{_bindir} %dir %{_datadir}/%{name} %{_datadir}/%{name}/* %changelog
and copy our tar-ball to ‘/usr/src/packages/SOURCES’. After that we build rpmbuild command to create RPM packages
rpmbuild -ba sdl_displaybitmap.spec
If everything goes right you should have this RPM in ‘/usr/src/packages/RPMS/YOURARCHHERE/sdl_displaybitmap-1.0-1.YOURARCHHERE.rpm’ and SRPM in ‘/usr/src/packages/SRPMS/sdl_displaybitmap-1.0-1.src.rpm’. You can check with less that what files it contains
less /usr/src/packages/RPMS/YOURARCHHERE/sdl_displaybitmap-1.0-1.YOURARCHHERE.rpm
OBS If you install this RPM it won’t work! Application only works if you go to folder ‘/usr/share/sdl_displaybitmap’ and run it there. Next time we patch our app to work from other places also.
What does this mean?
There is better documentation else where than I can write. For openSUSE conventions see Packaging in Wiki. If you curious read it from there and learn. Next time we make OBS (openSUSE Build Service) build from this RPM and last part is how we use OBS to create also Debian, Ubuntu and Fedora packages from our marvelous app.
Both comments and pings are currently closed.