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
72 DIFFUTILS_VERSION = 3.4
73 FINDUTILS_VERSION = 4.6.0
76 HOSTNAME_VERSION = 3.15
78 all: stage1 stage2 stage3 stage4
82 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
83 stage1-riscv-qemu/riscv-qemu.spec \
84 stamp-riscv-qemu-installed \
85 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
86 stage1-riscv-fesvr/riscv-fesvr.spec \
87 stamp-riscv-fesvr-installed \
88 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
89 stage1-riscv-isa-sim/riscv-isa-sim.spec \
90 stamp-riscv-isa-sim-installed
92 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
94 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
97 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
98 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
99 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
103 stamp-riscv-qemu-installed:
105 @rpm -q riscv-qemu >/dev/null || { \
106 echo "ERROR: You must install riscv-qemu:"; \
108 echo " dnf copr enable rjones/riscv"; \
109 echo " dnf install riscv-qemu"; \
111 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
115 @qemu-system-riscv --version || { \
116 echo "ERROR: qemu-system-riscv is not working."; \
117 echo "Make sure you installed the riscv-qemu package."; \
122 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
124 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
127 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
128 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
129 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
133 stamp-riscv-fesvr-installed:
135 @rpm -q riscv-fesvr >/dev/null || { \
136 echo "ERROR: You must install riscv-fesvr:"; \
138 echo " dnf copr enable rjones/riscv"; \
139 echo " dnf install riscv-fesvr"; \
141 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
147 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
149 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
152 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
153 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
154 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
158 stamp-riscv-isa-sim-installed:
160 @rpm -q riscv-isa-sim >/dev/null || { \
161 echo "ERROR: You must install riscv-isa-sim:"; \
163 echo " dnf copr enable rjones/riscv"; \
164 echo " dnf install riscv-isa-sim"; \
166 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
174 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
175 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
176 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
177 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
178 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
179 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
180 stamp-riscv-gnu-toolchain-installed \
181 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
182 stage2-riscv-pk/riscv-pk.spec \
183 stamp-riscv-pk-installed
185 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
187 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
190 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
192 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
195 # GCC 5 no longer compiles with GCC 6 unless we patch it.
196 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
197 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
199 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
201 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
202 tar zcf $@-t gcc-$(GCC_VERSION)
203 rm -r gcc-$(GCC_VERSION)
206 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
208 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
211 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
213 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
216 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
217 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
218 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
219 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
220 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
221 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
222 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
226 stamp-riscv-gnu-toolchain-installed:
228 @rpm -q riscv-gnu-toolchain >/dev/null || { \
229 echo "ERROR: You must install riscv-gnu-toolchain:"; \
231 echo " dnf copr enable rjones/riscv"; \
232 echo " dnf install riscv-gnu-toolchain"; \
234 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
238 @riscv64-unknown-elf-gcc --version || { \
239 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
240 echo "Make sure you installed the riscv-gnu-toolchain package."; \
245 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
247 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
250 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
251 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
252 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
256 stamp-riscv-pk-installed:
258 @rpm -q riscv-pk >/dev/null || { \
259 echo "ERROR: You must install riscv-pk:"; \
261 echo " dnf copr enable rjones/riscv"; \
262 echo " dnf install riscv-pk"; \
264 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
272 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
273 stage3-chroot-original/etc/fedora-release \
274 stage3-chroot/etc/fedora-release \
275 stage3-chroot/lib64/libc.so.6 \
276 stage3-chroot/usr/bin/tic \
277 stage3-chroot/bin/bash \
278 stage3-chroot/bin/ls \
279 stage3-chroot/usr/lib64/libgmp.so.10 \
280 stage3-chroot/usr/lib64/libmpfr.so.4 \
281 stage3-chroot/usr/lib64/libmpc.so.3 \
282 stage3-chroot/usr/bin/as \
283 stage3-chroot/usr/bin/gcc \
284 stage3-chroot/usr/bin/mount \
285 stage3-chroot/usr/bin/tar \
286 stage3-chroot/usr/bin/gzip \
287 stage3-chroot/usr/lib64/libz.so \
288 stage3-chroot/usr/bin/file \
289 stage3-chroot/usr/lib64/libpopt.so \
290 stage3-chroot/usr/lib64/libbeecrypt.so \
291 stage3-chroot/usr/bin/nano \
292 stage3-chroot/usr/bin/grep \
293 stage3-chroot/usr/bin/less \
294 stage3-chroot/usr/bin/strace \
295 stage3-chroot/usr/bin/bzip2 \
296 stage3-chroot/usr/bin/make \
297 stage3-chroot/usr/bin/diff \
298 stage3-chroot/usr/bin/find \
299 stage3-chroot/usr/bin/sed \
300 stage3-chroot/usr/bin/patch \
301 stage3-chroot/usr/bin/hostname \
302 stage3-chroot/usr/bin/rpm \
306 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
307 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
308 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
309 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
310 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
313 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
314 git remote add riscv https://github.com/riscv/riscv-linux && \
316 git checkout -f linux-4.1.y-riscv && \
318 make ARCH=riscv defconfig
319 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
320 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
321 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
322 make ARCH=riscv olddefconfig
323 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
324 make ARCH=riscv vmlinux
327 # Build an original (x86-64) chroot using supermin. We then aim to
328 # rebuild (using cross-compiled versions) every ELF binary in this
330 stage3-chroot-original/etc/fedora-release:
331 rm -rf stage3-chroot-original tmp-supermin.d
332 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
333 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
335 @echo -n "Total files in chroot: "
336 @find stage3-chroot-original -type f | wc -l
337 @echo -n "ELF files to be rebuilt: "
338 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
340 # Copy the original chroot to the final chroot, remove all the ELF
342 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
344 cp -a stage3-chroot-original stage3-chroot
345 find stage3-chroot -type d | xargs chmod u+w
346 find stage3-chroot -type f | xargs chmod u+w
347 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
348 rm -f stage3-chroot/lib64/libc.so.6
350 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
351 # copy files and symlinks, leave the target directory structure
353 stage3-chroot/lib64/libc.so.6:
354 mkdir -p stage3-chroot/usr/lib/audit
355 mkdir -p stage3-chroot/usr/lib/gconv
356 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
357 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
359 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
361 # Cross-compile ncurses.
362 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
364 cd ncurses-$(NCURSES_VERSION) && \
365 PATH=$(ROOT)/fixed-gcc:$$PATH \
366 ./configure --host=riscv64-unknown-linux-gnu \
367 --prefix=/usr --libdir=/usr/lib64 \
369 --with-termlib=tinfo \
371 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
372 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
374 ncurses-$(NCURSES_VERSION).tgz:
376 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
379 # Cross-compile bash.
380 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
382 cd bash-$(BASH_VERSION) && \
383 PATH=$(ROOT)/fixed-gcc:$$PATH \
384 ./configure --host=riscv64-unknown-linux-gnu \
385 --prefix=/usr --libdir=/usr/lib64
386 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
387 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
389 bash-$(BASH_VERSION).tar.gz:
391 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
394 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
395 # known-broken and upstream don't care, hence the 'touch' command.
397 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
399 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
400 rm -rf coreutils-$(COREUTILS_VERSION)
402 cd coreutils-$(COREUTILS_VERSION) && \
403 PATH=$(ROOT)/fixed-gcc:$$PATH \
404 ./configure --host=riscv64-unknown-linux-gnu \
405 --prefix=/usr --libdir=/usr/lib64
406 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
407 cd coreutils-$(COREUTILS_VERSION)/man && \
408 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
409 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
410 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
412 coreutils-$(COREUTILS_VERSION).tar.xz:
414 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
417 # Cross-compile binutils.
418 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
419 rm -rf riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)
421 mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
422 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
423 PATH=$(ROOT)/fixed-gcc:$$PATH \
425 --host=riscv64-unknown-linux-gnu \
426 --prefix=/usr --libdir=/usr/lib64
427 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
428 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
430 binutils-$(BINUTILS_X_VERSION).tar.gz:
432 wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
435 # Cross-compile GMP, MPFR and MPC (deps of GCC).
436 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
437 rm -rf gmp-$(GMP_VERSION)
438 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
439 cd gmp-$(GMP_VERSION) && \
440 PATH=$(ROOT)/fixed-gcc:$$PATH \
441 ./configure --host=riscv64-unknown-linux-gnu \
442 --prefix=/usr --libdir=/usr/lib64
443 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
444 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
445 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
447 gmp-$(GMP_VERSION).tar.lz:
449 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
452 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
453 rm -rf mpfr-$(MPFR_VERSION)
454 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
455 cd mpfr-$(MPFR_VERSION) && \
456 PATH=$(ROOT)/fixed-gcc:$$PATH \
457 ./configure --host=riscv64-unknown-linux-gnu \
458 --prefix=/usr --libdir=/usr/lib64 \
459 --with-gmp=$(ROOT)/stage3-chroot/usr
460 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
461 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
462 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
463 rm -f stage3-chroot/usr/lib64/*.la
465 mpfr-$(MPFR_VERSION).tar.gz:
467 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
470 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
471 rm -rf mpc-$(MPC_VERSION)
472 tar -zxf mpc-$(MPC_VERSION).tar.gz
473 cd mpc-$(MPC_VERSION) && \
474 PATH=$(ROOT)/fixed-gcc:$$PATH \
475 ./configure --host=riscv64-unknown-linux-gnu \
476 --prefix=/usr --libdir=/usr/lib64 \
477 --with-gmp=$(ROOT)/stage3-chroot/usr \
478 --with-mpfr=$(ROOT)/stage3-chroot/usr
479 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
480 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
481 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
482 rm -f stage3-chroot/usr/lib64/*.la
484 mpc-$(MPC_VERSION).tar.gz:
486 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
490 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
491 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
493 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION) && \
494 patch -p1 < ../0001-HACKS-TO-GET-GCC-TO-COMPILE.patch
495 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
496 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
497 PATH=$(ROOT)/fixed-gcc:$$PATH \
499 --host=riscv64-unknown-linux-gnu \
500 --prefix=/usr --libdir=/usr/lib64 \
503 --enable-languages=c,c++ \
504 --disable-libmudflap \
506 --disable-libquadmath \
509 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
510 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install DESTDIR=$(ROOT)/stage3-chroot
512 gcc-$(GCC_X_VERSION).tar.gz:
514 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
517 # Cross-compile util-linux.
518 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
519 rm -rf util-linux-$(UTIL_LINUX_VERSION)
521 cd util-linux-$(UTIL_LINUX_VERSION) && \
522 PATH=$(ROOT)/fixed-gcc:$$PATH \
523 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
525 --host=riscv64-unknown-linux-gnu \
526 --prefix=/usr --libdir=/usr/lib64 \
529 --disable-makeinstall-chown \
530 --enable-static-programs=mount
531 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
532 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
533 rm -f stage3-chroot/usr/lib64/*.la
535 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
537 wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
540 # Cross-compile GNU tar.
541 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
542 rm -rf tar-$(TAR_VERSION)
544 cd tar-$(TAR_VERSION) && \
545 PATH=$(ROOT)/fixed-gcc:$$PATH \
547 --host=riscv64-unknown-linux-gnu \
548 --prefix=/usr --libdir=/usr/lib64
549 cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
550 cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
552 tar-$(TAR_VERSION).tar.xz:
554 wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
557 # Cross-compile GNU gzip.
558 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
559 rm -rf gzip-$(GZIP_VERSION)
561 cd gzip-$(GZIP_VERSION) && \
562 PATH=$(ROOT)/fixed-gcc:$$PATH \
564 --host=riscv64-unknown-linux-gnu \
565 --prefix=/usr --libdir=/usr/lib64
566 cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
567 cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
569 gzip-$(GZIP_VERSION).tar.gz:
571 wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
574 # Cross-compile zlib.
575 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
576 rm -rf zlib-$(ZLIB_VERSION)
578 cd zlib-$(ZLIB_VERSION) && \
579 PATH=$(ROOT)/fixed-gcc:$$PATH \
580 CC=riscv64-unknown-linux-gnu-gcc \
581 CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
583 --prefix=/usr --libdir=/usr/lib64
584 cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
585 cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
587 zlib-$(ZLIB_VERSION).tar.gz:
589 wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
592 # Cross-compile file/libmagic.
593 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
594 rm -rf file-$(FILE_VERSION)
596 cd file-$(FILE_VERSION) && \
597 PATH=$(ROOT)/fixed-gcc:$$PATH \
598 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
600 --host=riscv64-unknown-linux-gnu \
601 --prefix=/usr --libdir=/usr/lib64 \
602 --disable-static --enable-shared
603 cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
604 cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
605 rm -f stage3-chroot/usr/lib64/*.la
607 file-$(FILE_VERSION).tar.gz:
609 wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
612 # Cross-compile popt.
613 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
614 rm -rf popt-$(POPT_VERSION)
616 cd popt-$(POPT_VERSION) && \
617 PATH=$(ROOT)/fixed-gcc:$$PATH \
618 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
620 --host=riscv64-unknown-linux-gnu \
621 --prefix=/usr --libdir=/usr/lib64 \
622 --disable-static --enable-shared
623 cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
624 cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
625 rm -f stage3-chroot/usr/lib64/*.la
627 popt-$(POPT_VERSION).tar.gz:
629 wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
632 # Cross-compile beecrypt.
633 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
634 rm -rf beecrypt-$(BEECRYPT_VERSION)
636 cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
637 cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
638 cd beecrypt-$(BEECRYPT_VERSION) && \
639 PATH=$(ROOT)/fixed-gcc:$$PATH \
640 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
642 --host=riscv64-unknown-linux-gnu \
643 --prefix=/usr --libdir=/usr/lib64 \
644 --without-cplusplus \
649 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
650 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
651 chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
652 rm -f stage3-chroot/usr/lib64/*.la
654 beecrypt-$(BEECRYPT_VERSION).tar.gz:
656 wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
659 # Cross-compile GNU nano (editor).
660 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
661 rm -rf nano-$(NANO_VERSION)
663 cd nano-$(NANO_VERSION) && \
664 PATH=$(ROOT)/fixed-gcc:$$PATH \
665 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
667 --host=riscv64-unknown-linux-gnu \
668 --prefix=/usr --libdir=/usr/lib64
669 cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
670 cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
672 nano-$(NANO_VERSION).tar.gz:
674 wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
677 # Cross-compile GNU grep.
678 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
679 rm -rf grep-$(GREP_VERSION)
681 cd grep-$(GREP_VERSION) && \
682 PATH=$(ROOT)/fixed-gcc:$$PATH \
684 --host=riscv64-unknown-linux-gnu \
685 --prefix=/usr --libdir=/usr/lib64
686 cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
687 cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
689 grep-$(GREP_VERSION).tar.xz:
691 wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
694 # Cross-compile less.
695 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
696 rm -rf less-$(LESS_VERSION)
698 cd less-$(LESS_VERSION) && \
699 PATH=$(ROOT)/fixed-gcc:$$PATH \
700 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
702 --host=riscv64-unknown-linux-gnu \
703 --prefix=/usr --libdir=/usr/lib64
704 cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
705 cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
707 less-$(LESS_VERSION).tar.gz:
709 wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
712 # Cross-compile strace.
713 # XXX This does not work.
714 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
715 rm -rf strace-$(STRACE_SHORT_COMMIT)
717 cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
718 cd riscv-strace-$(STRACE_COMMIT) && \
719 PATH=$(ROOT)/fixed-gcc:$$PATH \
720 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
722 --host=riscv64-unknown-linux-gnu \
723 --prefix=/usr --libdir=/usr/lib64
724 cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
725 cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
727 strace-$(STRACE_SHORT_COMMIT).tar.gz:
729 wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
732 # Cross-compile bzip2.
733 stage3-chroot/usr/bin/bzip2: bzip2-$(BZIP2_VERSION).tar.gz
734 rm -rf bzip2-$(BZIP2_VERSION)
736 cd bzip2-$(BZIP2_VERSION) && \
737 PATH=$(ROOT)/fixed-gcc:$$PATH \
738 make libbz2.a bzip2 bzip2recover \
740 CC=riscv64-unknown-linux-gnu-gcc \
741 AR=riscv64-unknown-linux-gnu-ar \
742 RANLIB=riscv64-unknown-linux-gnu-ranlib \
743 CFLAGS="-Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -fPIC"
744 cd bzip2-$(BZIP2_VERSION) && \
745 make install PREFIX=$(ROOT)/stage3-chroot/usr
747 bzip2-$(BZIP2_VERSION).tar.gz:
749 wget -O $@-t http://www.bzip.org/1.0.6/bzip2-$(BZIP2_VERSION).tar.gz
752 # Cross-compile GNU make.
753 stage3-chroot/usr/bin/make: make-$(MAKE_VERSION).tar.gz
754 rm -rf make-$(MAKE_VERSION)
756 cd make-$(MAKE_VERSION) && \
757 PATH=$(ROOT)/fixed-gcc:$$PATH \
759 --host=riscv64-unknown-linux-gnu \
760 --prefix=/usr --libdir=/usr/lib64
761 cd make-$(MAKE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
762 cd make-$(MAKE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
764 make-$(MAKE_VERSION).tar.gz:
766 wget -O $@-t https://ftp.gnu.org/gnu/make/make-$(MAKE_VERSION).tar.gz
769 # Cross-compile GNU diffutils.
770 stage3-chroot/usr/bin/diff: diffutils-$(DIFFUTILS_VERSION).tar.xz
771 rm -rf diffutils-$(DIFFUTILS_VERSION)
773 cd diffutils-$(DIFFUTILS_VERSION) && \
774 PATH=$(ROOT)/fixed-gcc:$$PATH \
776 --host=riscv64-unknown-linux-gnu \
777 --prefix=/usr --libdir=/usr/lib64
778 cd diffutils-$(DIFFUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
779 cd diffutils-$(DIFFUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
781 diffutils-$(DIFFUTILS_VERSION).tar.xz:
783 wget -O $@-t https://ftp.gnu.org/gnu/diffutils/diffutils-$(DIFFUTILS_VERSION).tar.xz
786 # Cross-compile GNU findutils.
787 stage3-chroot/usr/bin/find: findutils-$(FINDUTILS_VERSION).tar.gz
788 rm -rf findutils-$(FINDUTILS_VERSION)
790 cd findutils-$(FINDUTILS_VERSION) && \
791 PATH=$(ROOT)/fixed-gcc:$$PATH \
793 --host=riscv64-unknown-linux-gnu \
794 --prefix=/usr --libdir=/usr/lib64
795 cd findutils-$(FINDUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
796 cd findutils-$(FINDUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
798 findutils-$(FINDUTILS_VERSION).tar.gz:
800 wget -O $@-t https://ftp.gnu.org/gnu/findutils/findutils-$(FINDUTILS_VERSION).tar.gz
803 # Cross-compile GNU sed.
804 stage3-chroot/usr/bin/sed: sed-$(SED_VERSION).tar.gz
805 rm -rf sed-$(SED_VERSION)
807 cd sed-$(SED_VERSION) && \
808 PATH=$(ROOT)/fixed-gcc:$$PATH \
810 --host=riscv64-unknown-linux-gnu \
811 --prefix=/usr --libdir=/usr/lib64
812 cd sed-$(SED_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
813 cd sed-$(SED_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
815 sed-$(SED_VERSION).tar.gz:
817 wget -O $@-t https://ftp.gnu.org/gnu/sed/sed-$(SED_VERSION).tar.gz
820 # Cross-compile patch.
821 stage3-chroot/usr/bin/patch: patch-$(PATCH_VERSION).tar.gz
822 rm -rf patch-$(PATCH_VERSION)
824 cd patch-$(PATCH_VERSION) && \
825 PATH=$(ROOT)/fixed-gcc:$$PATH \
827 --host=riscv64-unknown-linux-gnu \
828 --prefix=/usr --libdir=/usr/lib64
829 cd patch-$(PATCH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
830 cd patch-$(PATCH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
832 patch-$(PATCH_VERSION).tar.gz:
834 wget -O $@-t https://ftp.gnu.org/gnu/patch/patch-$(PATCH_VERSION).tar.gz
837 # Cross-compile hostname.
838 stage3-chroot/usr/bin/hostname: hostname-$(HOSTNAME_VERSION).tar.gz
839 rm -rf hostname-$(HOSTNAME_VERSION)
841 cd hostname && patch -p1 < ../hostname-rh.patch
843 PATH=$(ROOT)/fixed-gcc:$$PATH \
845 CC=riscv64-unknown-linux-gnu-gcc \
847 cd hostname && make install BASEDIR=$(ROOT)/stage3-chroot
849 hostname-$(HOSTNAME_VERSION).tar.gz:
851 wget -O $@-t http://ftp.de.debian.org/debian/pool/main/h/hostname/hostname_$(HOSTNAME_VERSION).tar.gz
854 # Cross-compile RPM / rpmbuild.
855 # We build this from a git commit, with a few hacks to the configure
857 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
858 rm -rf rpm-$(RPM_SHORT_COMMIT)
859 tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
860 tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
861 cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
862 cd rpm-$(RPM_SHORT_COMMIT) && \
863 patch -p1 < ../0001-RISCV-64-bit-riscv64-support.patch && \
864 patch -p1 < ../0002-build-fgetc-returns-int-not-char.patch && \
865 patch -p1 < ../0003-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
866 cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
867 cd rpm-$(RPM_SHORT_COMMIT) && \
868 PATH=$(ROOT)/fixed-gcc:$$PATH \
869 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
871 --host=riscv64-unknown-linux-gnu \
872 --prefix=/usr --libdir=/usr/lib64 \
874 --without-libarchive \
878 --without-external-db \
881 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
882 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
883 rm -f stage3-chroot/usr/lib64/*.la
885 rpm-$(RPM_SHORT_COMMIT).tar.gz:
887 wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
890 db-$(BDB_VERSION).tar.gz:
892 wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
895 # Create an /init script.
896 stage3-chroot/init: init.sh
897 install -m 0755 $^ $@
899 # Create the stage3 disk image.
900 # Note `-s +...' adds spare space to the disk image.
901 stage3-disk.img: stage3-chroot
902 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
904 # Upload the compressed disk image.
905 upload-stage3: stage3-disk.img.xz
906 scp $^ tick:public_html/riscv/
907 stage3-disk.img.xz: stage3-disk.img
911 # Helper which boots stage3 disk image in spike.
912 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
913 spike +disk=stage3-disk.img \
914 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
916 # Helper which boots stage3 disk image in qemu.
917 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
918 qemu-system-riscv -kernel /usr/bin/bbl \
919 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
920 -drive file=stage3-disk.img,format=raw -nographic