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 installed (on host) version, otherwise:
57 # "Cannot use the installed version of file (xx) to cross-compile file yy"
60 BEECRYPT_VERSION = 4.2.1
61 RPM_COMMIT = 95712183458748ea6cafebac1bdd5daa097d9bee
62 RPM_SHORT_COMMIT = 9571218
67 STRACE_COMMIT = f320e1897832fd07a62e18ed288e75d8e79f4c5b
68 STRACE_SHORT_COMMIT = f320e189
71 all: stage1 stage2 stage3 stage4
75 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
76 stage1-riscv-qemu/riscv-qemu.spec \
77 stamp-riscv-qemu-installed \
78 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
79 stage1-riscv-fesvr/riscv-fesvr.spec \
80 stamp-riscv-fesvr-installed \
81 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
82 stage1-riscv-isa-sim/riscv-isa-sim.spec \
83 stamp-riscv-isa-sim-installed
85 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
87 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
90 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
91 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
92 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
96 stamp-riscv-qemu-installed:
98 @rpm -q riscv-qemu >/dev/null || { \
99 echo "ERROR: You must install riscv-qemu:"; \
101 echo " dnf copr enable rjones/riscv"; \
102 echo " dnf install riscv-qemu"; \
104 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
108 @qemu-system-riscv --version || { \
109 echo "ERROR: qemu-system-riscv is not working."; \
110 echo "Make sure you installed the riscv-qemu package."; \
115 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
117 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
120 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
121 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
122 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
126 stamp-riscv-fesvr-installed:
128 @rpm -q riscv-fesvr >/dev/null || { \
129 echo "ERROR: You must install riscv-fesvr:"; \
131 echo " dnf copr enable rjones/riscv"; \
132 echo " dnf install riscv-fesvr"; \
134 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
140 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
142 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
145 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
146 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
147 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
151 stamp-riscv-isa-sim-installed:
153 @rpm -q riscv-isa-sim >/dev/null || { \
154 echo "ERROR: You must install riscv-isa-sim:"; \
156 echo " dnf copr enable rjones/riscv"; \
157 echo " dnf install riscv-isa-sim"; \
159 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
167 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
168 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
169 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
170 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
171 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
172 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
173 stamp-riscv-gnu-toolchain-installed \
174 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
175 stage2-riscv-pk/riscv-pk.spec \
176 stamp-riscv-pk-installed
178 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
180 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
183 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
185 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
188 # GCC 5 no longer compiles with GCC 6 unless we patch it.
189 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
190 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
192 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
194 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
195 tar zcf $@-t gcc-$(GCC_VERSION)
196 rm -r gcc-$(GCC_VERSION)
199 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
201 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
204 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
206 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
209 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
210 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
211 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
212 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
213 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
214 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
215 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
219 stamp-riscv-gnu-toolchain-installed:
221 @rpm -q riscv-gnu-toolchain >/dev/null || { \
222 echo "ERROR: You must install riscv-gnu-toolchain:"; \
224 echo " dnf copr enable rjones/riscv"; \
225 echo " dnf install riscv-gnu-toolchain"; \
227 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
231 @riscv64-unknown-elf-gcc --version || { \
232 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
233 echo "Make sure you installed the riscv-gnu-toolchain package."; \
238 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
240 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
243 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
244 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
245 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
249 stamp-riscv-pk-installed:
251 @rpm -q riscv-pk >/dev/null || { \
252 echo "ERROR: You must install riscv-pk:"; \
254 echo " dnf copr enable rjones/riscv"; \
255 echo " dnf install riscv-pk"; \
257 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
265 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
266 stage3-chroot-original/etc/fedora-release \
267 stage3-chroot/etc/fedora-release \
268 stage3-chroot/lib64/libc.so.6 \
269 stage3-chroot/usr/bin/tic \
270 stage3-chroot/bin/bash \
271 stage3-chroot/bin/ls \
272 stage3-chroot/usr/lib64/libgmp.so.10 \
273 stage3-chroot/usr/lib64/libmpfr.so.4 \
274 stage3-chroot/usr/lib64/libmpc.so.3 \
275 stage3-chroot/usr/bin/as \
276 stage3-chroot/usr/bin/gcc \
277 stage3-chroot/usr/bin/mount \
278 stage3-chroot/usr/bin/tar \
279 stage3-chroot/usr/bin/gzip \
280 stage3-chroot/usr/lib64/libz.so \
281 stage3-chroot/usr/bin/file \
282 stage3-chroot/usr/lib64/libpopt.so \
283 stage3-chroot/usr/lib64/libbeecrypt.so \
284 stage3-chroot/usr/bin/rpm \
285 stage3-chroot/usr/bin/nano \
286 stage3-chroot/usr/bin/grep \
287 stage3-chroot/usr/bin/less \
288 stage3-chroot/usr/bin/strace \
289 stage3-chroot/usr/bin/bzip2 \
293 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
294 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
295 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
296 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
297 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
300 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
301 git remote add riscv https://github.com/riscv/riscv-linux && \
303 git checkout -f linux-4.1.y-riscv && \
305 make ARCH=riscv defconfig
306 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
307 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
308 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
309 make ARCH=riscv olddefconfig
310 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
311 make ARCH=riscv vmlinux
314 # Build an original (x86-64) chroot using supermin. We then aim to
315 # rebuild (using cross-compiled versions) every ELF binary in this
317 stage3-chroot-original/etc/fedora-release:
318 rm -rf stage3-chroot-original tmp-supermin.d
319 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
320 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
322 @echo -n "Total files in chroot: "
323 @find stage3-chroot-original -type f | wc -l
324 @echo -n "ELF files to be rebuilt: "
325 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
327 # Copy the original chroot to the final chroot, remove all the ELF
329 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
331 cp -a stage3-chroot-original stage3-chroot
332 find stage3-chroot -type d | xargs chmod u+w
333 find stage3-chroot -type f | xargs chmod u+w
334 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
335 rm -f stage3-chroot/lib64/libc.so.6
337 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
338 # copy files and symlinks, leave the target directory structure
340 stage3-chroot/lib64/libc.so.6:
341 mkdir -p stage3-chroot/usr/lib/audit
342 mkdir -p stage3-chroot/usr/lib/gconv
343 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
344 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
346 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
348 # Cross-compile ncurses.
349 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
351 cd ncurses-$(NCURSES_VERSION) && \
352 PATH=$(ROOT)/fixed-gcc:$$PATH \
353 ./configure --host=riscv64-unknown-linux-gnu \
354 --prefix=/usr --libdir=/usr/lib64 \
356 --with-termlib=tinfo \
358 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
359 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
361 ncurses-$(NCURSES_VERSION).tgz:
363 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
366 # Cross-compile bash.
367 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
369 cd bash-$(BASH_VERSION) && \
370 PATH=$(ROOT)/fixed-gcc:$$PATH \
371 ./configure --host=riscv64-unknown-linux-gnu \
372 --prefix=/usr --libdir=/usr/lib64
373 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
374 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
376 bash-$(BASH_VERSION).tar.gz:
378 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
381 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
382 # known-broken and upstream don't care, hence the 'touch' command.
384 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
386 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
387 rm -rf coreutils-$(COREUTILS_VERSION)
389 cd coreutils-$(COREUTILS_VERSION) && \
390 PATH=$(ROOT)/fixed-gcc:$$PATH \
391 ./configure --host=riscv64-unknown-linux-gnu \
392 --prefix=/usr --libdir=/usr/lib64
393 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
394 cd coreutils-$(COREUTILS_VERSION)/man && \
395 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
396 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
397 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
399 coreutils-$(COREUTILS_VERSION).tar.xz:
401 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
404 # Cross-compile binutils.
405 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
406 rm -rf riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)
408 mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
409 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
410 PATH=$(ROOT)/fixed-gcc:$$PATH \
412 --host=riscv64-unknown-linux-gnu \
413 --prefix=/usr --libdir=/usr/lib64
414 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
415 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
417 binutils-$(BINUTILS_X_VERSION).tar.gz:
419 wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
422 # Cross-compile GMP, MPFR and MPC (deps of GCC).
423 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
424 rm -rf gmp-$(GMP_VERSION)
425 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
426 cd gmp-$(GMP_VERSION) && \
427 PATH=$(ROOT)/fixed-gcc:$$PATH \
428 ./configure --host=riscv64-unknown-linux-gnu \
429 --prefix=/usr --libdir=/usr/lib64
430 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
431 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
432 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
434 gmp-$(GMP_VERSION).tar.lz:
436 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
439 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
440 rm -rf mpfr-$(MPFR_VERSION)
441 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
442 cd mpfr-$(MPFR_VERSION) && \
443 PATH=$(ROOT)/fixed-gcc:$$PATH \
444 ./configure --host=riscv64-unknown-linux-gnu \
445 --prefix=/usr --libdir=/usr/lib64 \
446 --with-gmp=$(ROOT)/stage3-chroot/usr
447 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
448 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
449 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
450 rm -f stage3-chroot/usr/lib64/*.la
452 mpfr-$(MPFR_VERSION).tar.gz:
454 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
457 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
458 rm -rf mpc-$(MPC_VERSION)
459 tar -zxf mpc-$(MPC_VERSION).tar.gz
460 cd mpc-$(MPC_VERSION) && \
461 PATH=$(ROOT)/fixed-gcc:$$PATH \
462 ./configure --host=riscv64-unknown-linux-gnu \
463 --prefix=/usr --libdir=/usr/lib64 \
464 --with-gmp=$(ROOT)/stage3-chroot/usr \
465 --with-mpfr=$(ROOT)/stage3-chroot/usr
466 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
467 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
468 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
469 rm -f stage3-chroot/usr/lib64/*.la
471 mpc-$(MPC_VERSION).tar.gz:
473 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
477 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
478 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
480 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
481 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
482 PATH=$(ROOT)/fixed-gcc:$$PATH \
484 --host=riscv64-unknown-linux-gnu \
485 --prefix=/usr --libdir=/usr/lib64 \
488 --enable-languages=c,c++ \
489 --disable-libmudflap \
491 --disable-libquadmath \
494 # XXX use make all & make install here. However building libgcc
495 # fails, see 'broken-gcc.log'.
496 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
497 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
499 gcc-$(GCC_X_VERSION).tar.gz:
501 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
504 # Cross-compile util-linux.
505 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
506 rm -rf util-linux-$(UTIL_LINUX_VERSION)
508 cd util-linux-$(UTIL_LINUX_VERSION) && \
509 PATH=$(ROOT)/fixed-gcc:$$PATH \
510 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
512 --host=riscv64-unknown-linux-gnu \
513 --prefix=/usr --libdir=/usr/lib64 \
516 --disable-makeinstall-chown \
517 --enable-static-programs=mount
518 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
519 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
520 rm -f stage3-chroot/usr/lib64/*.la
522 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
524 wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
527 # Cross-compile GNU tar.
528 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
529 rm -rf tar-$(TAR_VERSION)
531 cd tar-$(TAR_VERSION) && \
532 PATH=$(ROOT)/fixed-gcc:$$PATH \
534 --host=riscv64-unknown-linux-gnu \
535 --prefix=/usr --libdir=/usr/lib64
536 cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
537 cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
539 tar-$(TAR_VERSION).tar.xz:
541 wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
544 # Cross-compile GNU gzip.
545 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
546 rm -rf gzip-$(GZIP_VERSION)
548 cd gzip-$(GZIP_VERSION) && \
549 PATH=$(ROOT)/fixed-gcc:$$PATH \
551 --host=riscv64-unknown-linux-gnu \
552 --prefix=/usr --libdir=/usr/lib64
553 cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
554 cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
556 gzip-$(GZIP_VERSION).tar.gz:
558 wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
561 # Cross-compile zlib.
562 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
563 rm -rf zlib-$(ZLIB_VERSION)
565 cd zlib-$(ZLIB_VERSION) && \
566 PATH=$(ROOT)/fixed-gcc:$$PATH \
567 CC=riscv64-unknown-linux-gnu-gcc \
568 CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
570 --prefix=/usr --libdir=/usr/lib64
571 cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
572 cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
574 zlib-$(ZLIB_VERSION).tar.gz:
576 wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
579 # Cross-compile file/libmagic.
580 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
581 rm -rf file-$(FILE_VERSION)
583 cd file-$(FILE_VERSION) && \
584 PATH=$(ROOT)/fixed-gcc:$$PATH \
585 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
587 --host=riscv64-unknown-linux-gnu \
588 --prefix=/usr --libdir=/usr/lib64 \
589 --disable-static --enable-shared
590 cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
591 cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
592 rm -f stage3-chroot/usr/lib64/*.la
594 file-$(FILE_VERSION).tar.gz:
596 wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
599 # Cross-compile popt.
600 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
601 rm -rf popt-$(POPT_VERSION)
603 cd popt-$(POPT_VERSION) && \
604 PATH=$(ROOT)/fixed-gcc:$$PATH \
605 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
607 --host=riscv64-unknown-linux-gnu \
608 --prefix=/usr --libdir=/usr/lib64 \
609 --disable-static --enable-shared
610 cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
611 cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
612 rm -f stage3-chroot/usr/lib64/*.la
614 popt-$(POPT_VERSION).tar.gz:
616 wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
619 # Cross-compile beecrypt.
620 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
621 rm -rf beecrypt-$(BEECRYPT_VERSION)
623 cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
624 cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
625 cd beecrypt-$(BEECRYPT_VERSION) && \
626 PATH=$(ROOT)/fixed-gcc:$$PATH \
627 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
629 --host=riscv64-unknown-linux-gnu \
630 --prefix=/usr --libdir=/usr/lib64 \
631 --without-cplusplus \
636 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
637 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
638 chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
639 rm -f stage3-chroot/usr/lib64/*.la
641 beecrypt-$(BEECRYPT_VERSION).tar.gz:
643 wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
646 # Cross-compile RPM / rpmbuild.
647 # We build this from a git commit, with a few hacks to the configure
649 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
650 rm -rf rpm-$(RPM_SHORT_COMMIT)
651 tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
652 tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
653 cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
654 cd rpm-$(RPM_SHORT_COMMIT) && \
655 patch -p1 < ../0001-RISCV-64-bit-riscv64-support.patch && \
656 patch -p1 < ../0002-build-fgetc-returns-int-not-char.patch && \
657 patch -p1 < ../0003-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
658 cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
659 cd rpm-$(RPM_SHORT_COMMIT) && \
660 PATH=$(ROOT)/fixed-gcc:$$PATH \
661 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
663 --host=riscv64-unknown-linux-gnu \
664 --prefix=/usr --libdir=/usr/lib64 \
666 --without-libarchive \
670 --without-external-db \
673 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
674 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
675 rm -f stage3-chroot/usr/lib64/*.la
677 rpm-$(RPM_SHORT_COMMIT).tar.gz:
679 wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
682 db-$(BDB_VERSION).tar.gz:
684 wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
687 # Cross-compile GNU nano (editor).
688 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
689 rm -rf nano-$(NANO_VERSION)
691 cd nano-$(NANO_VERSION) && \
692 PATH=$(ROOT)/fixed-gcc:$$PATH \
693 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
695 --host=riscv64-unknown-linux-gnu \
696 --prefix=/usr --libdir=/usr/lib64
697 cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
698 cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
700 nano-$(NANO_VERSION).tar.gz:
702 wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
705 # Cross-compile GNU grep.
706 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
707 rm -rf grep-$(GREP_VERSION)
709 cd grep-$(GREP_VERSION) && \
710 PATH=$(ROOT)/fixed-gcc:$$PATH \
712 --host=riscv64-unknown-linux-gnu \
713 --prefix=/usr --libdir=/usr/lib64
714 cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
715 cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
717 grep-$(GREP_VERSION).tar.xz:
719 wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
722 # Cross-compile less.
723 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
724 rm -rf less-$(LESS_VERSION)
726 cd less-$(LESS_VERSION) && \
727 PATH=$(ROOT)/fixed-gcc:$$PATH \
728 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
730 --host=riscv64-unknown-linux-gnu \
731 --prefix=/usr --libdir=/usr/lib64
732 cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
733 cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
735 less-$(LESS_VERSION).tar.gz:
737 wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
740 # Cross-compile strace.
741 # XXX This does not work.
742 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
743 rm -rf strace-$(STRACE_SHORT_COMMIT)
745 cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
746 cd riscv-strace-$(STRACE_COMMIT) && \
747 PATH=$(ROOT)/fixed-gcc:$$PATH \
748 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
750 --host=riscv64-unknown-linux-gnu \
751 --prefix=/usr --libdir=/usr/lib64
752 cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
753 cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
755 strace-$(STRACE_SHORT_COMMIT).tar.gz:
757 wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
760 # Cross-compile bzip2.
761 stage3-chroot/usr/bin/bzip2: bzip2-$(BZIP2_VERSION).tar.gz
762 rm -rf bzip2-$(BZIP2_VERSION)
764 cd bzip2-$(BZIP2_VERSION) && \
765 PATH=$(ROOT)/fixed-gcc:$$PATH \
766 make libbz2.a bzip2 bzip2recover \
768 CC=riscv64-unknown-linux-gnu-gcc \
769 AR=riscv64-unknown-linux-gnu-ar \
770 RANLIB=riscv64-unknown-linux-gnu-ranlib
771 cd bzip2-$(BZIP2_VERSION) && \
772 make install PREFIX=$(ROOT)/stage3-chroot/usr
774 bzip2-$(BZIP2_VERSION).tar.gz:
776 wget -O $@-t http://www.bzip.org/1.0.6/bzip2-$(BZIP2_VERSION).tar.gz
779 # Create an /init script.
780 stage3-chroot/init: init.sh
781 install -m 0755 $^ $@
783 # Create the stage3 disk image.
784 # Note `-s +...' adds spare space to the disk image.
785 stage3-disk.img: stage3-chroot
786 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
788 # Upload the compressed disk image.
789 upload-stage3: stage3-disk.img.xz
790 scp $^ tick:public_html/riscv/
791 stage3-disk.img.xz: stage3-disk.img
795 # Helper which boots stage3 disk image in spike.
796 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
797 spike +disk=stage3-disk.img \
798 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
800 # Helper which boots stage3 disk image in qemu.
801 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
802 qemu-system-riscv -kernel /usr/bin/bbl \
803 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
804 -drive file=stage3-disk.img,format=raw -nographic