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 # beecrypt-devel is required to build RPM.
40 # Packages for usability: nano, grep, less
41 STAGE3_PACKAGES = gcc rpm-build beecrypt-devel nano grep less
43 # Versions of cross-compiled packages.
44 NCURSES_VERSION = 6.0-20160730
46 COREUTILS_VERSION = 8.25
50 BINUTILS_X_VERSION = 2.26
52 UTIL_LINUX_VERSION = 2.28
56 # Needs to match the version of 'file' installed (on host), otherwise:
57 # "Cannot use the installed version of file (xx) to cross-compile file yy"
58 # Also note that 5.25 is definitely broken (segfaults in libmagic:magic_close).
61 BEECRYPT_VERSION = 4.2.1
62 RPM_COMMIT = 95712183458748ea6cafebac1bdd5daa097d9bee
63 RPM_SHORT_COMMIT = 9571218
68 STRACE_COMMIT = f320e1897832fd07a62e18ed288e75d8e79f4c5b
69 STRACE_SHORT_COMMIT = f320e189
73 all: stage1 stage2 stage3 stage4
77 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
78 stage1-riscv-qemu/riscv-qemu.spec \
79 stamp-riscv-qemu-installed \
80 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
81 stage1-riscv-fesvr/riscv-fesvr.spec \
82 stamp-riscv-fesvr-installed \
83 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
84 stage1-riscv-isa-sim/riscv-isa-sim.spec \
85 stamp-riscv-isa-sim-installed
87 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
89 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
92 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
93 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
94 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
98 stamp-riscv-qemu-installed:
100 @rpm -q riscv-qemu >/dev/null || { \
101 echo "ERROR: You must install riscv-qemu:"; \
103 echo " dnf copr enable rjones/riscv"; \
104 echo " dnf install riscv-qemu"; \
106 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
110 @qemu-system-riscv --version || { \
111 echo "ERROR: qemu-system-riscv is not working."; \
112 echo "Make sure you installed the riscv-qemu package."; \
117 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
119 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
122 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
123 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
124 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
128 stamp-riscv-fesvr-installed:
130 @rpm -q riscv-fesvr >/dev/null || { \
131 echo "ERROR: You must install riscv-fesvr:"; \
133 echo " dnf copr enable rjones/riscv"; \
134 echo " dnf install riscv-fesvr"; \
136 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
142 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
144 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
147 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
148 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
149 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
153 stamp-riscv-isa-sim-installed:
155 @rpm -q riscv-isa-sim >/dev/null || { \
156 echo "ERROR: You must install riscv-isa-sim:"; \
158 echo " dnf copr enable rjones/riscv"; \
159 echo " dnf install riscv-isa-sim"; \
161 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
169 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
170 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
171 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
172 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
173 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
174 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
175 stamp-riscv-gnu-toolchain-installed \
176 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
177 stage2-riscv-pk/riscv-pk.spec \
178 stamp-riscv-pk-installed
180 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
182 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
185 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
187 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
190 # GCC 5 no longer compiles with GCC 6 unless we patch it.
191 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
192 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
194 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
196 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
197 tar zcf $@-t gcc-$(GCC_VERSION)
198 rm -r gcc-$(GCC_VERSION)
201 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
203 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
206 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
208 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
211 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
212 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
213 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
214 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
215 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
216 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
217 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
221 stamp-riscv-gnu-toolchain-installed:
223 @rpm -q riscv-gnu-toolchain >/dev/null || { \
224 echo "ERROR: You must install riscv-gnu-toolchain:"; \
226 echo " dnf copr enable rjones/riscv"; \
227 echo " dnf install riscv-gnu-toolchain"; \
229 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
233 @riscv64-unknown-elf-gcc --version || { \
234 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
235 echo "Make sure you installed the riscv-gnu-toolchain package."; \
240 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
242 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
245 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
246 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
247 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
251 stamp-riscv-pk-installed:
253 @rpm -q riscv-pk >/dev/null || { \
254 echo "ERROR: You must install riscv-pk:"; \
256 echo " dnf copr enable rjones/riscv"; \
257 echo " dnf install riscv-pk"; \
259 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
267 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
268 stage3-chroot-original/etc/fedora-release \
269 stage3-chroot/etc/fedora-release \
270 stage3-chroot/lib64/libc.so.6 \
271 stage3-chroot/usr/bin/tic \
272 stage3-chroot/bin/bash \
273 stage3-chroot/bin/ls \
274 stage3-chroot/usr/lib64/libgmp.so.10 \
275 stage3-chroot/usr/lib64/libmpfr.so.4 \
276 stage3-chroot/usr/lib64/libmpc.so.3 \
277 stage3-chroot/usr/bin/as \
278 stage3-chroot/usr/bin/gcc \
279 stage3-chroot/usr/bin/mount \
280 stage3-chroot/usr/bin/tar \
281 stage3-chroot/usr/bin/gzip \
282 stage3-chroot/usr/lib64/libz.so \
283 stage3-chroot/usr/bin/file \
284 stage3-chroot/usr/lib64/libpopt.so \
285 stage3-chroot/usr/lib64/libbeecrypt.so \
286 stage3-chroot/usr/bin/nano \
287 stage3-chroot/usr/bin/grep \
288 stage3-chroot/usr/bin/less \
289 stage3-chroot/usr/bin/strace \
290 stage3-chroot/usr/bin/bzip2 \
291 stage3-chroot/usr/bin/make \
292 stage3-chroot/usr/bin/rpm \
296 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
297 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
298 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
299 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
300 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
303 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
304 git remote add riscv https://github.com/riscv/riscv-linux && \
306 git checkout -f linux-4.1.y-riscv && \
308 make ARCH=riscv defconfig
309 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
310 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
311 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
312 make ARCH=riscv olddefconfig
313 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
314 make ARCH=riscv vmlinux
317 # Build an original (x86-64) chroot using supermin. We then aim to
318 # rebuild (using cross-compiled versions) every ELF binary in this
320 stage3-chroot-original/etc/fedora-release:
321 rm -rf stage3-chroot-original tmp-supermin.d
322 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
323 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
325 @echo -n "Total files in chroot: "
326 @find stage3-chroot-original -type f | wc -l
327 @echo -n "ELF files to be rebuilt: "
328 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
330 # Copy the original chroot to the final chroot, remove all the ELF
332 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
334 cp -a stage3-chroot-original stage3-chroot
335 find stage3-chroot -type d | xargs chmod u+w
336 find stage3-chroot -type f | xargs chmod u+w
337 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
338 rm -f stage3-chroot/lib64/libc.so.6
340 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
341 # copy files and symlinks, leave the target directory structure
343 stage3-chroot/lib64/libc.so.6:
344 mkdir -p stage3-chroot/usr/lib/audit
345 mkdir -p stage3-chroot/usr/lib/gconv
346 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
347 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
349 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
351 # Cross-compile ncurses.
352 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
354 cd ncurses-$(NCURSES_VERSION) && \
355 PATH=$(ROOT)/fixed-gcc:$$PATH \
356 ./configure --host=riscv64-unknown-linux-gnu \
357 --prefix=/usr --libdir=/usr/lib64 \
359 --with-termlib=tinfo \
361 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
362 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
364 ncurses-$(NCURSES_VERSION).tgz:
366 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
369 # Cross-compile bash.
370 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
372 cd bash-$(BASH_VERSION) && \
373 PATH=$(ROOT)/fixed-gcc:$$PATH \
374 ./configure --host=riscv64-unknown-linux-gnu \
375 --prefix=/usr --libdir=/usr/lib64
376 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
377 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
379 bash-$(BASH_VERSION).tar.gz:
381 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
384 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
385 # known-broken and upstream don't care, hence the 'touch' command.
387 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
389 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
390 rm -rf coreutils-$(COREUTILS_VERSION)
392 cd coreutils-$(COREUTILS_VERSION) && \
393 PATH=$(ROOT)/fixed-gcc:$$PATH \
394 ./configure --host=riscv64-unknown-linux-gnu \
395 --prefix=/usr --libdir=/usr/lib64
396 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
397 cd coreutils-$(COREUTILS_VERSION)/man && \
398 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
399 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
400 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
402 coreutils-$(COREUTILS_VERSION).tar.xz:
404 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
407 # Cross-compile binutils.
408 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
409 rm -rf riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)
411 mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
412 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
413 PATH=$(ROOT)/fixed-gcc:$$PATH \
415 --host=riscv64-unknown-linux-gnu \
416 --prefix=/usr --libdir=/usr/lib64
417 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
418 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
420 binutils-$(BINUTILS_X_VERSION).tar.gz:
422 wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
425 # Cross-compile GMP, MPFR and MPC (deps of GCC).
426 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
427 rm -rf gmp-$(GMP_VERSION)
428 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
429 cd gmp-$(GMP_VERSION) && \
430 PATH=$(ROOT)/fixed-gcc:$$PATH \
431 ./configure --host=riscv64-unknown-linux-gnu \
432 --prefix=/usr --libdir=/usr/lib64
433 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
434 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
435 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
437 gmp-$(GMP_VERSION).tar.lz:
439 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
442 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
443 rm -rf mpfr-$(MPFR_VERSION)
444 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
445 cd mpfr-$(MPFR_VERSION) && \
446 PATH=$(ROOT)/fixed-gcc:$$PATH \
447 ./configure --host=riscv64-unknown-linux-gnu \
448 --prefix=/usr --libdir=/usr/lib64 \
449 --with-gmp=$(ROOT)/stage3-chroot/usr
450 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
451 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
452 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
453 rm -f stage3-chroot/usr/lib64/*.la
455 mpfr-$(MPFR_VERSION).tar.gz:
457 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
460 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
461 rm -rf mpc-$(MPC_VERSION)
462 tar -zxf mpc-$(MPC_VERSION).tar.gz
463 cd mpc-$(MPC_VERSION) && \
464 PATH=$(ROOT)/fixed-gcc:$$PATH \
465 ./configure --host=riscv64-unknown-linux-gnu \
466 --prefix=/usr --libdir=/usr/lib64 \
467 --with-gmp=$(ROOT)/stage3-chroot/usr \
468 --with-mpfr=$(ROOT)/stage3-chroot/usr
469 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
470 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
471 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
472 rm -f stage3-chroot/usr/lib64/*.la
474 mpc-$(MPC_VERSION).tar.gz:
476 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
480 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
481 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
483 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
484 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
485 PATH=$(ROOT)/fixed-gcc:$$PATH \
487 --host=riscv64-unknown-linux-gnu \
488 --prefix=/usr --libdir=/usr/lib64 \
491 --enable-languages=c,c++ \
492 --disable-libmudflap \
494 --disable-libquadmath \
497 # XXX use make all & make install here. However building libgcc
498 # fails, see 'broken-gcc.log'.
499 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
500 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
502 gcc-$(GCC_X_VERSION).tar.gz:
504 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
507 # Cross-compile util-linux.
508 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
509 rm -rf util-linux-$(UTIL_LINUX_VERSION)
511 cd util-linux-$(UTIL_LINUX_VERSION) && \
512 PATH=$(ROOT)/fixed-gcc:$$PATH \
513 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
515 --host=riscv64-unknown-linux-gnu \
516 --prefix=/usr --libdir=/usr/lib64 \
519 --disable-makeinstall-chown \
520 --enable-static-programs=mount
521 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
522 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
523 rm -f stage3-chroot/usr/lib64/*.la
525 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
527 wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
530 # Cross-compile GNU tar.
531 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
532 rm -rf tar-$(TAR_VERSION)
534 cd tar-$(TAR_VERSION) && \
535 PATH=$(ROOT)/fixed-gcc:$$PATH \
537 --host=riscv64-unknown-linux-gnu \
538 --prefix=/usr --libdir=/usr/lib64
539 cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
540 cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
542 tar-$(TAR_VERSION).tar.xz:
544 wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
547 # Cross-compile GNU gzip.
548 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
549 rm -rf gzip-$(GZIP_VERSION)
551 cd gzip-$(GZIP_VERSION) && \
552 PATH=$(ROOT)/fixed-gcc:$$PATH \
554 --host=riscv64-unknown-linux-gnu \
555 --prefix=/usr --libdir=/usr/lib64
556 cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
557 cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
559 gzip-$(GZIP_VERSION).tar.gz:
561 wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
564 # Cross-compile zlib.
565 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
566 rm -rf zlib-$(ZLIB_VERSION)
568 cd zlib-$(ZLIB_VERSION) && \
569 PATH=$(ROOT)/fixed-gcc:$$PATH \
570 CC=riscv64-unknown-linux-gnu-gcc \
571 CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
573 --prefix=/usr --libdir=/usr/lib64
574 cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
575 cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
577 zlib-$(ZLIB_VERSION).tar.gz:
579 wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
582 # Cross-compile file/libmagic.
583 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
584 rm -rf file-$(FILE_VERSION)
586 cd file-$(FILE_VERSION) && \
587 PATH=$(ROOT)/fixed-gcc:$$PATH \
588 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
590 --host=riscv64-unknown-linux-gnu \
591 --prefix=/usr --libdir=/usr/lib64 \
592 --disable-static --enable-shared
593 cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
594 cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
595 rm -f stage3-chroot/usr/lib64/*.la
597 file-$(FILE_VERSION).tar.gz:
599 wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
602 # Cross-compile popt.
603 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
604 rm -rf popt-$(POPT_VERSION)
606 cd popt-$(POPT_VERSION) && \
607 PATH=$(ROOT)/fixed-gcc:$$PATH \
608 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
610 --host=riscv64-unknown-linux-gnu \
611 --prefix=/usr --libdir=/usr/lib64 \
612 --disable-static --enable-shared
613 cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
614 cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
615 rm -f stage3-chroot/usr/lib64/*.la
617 popt-$(POPT_VERSION).tar.gz:
619 wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
622 # Cross-compile beecrypt.
623 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
624 rm -rf beecrypt-$(BEECRYPT_VERSION)
626 cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
627 cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
628 cd beecrypt-$(BEECRYPT_VERSION) && \
629 PATH=$(ROOT)/fixed-gcc:$$PATH \
630 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
632 --host=riscv64-unknown-linux-gnu \
633 --prefix=/usr --libdir=/usr/lib64 \
634 --without-cplusplus \
639 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
640 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
641 chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
642 rm -f stage3-chroot/usr/lib64/*.la
644 beecrypt-$(BEECRYPT_VERSION).tar.gz:
646 wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
649 # Cross-compile GNU nano (editor).
650 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
651 rm -rf nano-$(NANO_VERSION)
653 cd nano-$(NANO_VERSION) && \
654 PATH=$(ROOT)/fixed-gcc:$$PATH \
655 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
657 --host=riscv64-unknown-linux-gnu \
658 --prefix=/usr --libdir=/usr/lib64
659 cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
660 cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
662 nano-$(NANO_VERSION).tar.gz:
664 wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
667 # Cross-compile GNU grep.
668 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
669 rm -rf grep-$(GREP_VERSION)
671 cd grep-$(GREP_VERSION) && \
672 PATH=$(ROOT)/fixed-gcc:$$PATH \
674 --host=riscv64-unknown-linux-gnu \
675 --prefix=/usr --libdir=/usr/lib64
676 cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
677 cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
679 grep-$(GREP_VERSION).tar.xz:
681 wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
684 # Cross-compile less.
685 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
686 rm -rf less-$(LESS_VERSION)
688 cd less-$(LESS_VERSION) && \
689 PATH=$(ROOT)/fixed-gcc:$$PATH \
690 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
692 --host=riscv64-unknown-linux-gnu \
693 --prefix=/usr --libdir=/usr/lib64
694 cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
695 cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
697 less-$(LESS_VERSION).tar.gz:
699 wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
702 # Cross-compile strace.
703 # XXX This does not work.
704 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
705 rm -rf strace-$(STRACE_SHORT_COMMIT)
707 cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
708 cd riscv-strace-$(STRACE_COMMIT) && \
709 PATH=$(ROOT)/fixed-gcc:$$PATH \
710 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
712 --host=riscv64-unknown-linux-gnu \
713 --prefix=/usr --libdir=/usr/lib64
714 cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
715 cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
717 strace-$(STRACE_SHORT_COMMIT).tar.gz:
719 wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
722 # Cross-compile bzip2.
723 stage3-chroot/usr/bin/bzip2: bzip2-$(BZIP2_VERSION).tar.gz
724 rm -rf bzip2-$(BZIP2_VERSION)
726 cd bzip2-$(BZIP2_VERSION) && \
727 PATH=$(ROOT)/fixed-gcc:$$PATH \
728 make libbz2.a bzip2 bzip2recover \
730 CC=riscv64-unknown-linux-gnu-gcc \
731 AR=riscv64-unknown-linux-gnu-ar \
732 RANLIB=riscv64-unknown-linux-gnu-ranlib \
733 CFLAGS="-Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -fPIC"
734 cd bzip2-$(BZIP2_VERSION) && \
735 make install PREFIX=$(ROOT)/stage3-chroot/usr
737 bzip2-$(BZIP2_VERSION).tar.gz:
739 wget -O $@-t http://www.bzip.org/1.0.6/bzip2-$(BZIP2_VERSION).tar.gz
742 # Cross-compile GNU make.
743 stage3-chroot/usr/bin/make: make-$(MAKE_VERSION).tar.gz
744 rm -rf make-$(MAKE_VERSION)
746 cd make-$(MAKE_VERSION) && \
747 PATH=$(ROOT)/fixed-gcc:$$PATH \
749 --host=riscv64-unknown-linux-gnu \
750 --prefix=/usr --libdir=/usr/lib64
751 cd make-$(MAKE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
752 cd make-$(MAKE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
754 make-$(MAKE_VERSION).tar.gz:
756 wget -O $@-t https://ftp.gnu.org/gnu/make/make-$(MAKE_VERSION).tar.gz
759 # Cross-compile RPM / rpmbuild.
760 # We build this from a git commit, with a few hacks to the configure
762 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
763 rm -rf rpm-$(RPM_SHORT_COMMIT)
764 tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
765 tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
766 cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
767 cd rpm-$(RPM_SHORT_COMMIT) && \
768 patch -p1 < ../0001-RISCV-64-bit-riscv64-support.patch && \
769 patch -p1 < ../0002-build-fgetc-returns-int-not-char.patch && \
770 patch -p1 < ../0003-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
771 cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
772 cd rpm-$(RPM_SHORT_COMMIT) && \
773 PATH=$(ROOT)/fixed-gcc:$$PATH \
774 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
776 --host=riscv64-unknown-linux-gnu \
777 --prefix=/usr --libdir=/usr/lib64 \
779 --without-libarchive \
783 --without-external-db \
786 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
787 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
788 rm -f stage3-chroot/usr/lib64/*.la
790 rpm-$(RPM_SHORT_COMMIT).tar.gz:
792 wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
795 db-$(BDB_VERSION).tar.gz:
797 wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
800 # Create an /init script.
801 stage3-chroot/init: init.sh
802 install -m 0755 $^ $@
804 # Create the stage3 disk image.
805 # Note `-s +...' adds spare space to the disk image.
806 stage3-disk.img: stage3-chroot
807 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
809 # Upload the compressed disk image.
810 upload-stage3: stage3-disk.img.xz
811 scp $^ tick:public_html/riscv/
812 stage3-disk.img.xz: stage3-disk.img
816 # Helper which boots stage3 disk image in spike.
817 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
818 spike +disk=stage3-disk.img \
819 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
821 # Helper which boots stage3 disk image in qemu.
822 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
823 qemu-system-riscv -kernel /usr/bin/bbl \
824 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
825 -drive file=stage3-disk.img,format=raw -nographic