1 # Refer to the README file to understand how Fedora on RISC-V is
4 # Absolute path to the current directory.
7 # Note these are chosen very specifically to ensure the different
8 # versions work together. Don't blindly update to the latest
10 # https://github.com/riscv/riscv-pk/issues/18#issuecomment-206115996
11 RISCV_QEMU_COMMIT = 94f5eb73091fb4fe272db3e943f173ecc0f78ffd
12 RISCV_QEMU_SHORTCOMMIT = 94f5eb73
13 RISCV_FESVR_COMMIT = 0f34d7ad311f78455a674224225f5b3056efba1d
14 RISCV_FESVR_SHORTCOMMIT = 0f34d7ad
15 RISCV_ISA_SIM_COMMIT = 3bfc00ef2a1b1f0b0472a39a866261b00f67027e
16 RISCV_ISA_SIM_SHORTCOMMIT = 3bfc00ef
17 RISCV_GNU_TOOLCHAIN_COMMIT = 728afcddcb0526a0f6560c4032da82805f054d58
18 RISCV_GNU_TOOLCHAIN_SHORTCOMMIT = 728afcdd
19 RISCV_PK_COMMIT = 85ae17aa149b9ea114bdd70cc30ea7e73813fb48
20 RISCV_PK_SHORTCOMMIT = 85ae17aa
22 # For the correct versions, see
23 # riscv-gnu-toolchain/Makefile.in *_version variables
24 BINUTILS_VERSION = 2.25.1
27 NEWLIB_VERSION = 2.2.0
29 # See linux-4.1.y-riscv branch of
30 # https://github.com/riscv/riscv-linux
31 KERNEL_VERSION = 4.1.26
33 # A local copy of Linux git repo so you don't have to keep downloading
34 # git commits (optional).
35 LOCAL_LINUX_GIT_COPY = $(HOME)/d/linux
37 # The root packages (plus their dependencies) that we want to
38 # cross-compile into the stage 3 chroot.
39 STAGE3_PACKAGES = gcc rpm-build
41 # Versions of cross-compiled packages.
42 NCURSES_VERSION = 6.0-20160730
44 COREUTILS_VERSION = 8.25
50 all: stage1 stage2 stage3 stage4
54 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
55 stage1-riscv-qemu/riscv-qemu.spec \
56 stamp-riscv-qemu-installed \
57 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
58 stage1-riscv-fesvr/riscv-fesvr.spec \
59 stamp-riscv-fesvr-installed \
60 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
61 stage1-riscv-isa-sim/riscv-isa-sim.spec \
62 stamp-riscv-isa-sim-installed
64 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
66 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
69 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
70 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
71 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
75 stamp-riscv-qemu-installed:
77 @rpm -q riscv-qemu >/dev/null || { \
78 echo "ERROR: You must install riscv-qemu:"; \
80 echo " dnf copr enable rjones/riscv"; \
81 echo " dnf install riscv-qemu"; \
83 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
87 @qemu-system-riscv --version || { \
88 echo "ERROR: qemu-system-riscv is not working."; \
89 echo "Make sure you installed the riscv-qemu package."; \
94 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
96 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
99 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
100 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
101 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
105 stamp-riscv-fesvr-installed:
107 @rpm -q riscv-fesvr >/dev/null || { \
108 echo "ERROR: You must install riscv-fesvr:"; \
110 echo " dnf copr enable rjones/riscv"; \
111 echo " dnf install riscv-fesvr"; \
113 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
119 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
121 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
124 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
125 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
126 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
130 stamp-riscv-isa-sim-installed:
132 @rpm -q riscv-isa-sim >/dev/null || { \
133 echo "ERROR: You must install riscv-isa-sim:"; \
135 echo " dnf copr enable rjones/riscv"; \
136 echo " dnf install riscv-isa-sim"; \
138 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
146 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
147 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
148 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
149 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
150 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
151 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
152 stamp-riscv-gnu-toolchain-installed \
153 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
154 stage2-riscv-pk/riscv-pk.spec \
155 stamp-riscv-pk-installed
157 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
159 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
162 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
164 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
167 # GCC 5 no longer compiles with GCC 6 unless we patch it.
168 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
169 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
171 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
173 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
174 tar zcf $@-t gcc-$(GCC_VERSION)
175 rm -r gcc-$(GCC_VERSION)
178 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
180 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
183 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
185 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
188 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
189 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
190 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
191 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
192 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
193 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
194 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
198 stamp-riscv-gnu-toolchain-installed:
200 @rpm -q riscv-gnu-toolchain >/dev/null || { \
201 echo "ERROR: You must install riscv-gnu-toolchain:"; \
203 echo " dnf copr enable rjones/riscv"; \
204 echo " dnf install riscv-gnu-toolchain"; \
206 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
210 @riscv64-unknown-elf-gcc --version || { \
211 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
212 echo "Make sure you installed the riscv-gnu-toolchain package."; \
217 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
219 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
222 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
223 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
224 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
228 stamp-riscv-pk-installed:
230 @rpm -q riscv-pk >/dev/null || { \
231 echo "ERROR: You must install riscv-pk:"; \
233 echo " dnf copr enable rjones/riscv"; \
234 echo " dnf install riscv-pk"; \
236 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
244 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
245 stage3-chroot-original/etc/fedora-release \
246 stage3-chroot/etc/fedora-release \
247 stage3-chroot/lib64/libc.so.6 \
248 stage3-chroot/usr/bin/tic \
249 stage3-chroot/bin/bash \
250 stage3-chroot/bin/ls \
251 stage3-chroot/usr/lib64/libgmp.so.10 \
252 stage3-chroot/usr/lib64/libmpfr.so.4 \
253 stage3-chroot/usr/lib64/libmpc.so.3 \
254 stage3-chroot/usr/bin/gcc \
258 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
259 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
260 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
261 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
262 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
265 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
266 git remote add riscv https://github.com/riscv/riscv-linux && \
268 git checkout -f linux-4.1.y-riscv && \
270 make ARCH=riscv defconfig
271 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
272 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
273 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
274 make ARCH=riscv olddefconfig
275 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
276 make ARCH=riscv vmlinux
279 # Build an original (x86-64) chroot using supermin. We then aim to
280 # rebuild (using cross-compiled versions) every ELF binary in this
282 stage3-chroot-original/etc/fedora-release:
283 rm -rf stage3-chroot-original tmp-supermin.d
284 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
285 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
287 @echo -n "Total files in chroot: "
288 @find stage3-chroot-original -type f | wc -l
289 @echo -n "ELF files to be rebuilt: "
290 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
292 # Copy the original chroot to the final chroot, remove all the ELF
294 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
296 cp -a stage3-chroot-original stage3-chroot
297 find stage3-chroot -type d | xargs chmod u+w
298 find stage3-chroot -type f | xargs chmod u+w
299 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
300 rm -f stage3-chroot/lib64/libc.so.6
302 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
303 # copy files and symlinks, leave the target directory structure
305 stage3-chroot/lib64/libc.so.6:
306 mkdir -p stage3-chroot/usr/lib/audit
307 mkdir -p stage3-chroot/usr/lib/gconv
308 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
309 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
311 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
313 # Cross-compile ncurses.
314 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
316 cd ncurses-$(NCURSES_VERSION) && \
317 PATH=$(ROOT)/fixed-gcc:$$PATH \
318 ./configure --host=riscv64-unknown-linux-gnu \
319 --prefix=/usr --libdir=/usr/lib64 \
321 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
322 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
323 cd $(ROOT)/stage3-chroot/usr/lib64 && ln -sf libtinfo.so.6 libtinfo.so
325 ncurses-$(NCURSES_VERSION).tgz:
327 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
330 # Cross-compile bash.
331 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
333 cd bash-$(BASH_VERSION) && \
334 PATH=$(ROOT)/fixed-gcc:$$PATH \
335 ./configure --host=riscv64-unknown-linux-gnu \
336 --prefix=/usr --libdir=/usr/lib64
337 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
338 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
340 bash-$(BASH_VERSION).tar.gz:
342 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
345 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
346 # known-broken and upstream don't care, hence the 'touch' command.
348 COREUTILS_PROGRAMS = arch base32 base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false fmt fold ginstall groups head hostid hostname id install join kill link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf sleep sort split stat stdbuf stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink uptime users vdir wc who whoami yes
350 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
351 rm -rf coreutils-$(COREUTILS_VERSION)
353 cd coreutils-$(COREUTILS_VERSION) && \
354 PATH=$(ROOT)/fixed-gcc:$$PATH \
355 ./configure --host=riscv64-unknown-linux-gnu \
356 --prefix=/usr --libdir=/usr/lib64
357 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
358 cd coreutils-$(COREUTILS_VERSION)/man && \
359 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
360 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
361 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
363 coreutils-$(COREUTILS_VERSION).tar.xz:
365 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
368 # Cross-compile GMP, MPFR and MPC (deps of GCC).
369 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
370 rm -rf gmp-$(GMP_VERSION)
371 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
372 cd gmp-$(GMP_VERSION) && \
373 PATH=$(ROOT)/fixed-gcc:$$PATH \
374 ./configure --host=riscv64-unknown-linux-gnu \
375 --prefix=/usr --libdir=/usr/lib64
376 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
377 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
378 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
380 gmp-$(GMP_VERSION).tar.lz:
382 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
385 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
386 rm -rf mpfr-$(MPFR_VERSION)
387 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
388 cd mpfr-$(MPFR_VERSION) && \
389 PATH=$(ROOT)/fixed-gcc:$$PATH \
390 ./configure --host=riscv64-unknown-linux-gnu \
391 --prefix=/usr --libdir=/usr/lib64 \
392 --with-gmp=$(ROOT)/stage3-chroot/usr
393 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
394 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
395 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
397 mpfr-$(MPFR_VERSION).tar.gz:
399 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
402 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
403 rm -rf mpc-$(MPC_VERSION)
404 tar -zxf mpc-$(MPC_VERSION).tar.gz
405 cd mpc-$(MPC_VERSION) && \
406 PATH=$(ROOT)/fixed-gcc:$$PATH \
407 ./configure --host=riscv64-unknown-linux-gnu \
408 --prefix=/usr --libdir=/usr/lib64 \
409 --with-gmp=$(ROOT)/stage3-chroot/usr \
410 --with-mpfr=$(ROOT)/stage3-chroot/usr
411 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
412 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
413 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
415 mpc-$(MPC_VERSION).tar.gz:
417 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
421 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
422 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
424 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
425 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
426 PATH=$(ROOT)/fixed-gcc:$$PATH \
428 --host=riscv64-unknown-linux-gnu \
429 --prefix=/usr --libdir=/usr/lib64 \
432 --enable-languages=c,c++ \
433 --disable-libmudflap \
435 --disable-libquadmath \
438 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
439 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
441 gcc-$(GCC_X_VERSION).tar.gz:
443 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
446 # Create an /init script.
447 stage3-chroot/init: init.sh
448 install -m 0755 $^ $@
450 # Create the stage3 disk image.
451 # Note `-s +...' adds spare space to the disk image.
452 stage3-disk.img: stage3-chroot
453 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
455 # Upload the compressed disk image.
456 upload-stage3: stage3-disk.img.xz
457 scp $^ tick:public_html/riscv/
458 stage3-disk.img.xz: stage3-disk.img
462 # Helper which boots stage3 disk image in spike.
463 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
464 spike +disk=stage3-disk.img \
465 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
467 # Helper which boots stage3 disk image in qemu.
468 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
469 qemu-system-riscv -kernel /usr/bin/bbl \
470 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
471 -drive file=stage3-disk.img,format=raw -nographic