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
48 BINUTILS_X_VERSION = 2.26
50 UTIL_LINUX_VERSION = 2.28
54 # Needs to match the installed (on host) version, otherwise:
55 # "Cannot use the installed version of file (xx) to cross-compile file yy"
59 all: stage1 stage2 stage3 stage4
63 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
64 stage1-riscv-qemu/riscv-qemu.spec \
65 stamp-riscv-qemu-installed \
66 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
67 stage1-riscv-fesvr/riscv-fesvr.spec \
68 stamp-riscv-fesvr-installed \
69 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
70 stage1-riscv-isa-sim/riscv-isa-sim.spec \
71 stamp-riscv-isa-sim-installed
73 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
75 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
78 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
79 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
80 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
84 stamp-riscv-qemu-installed:
86 @rpm -q riscv-qemu >/dev/null || { \
87 echo "ERROR: You must install riscv-qemu:"; \
89 echo " dnf copr enable rjones/riscv"; \
90 echo " dnf install riscv-qemu"; \
92 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
96 @qemu-system-riscv --version || { \
97 echo "ERROR: qemu-system-riscv is not working."; \
98 echo "Make sure you installed the riscv-qemu package."; \
103 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
105 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
108 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
109 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
110 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
114 stamp-riscv-fesvr-installed:
116 @rpm -q riscv-fesvr >/dev/null || { \
117 echo "ERROR: You must install riscv-fesvr:"; \
119 echo " dnf copr enable rjones/riscv"; \
120 echo " dnf install riscv-fesvr"; \
122 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
128 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
130 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
133 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
134 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
135 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
139 stamp-riscv-isa-sim-installed:
141 @rpm -q riscv-isa-sim >/dev/null || { \
142 echo "ERROR: You must install riscv-isa-sim:"; \
144 echo " dnf copr enable rjones/riscv"; \
145 echo " dnf install riscv-isa-sim"; \
147 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
155 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
156 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
157 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
158 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
159 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
160 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
161 stamp-riscv-gnu-toolchain-installed \
162 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
163 stage2-riscv-pk/riscv-pk.spec \
164 stamp-riscv-pk-installed
166 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
168 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
171 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
173 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
176 # GCC 5 no longer compiles with GCC 6 unless we patch it.
177 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
178 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
180 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
182 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
183 tar zcf $@-t gcc-$(GCC_VERSION)
184 rm -r gcc-$(GCC_VERSION)
187 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
189 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
192 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
194 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
197 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
198 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
199 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
200 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
201 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
202 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
203 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
207 stamp-riscv-gnu-toolchain-installed:
209 @rpm -q riscv-gnu-toolchain >/dev/null || { \
210 echo "ERROR: You must install riscv-gnu-toolchain:"; \
212 echo " dnf copr enable rjones/riscv"; \
213 echo " dnf install riscv-gnu-toolchain"; \
215 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
219 @riscv64-unknown-elf-gcc --version || { \
220 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
221 echo "Make sure you installed the riscv-gnu-toolchain package."; \
226 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
228 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
231 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
232 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
233 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
237 stamp-riscv-pk-installed:
239 @rpm -q riscv-pk >/dev/null || { \
240 echo "ERROR: You must install riscv-pk:"; \
242 echo " dnf copr enable rjones/riscv"; \
243 echo " dnf install riscv-pk"; \
245 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
253 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
254 stage3-chroot-original/etc/fedora-release \
255 stage3-chroot/etc/fedora-release \
256 stage3-chroot/lib64/libc.so.6 \
257 stage3-chroot/usr/bin/tic \
258 stage3-chroot/bin/bash \
259 stage3-chroot/bin/ls \
260 stage3-chroot/usr/lib64/libgmp.so.10 \
261 stage3-chroot/usr/lib64/libmpfr.so.4 \
262 stage3-chroot/usr/lib64/libmpc.so.3 \
263 stage3-chroot/usr/bin/as \
264 stage3-chroot/usr/bin/gcc \
265 stage3-chroot/usr/bin/mount \
266 stage3-chroot/usr/bin/tar \
267 stage3-chroot/usr/bin/gzip \
268 stage3-chroot/usr/lib64/libz.so \
269 stage3-chroot/usr/bin/file \
270 stage3-chroot/usr/lib64/libpopt.so \
274 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
275 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
276 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
277 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
278 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
281 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
282 git remote add riscv https://github.com/riscv/riscv-linux && \
284 git checkout -f linux-4.1.y-riscv && \
286 make ARCH=riscv defconfig
287 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
288 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
289 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
290 make ARCH=riscv olddefconfig
291 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
292 make ARCH=riscv vmlinux
295 # Build an original (x86-64) chroot using supermin. We then aim to
296 # rebuild (using cross-compiled versions) every ELF binary in this
298 stage3-chroot-original/etc/fedora-release:
299 rm -rf stage3-chroot-original tmp-supermin.d
300 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
301 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
303 @echo -n "Total files in chroot: "
304 @find stage3-chroot-original -type f | wc -l
305 @echo -n "ELF files to be rebuilt: "
306 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
308 # Copy the original chroot to the final chroot, remove all the ELF
310 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
312 cp -a stage3-chroot-original stage3-chroot
313 find stage3-chroot -type d | xargs chmod u+w
314 find stage3-chroot -type f | xargs chmod u+w
315 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
316 rm -f stage3-chroot/lib64/libc.so.6
318 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
319 # copy files and symlinks, leave the target directory structure
321 stage3-chroot/lib64/libc.so.6:
322 mkdir -p stage3-chroot/usr/lib/audit
323 mkdir -p stage3-chroot/usr/lib/gconv
324 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
325 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
327 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
329 # Cross-compile ncurses.
330 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
332 cd ncurses-$(NCURSES_VERSION) && \
333 PATH=$(ROOT)/fixed-gcc:$$PATH \
334 ./configure --host=riscv64-unknown-linux-gnu \
335 --prefix=/usr --libdir=/usr/lib64 \
337 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
338 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
339 cd $(ROOT)/stage3-chroot/usr/lib64 && ln -sf libtinfo.so.6 libtinfo.so
341 ncurses-$(NCURSES_VERSION).tgz:
343 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
346 # Cross-compile bash.
347 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
349 cd bash-$(BASH_VERSION) && \
350 PATH=$(ROOT)/fixed-gcc:$$PATH \
351 ./configure --host=riscv64-unknown-linux-gnu \
352 --prefix=/usr --libdir=/usr/lib64
353 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
354 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
356 bash-$(BASH_VERSION).tar.gz:
358 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
361 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
362 # known-broken and upstream don't care, hence the 'touch' command.
364 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
366 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
367 rm -rf coreutils-$(COREUTILS_VERSION)
369 cd coreutils-$(COREUTILS_VERSION) && \
370 PATH=$(ROOT)/fixed-gcc:$$PATH \
371 ./configure --host=riscv64-unknown-linux-gnu \
372 --prefix=/usr --libdir=/usr/lib64
373 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
374 cd coreutils-$(COREUTILS_VERSION)/man && \
375 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
376 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
377 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
379 coreutils-$(COREUTILS_VERSION).tar.xz:
381 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
384 # Cross-compile binutils.
385 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
386 rm -rf binutils-$(BINUTILS_X_VERSION)
388 mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
389 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
390 PATH=$(ROOT)/fixed-gcc:$$PATH \
392 --host=riscv64-unknown-linux-gnu \
393 --prefix=/usr --libdir=/usr/lib64
394 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
395 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
397 binutils-$(BINUTILS_X_VERSION).tar.gz:
399 wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
402 # Cross-compile GMP, MPFR and MPC (deps of GCC).
403 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
404 rm -rf gmp-$(GMP_VERSION)
405 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
406 cd gmp-$(GMP_VERSION) && \
407 PATH=$(ROOT)/fixed-gcc:$$PATH \
408 ./configure --host=riscv64-unknown-linux-gnu \
409 --prefix=/usr --libdir=/usr/lib64
410 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
411 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
412 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
414 gmp-$(GMP_VERSION).tar.lz:
416 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
419 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
420 rm -rf mpfr-$(MPFR_VERSION)
421 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
422 cd mpfr-$(MPFR_VERSION) && \
423 PATH=$(ROOT)/fixed-gcc:$$PATH \
424 ./configure --host=riscv64-unknown-linux-gnu \
425 --prefix=/usr --libdir=/usr/lib64 \
426 --with-gmp=$(ROOT)/stage3-chroot/usr
427 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
428 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
429 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
431 mpfr-$(MPFR_VERSION).tar.gz:
433 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
436 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
437 rm -rf mpc-$(MPC_VERSION)
438 tar -zxf mpc-$(MPC_VERSION).tar.gz
439 cd mpc-$(MPC_VERSION) && \
440 PATH=$(ROOT)/fixed-gcc:$$PATH \
441 ./configure --host=riscv64-unknown-linux-gnu \
442 --prefix=/usr --libdir=/usr/lib64 \
443 --with-gmp=$(ROOT)/stage3-chroot/usr \
444 --with-mpfr=$(ROOT)/stage3-chroot/usr
445 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
446 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
447 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
449 mpc-$(MPC_VERSION).tar.gz:
451 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
455 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
456 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
458 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
459 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
460 PATH=$(ROOT)/fixed-gcc:$$PATH \
462 --host=riscv64-unknown-linux-gnu \
463 --prefix=/usr --libdir=/usr/lib64 \
466 --enable-languages=c,c++ \
467 --disable-libmudflap \
469 --disable-libquadmath \
472 # XXX use make all & make install here. However building libgcc
473 # fails, see 'broken-gcc.log'.
474 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
475 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
477 gcc-$(GCC_X_VERSION).tar.gz:
479 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
482 # Cross-compile util-linux.
483 # XXX Be nice to fix ncurses/tinfo support which in theory should work.
484 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
485 rm -rf util-linux-$(UTIL_LINUX_VERSION)
487 cd util-linux-$(UTIL_LINUX_VERSION) && \
488 PATH=$(ROOT)/fixed-gcc:$$PATH \
490 --host=riscv64-unknown-linux-gnu \
491 --prefix=/usr --libdir=/usr/lib64 \
496 --disable-makeinstall-chown
497 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
498 # libtool fucks something up here, ignore the failure and continue.
499 -cd util-linux-$(UTIL_LINUX_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot -j1 -k V=1
501 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
503 wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
506 # Cross-compile GNU tar.
507 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
508 rm -rf tar-$(TAR_VERSION)
510 cd tar-$(TAR_VERSION) && \
511 PATH=$(ROOT)/fixed-gcc:$$PATH \
513 --host=riscv64-unknown-linux-gnu \
514 --prefix=/usr --libdir=/usr/lib64
515 cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
516 cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
518 tar-$(TAR_VERSION).tar.xz:
520 wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
523 # Cross-compile GNU gzip.
524 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
525 rm -rf gzip-$(GZIP_VERSION)
527 cd gzip-$(GZIP_VERSION) && \
528 PATH=$(ROOT)/fixed-gcc:$$PATH \
530 --host=riscv64-unknown-linux-gnu \
531 --prefix=/usr --libdir=/usr/lib64
532 cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
533 cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
535 gzip-$(GZIP_VERSION).tar.gz:
537 wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
540 # Cross-compile zlib.
541 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
542 rm -rf zlib-$(ZLIB_VERSION)
544 cd zlib-$(ZLIB_VERSION) && \
545 PATH=$(ROOT)/fixed-gcc:$$PATH \
546 CC=riscv64-unknown-linux-gnu-gcc \
547 CFLAGS="-I/home/rjones/d/fedora-riscv/stage3-chroot/usr/include -L/home/rjones/d/fedora-riscv/stage3-chroot/usr/lib" \
549 --prefix=/usr --libdir=/usr/lib64
550 cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
551 cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
553 zlib-$(ZLIB_VERSION).tar.gz:
555 wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
558 # Cross-compile file/libmagic.
559 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
560 rm -rf file-$(FILE_VERSION)
562 cd file-$(FILE_VERSION) && \
563 PATH=$(ROOT)/fixed-gcc:$$PATH \
564 LDFLAGS=-L/home/rjones/d/fedora-riscv/stage3-chroot/usr/lib64 \
566 --host=riscv64-unknown-linux-gnu \
567 --prefix=/usr --libdir=/usr/lib64 \
568 --disable-static --enable-shared
569 cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
570 cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
572 file-$(FILE_VERSION).tar.gz:
574 wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
577 # Cross-compile popt.
578 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
579 rm -rf popt-$(POPT_VERSION)
581 cd popt-$(POPT_VERSION) && \
582 PATH=$(ROOT)/fixed-gcc:$$PATH \
583 LDFLAGS=-L/home/rjones/d/fedora-riscv/stage3-chroot/usr/lib64 \
585 --host=riscv64-unknown-linux-gnu \
586 --prefix=/usr --libdir=/usr/lib64 \
587 --disable-static --enable-shared
588 cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
589 cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
591 popt-$(POPT_VERSION).tar.gz:
593 wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
596 # Create an /init script.
597 stage3-chroot/init: init.sh
598 install -m 0755 $^ $@
600 # Create the stage3 disk image.
601 # Note `-s +...' adds spare space to the disk image.
602 stage3-disk.img: stage3-chroot
603 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
605 # Upload the compressed disk image.
606 upload-stage3: stage3-disk.img.xz
607 scp $^ tick:public_html/riscv/
608 stage3-disk.img.xz: stage3-disk.img
612 # Helper which boots stage3 disk image in spike.
613 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
614 spike +disk=stage3-disk.img \
615 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
617 # Helper which boots stage3 disk image in qemu.
618 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
619 qemu-system-riscv -kernel /usr/bin/bbl \
620 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
621 -drive file=stage3-disk.img,format=raw -nographic