Build from Source
DNF has the capability to download the source code.
Then we can utilize other tool to build from source.
Consider choose herbstluftwm
as our guinea pig example.
I was wondering how DNF handle source code,
and I finally figure out a generic steps,
from the very nice fedora Community in Google Plus .
Let me quote form “Johan Heikkilä”:
Dnf has capability to install source packages, as long as they are available in the installed/enabled repositories. It is recommended to do the following steps as user and not as root.
In this example:
I actually alter the steps a bit for clarity.
And I still use root for simplicity. It is just docker experience anyway.
Using herbstluftwm as an example case
General Requirement
We require to install rpm-build
$ dnf install rpm-build
Last metadata expiration check: 0:25:14 ago on Sun Sep 3 02:01:23 2017.
Dependencies resolved.
====================================================================
Package Arch Version Repository
Size
====================================================================
Installing:
rpm-build x86_64 4.13.90-0.git14002.7.fc28 rawhide 158 k
Upgrading:
python3-rpm x86_64 4.13.90-0.git14002.7.fc28 rawhide 115 k
rpm x86_64 4.13.90-0.git14002.7.fc28 rawhide 528 k
...
xz x86_64 5.2.3-4.fc27 rawhide 150 k
zip x86_64 3.0-20.fc27 rawhide 270 k
Transaction Summary
====================================================================
Install 35 Packages
Upgrade 6 Packages
Total download size: 17 M
Is this ok [ y/N]:
Downloading Packages:
( 1/41) : bzip2-1.0.6-24.fc27.x86_64.rpm 44 kB/s | 58 kB 00:01
...
-----------------------------------------------------------------------------
Total 565 kB/s | 17 MB 00:30
...
Running transaction
Preparing : 1/1
Upgrading : rpm-plugin-selinux-4.13.90-0.git14002.7.fc28.x8 1/47
...
Installed:
rpm-build.x86_64 4.13.90-0.git14002.7.fc28
...
Upgraded:
python3-rpm.x86_64 4.13.90-0.git14002.7.fc28
rpm.x86_64 4.13.90-0.git14002.7.fc28
rpm-build-libs.x86_64 4.13.90-0.git14002.7.fc28
...
Complete!
And also these toolchain.
$ dnf install gcc make
Download
Now consider using home directory.
cd ~
Since we have already enable rawhide-source
,
we can directly download.
$ dnf download --source herbstluftwm
Fedora - Rawhide - Developmental pa 840 kB/s | 66 MB 01:20
Last metadata expiration check: 0:01:12 ago on Sun Sep 3 01:53:48 2017.
herbstluftwm-0.6.2-8.fc27.src.rpm 84 kB/s | 228 kB 00:02
or use --enablerepo
and --source
instead.
$ dnf --enablerepo rawhide download --source herbstluftwm
We need to extract the previously downloaded package
to ~/rpmbuild
directory.
As you can see below, there are warnings for using root.
For real system, please do not use root.
$ rpm -ivh herbstluftwm-0.6.2-8.fc27.src.rpm
warning: herbstluftwm-0.6.2-8.fc27.src.rpm: Header V3 RSA/SHA256 Signature, key ID 9db62fb1: NOKEY
Updating / installing...
1:herbstluftwm-0.6.2-8.fc27
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
################################# [100%]
Now we have two directories inside.
$ ls rpmbuild/
SOURCES SPECS
Dependencies
Since the case is Herbstluftwm,
we also need require to install these packages
to avoid missing dependencies.
$ dnf builddep ~/rpmbuild/SPECS/herbstluftwm.spec
Last metadata expiration check: 2:39:31 ago on Wed Sep 20 14:19:59 2017.
Dependencies resolved.
====================================================================
Package Arch Version Repository
Size
====================================================================
Installing:
glib2-devel x86_64 2.54.0-1.fc28 rawhide 453 k
libX11-devel x86_64 1.6.5-4.fc27 rawhide 984 k
libXinerama-devel x86_64 1.1.3-9.fc27 rawhide 17 k
Installing dependencies:
libX11-xcb x86_64 1.6.5-4.fc27 rawhide 22 k
libXau-devel x86_64 1.0.8-9.fc27 rawhide 18 k
libXext-devel x86_64 1.3.3-7.fc27 rawhide 79 k
libxcb-devel x86_64 1.12-5.fc27 rawhide 1.0 M
pcre-cpp x86_64 8.41-1.fc27.2 rawhide 41 k
pcre-devel x86_64 8.41-1.fc27.2 rawhide 548 k
pcre-utf16 x86_64 8.41-1.fc27.2 rawhide 190 k
pcre-utf32 x86_64 8.41-1.fc27.2 rawhide 181 k
xorg-x11-proto-devel noarch 7.7-23.fc27 rawhide 287 k
Transaction Summary
====================================================================
Install 12 Packages
Total download size: 3.8 M
Installed size: 10 M
Is this ok [ y/N]:
Build
Consider get in to ~/rpmbuild/SPECS
to build.
$ cd ./rpmbuild/SPECS
$ rpmbuild -ba herbstluftwm.spec
...
Executing( %clean) : /bin/sh -e /var/tmp/rpm-tmp.jys9eY
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd herbstluftwm-0.6.2
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/herbstluftwm-0.6.2-8.fc28.x86_64
+ exit 0
Consider going back to ~/rpmbuild
directory.
Now we can see additional directories inside as built result.
$ ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
And the build output result
$ ls ~/rpmbuild/RPMS/x86_64
herbstluftwm-0.6.2-8.fc28.x86_64.rpm
herbstluftwm-debuginfo-0.6.2-8.fc28.x86_64.rpm
herbstluftwm-debugsource-0.6.2-8.fc28.x86_64.rpm
Install
Now we can install the previously built rpm.
$ rpm -iv ~/rpmbuild/RPMS/x86_64/herbstluftwm-0.6.2-8.fc28.x86_64.rpm
Preparing packages...
herbstluftwm-0.6.2-8.fc28.x86_64
Using Mock
There are also Mock solution. But it is beyond this scope.
Thank You
I respect the help from community.
Again, thank you.
Inspect Package
Often we need to inspect .rpm
package.
No need any dnf
command,
as this more like an rpm
issue.
$ dnf install rpmlint rpmdevtools
...
Installing:
rpmdevtools noarch 8.10-3.fc27 rawhide 105 k
rpmlint noarch 1.10-3.fc28 rawhide 189 k
...
rpmlint
Check for possible issue, similar to lintian or namcap.
$ rpmlint ~/rpmbuild/RPMS/x86_64/herbstluftwm-0.6.2-8.fc28.x86_64.rpm
herbstluftwm.x86_64: W: spelling-error %description -l en_US subframes -> sub frames, sub-frames, frames
herbstluftwm.x86_64: W: spelling-error %description -l en_US workspaces -> work spaces, work-spaces, works paces
herbstluftwm.x86_64: W: spelling-error %description -l en_US runtime -> run time , run-time, rudiment
herbstluftwm.x86_64: W: spelling-error %description -l en_US ipc -> pic, inc
herbstluftwm.x86_64: W: spelling-error %description -l en_US startup -> start up, start-up, upstart
herbstluftwm.x86_64: W: only-non-binary-in-usr-lib
1 packages and 0 specfiles checked; 0 errors, 6 warnings.
rpm -Qpl
You can also query file -Qpl
directly to the .rpm
package.
$ rpm -qpl ~/rpmbuild/RPMS/x86_64/herbstluftwm-0.6.2-8.fc28.x86_64.rpm
/etc/xdg/herbstluftwm
/etc/xdg/herbstluftwm/autostart
/etc/xdg/herbstluftwm/panel.sh
/etc/xdg/herbstluftwm/restartpanels.sh
/usr/bin/herbstclient
/usr/bin/herbstluftwm
/usr/lib/.build-id
/usr/lib/.build-id/3d
/usr/lib/.build-id/3d/0a8089936f6a6836c973eafe14d619b086c60a
/usr/lib/.build-id/da
...
rpmls
Or use the rpmls
from the rpmdevtools
package
$ rpmls ~/rpmbuild/RPMS/x86_64/herbstluftwm-0.6.2-8.fc28.x86_64.rpm
drwxr-xr-x /etc/xdg/herbstluftwm
-rwxr-xr-x /etc/xdg/herbstluftwm/autostart
-rwxr-xr-x /etc/xdg/herbstluftwm/panel.sh
-rwxr-xr-x /etc/xdg/herbstluftwm/restartpanels.sh
-rwxr-xr-x /usr/bin/herbstclient
-rwxr-xr-x /usr/bin/herbstluftwm
drwxr-xr-x /usr/lib/.build-id
drwxr-xr-x /usr/lib/.build-id/3d
lrwxrwxrwx /usr/lib/.build-id/3d/0a8089936f6a6836c973eafe14d619b086c60a
...
rpm2cpio
This one also extract.
$ rpm2cpio ~/rpmbuild/RPMS/x86_64/herbstluftwm-0.6.2-8.fc28.x86_64.rpm | cpio -vid
./etc/xdg/herbstluftwm
./etc/xdg/herbstluftwm/autostart
./etc/xdg/herbstluftwm/panel.sh
./etc/xdg/herbstluftwm/restartpanels.sh
./usr/bin/herbstclient
./usr/bin/herbstluftwm
./usr/lib/.build-id
./usr/lib/.build-id/3d
./usr/lib/.build-id/3d/0a8089936f6a6836c973eafe14d619b086c60a
./usr/lib/.build-id/da
...
Conclusion
These are just preliminary knowledge about DNF.
Thank you for reading