From Fedora Project Wiki

< Architectures‎ | RISC-V

Revision as of 12:52, 6 September 2016 by Rjones (talk | contribs) (Manually building packages in stage3)

All about bootstrapping Fedora on RISC-V.


We are currently building RPMs using the stage3 environment, using the rpmbuild command on RISC-V (under qemu emulation). This is step (4a) in the README.

We aim to build just enough userspace RPMs so that we can:

  • create a stage4 environment which is cleanly built from only RPMs
  • the stage4 environment will be able to run gcc and rpmbuild
  • the stage4 environment will (later) be used to build all future RPMs

Some packages require non-upstream patches for RISC-V. Currently these are:

  • kernel (we are not building this as an RPM yet because there is no bootloader that could use it)
  • glibc
  • binutils
  • gcc

Some packages require modifications to the spec file to reduce extraneous dependencies, disable tests, hacks and so on. The aim is to reduce and eliminate these changes in stage4, but they are OK for now in stage3 RPMs.

noarch RPMs do not need to be rebuilt. They can just be copied over from Koji.


All built RPMs are added to the stage3-built-rpms/ subdirectory of git, with the SRPM so we can reproduce the build.

Manually building packages in stage3

The stage3 environment can be built from source or you can download a snapshot binary image. See above for links to git etc.

Pick a package which:

  • has very few dependencies
  • is written in C or C++
  • is part of Fedora @Core

Grab the source RPM from the F25 branch in Koji or dist-git. Note you must use the F25 branch, because otherwise Perl doesn't work.

fedpkg clone -B the_package
cd the_package/f25
# make changes to spec file if you want
fedpkg srpm

Copy the source RPM into the stage3 disk image. The disk image must not be running when you do this:

virt-copy-in -a stage3-disk.img the_package.src.rpm /var/tmp/

Boot the disk image in qemu:

make boot-stage3-in-qemu

Inside the VM you may need to install some of the RPMs we have already built. Almost certainly you'll need make and bash:

rpm -Uvh /rpmbuild/RPMS/riscv64/{bash,make}-*.rpm --nodeps

Inside the VM you can now "install" the source RPM, which makes it available under /rpmbuild:

rpm -i /var/tmp/the_package.src.rpm
cd /rpmbuild/SPECS

You may need to disable hardened build and debuginfo by adding:

%global debug_package %{nil}
%undefine _hardened_build

to the spec file. Use vim to edit files.

You can now try building the package:

rpmbuild -ba the_package.spec --nodeps

If it builds successfully, brilliant! More usually this will require many cycles of debugging and fixing things. Removing dependencies or parts of the spec file is an option for these stage3 builds.

If you get a build, it will be in /rpmbuild inside the VM. sync and shut down the VM, then do:

virt-copy-out -a stage3-disk.img /rpmbuild ./

and the files will be downloaded to ./SRPMS and ./RPMS in the current directory. Note: Keep the source RPM too, especially if you modified it.

Add notes to the section below. Also come to #fedora-riscv and discuss where to put your built packages.

Notes on typical bugs etc

"all-recursive" bug in make

Making all in .
Makefile:742: recipe for target 'all-recursive' failed

This is a bug in either the cross-compiled make or the cross-compiled bash. It is fixed by the natively compiled make and/or bash, so to fix it just run the following command from within the stage3 environment:

rpm -ivh /rpmbuild/RPMS/riscv64/bash-* /rpmbuild/RPMS/riscv64/make-* --nodeps

debugedit missing

Use %global debug_package %{nil} (temporarily for stage3, in stage4 we will attempt to build the debuginfo packages).

bugs about locking, random "Permission denied"

Update to the latest riscv-gnu-toolchain and rebuild the kernel from the repo. All known locking bugs have been fixed.

Build hangs

We fixed an infinite loop bug in kernel memory allocation. Make sure your kernel is up to date.