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
70 all: stage1 stage2 stage3 stage4
74 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
75 stage1-riscv-qemu/riscv-qemu.spec \
76 stamp-riscv-qemu-installed \
77 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
78 stage1-riscv-fesvr/riscv-fesvr.spec \
79 stamp-riscv-fesvr-installed \
80 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
81 stage1-riscv-isa-sim/riscv-isa-sim.spec \
82 stamp-riscv-isa-sim-installed
84 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
86 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
89 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
90 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
91 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
95 stamp-riscv-qemu-installed:
97 @rpm -q riscv-qemu >/dev/null || { \
98 echo "ERROR: You must install riscv-qemu:"; \
100 echo " dnf copr enable rjones/riscv"; \
101 echo " dnf install riscv-qemu"; \
103 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
107 @qemu-system-riscv --version || { \
108 echo "ERROR: qemu-system-riscv is not working."; \
109 echo "Make sure you installed the riscv-qemu package."; \
114 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
116 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
119 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
120 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
121 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
125 stamp-riscv-fesvr-installed:
127 @rpm -q riscv-fesvr >/dev/null || { \
128 echo "ERROR: You must install riscv-fesvr:"; \
130 echo " dnf copr enable rjones/riscv"; \
131 echo " dnf install riscv-fesvr"; \
133 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
139 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
141 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
144 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
145 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
146 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
150 stamp-riscv-isa-sim-installed:
152 @rpm -q riscv-isa-sim >/dev/null || { \
153 echo "ERROR: You must install riscv-isa-sim:"; \
155 echo " dnf copr enable rjones/riscv"; \
156 echo " dnf install riscv-isa-sim"; \
158 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
166 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
167 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
168 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
169 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
170 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
171 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
172 stamp-riscv-gnu-toolchain-installed \
173 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
174 stage2-riscv-pk/riscv-pk.spec \
175 stamp-riscv-pk-installed
177 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
179 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
182 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
184 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
187 # GCC 5 no longer compiles with GCC 6 unless we patch it.
188 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
189 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
191 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
193 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
194 tar zcf $@-t gcc-$(GCC_VERSION)
195 rm -r gcc-$(GCC_VERSION)
198 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
200 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
203 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
205 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
208 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
209 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
210 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
211 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
212 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
213 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
214 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
218 stamp-riscv-gnu-toolchain-installed:
220 @rpm -q riscv-gnu-toolchain >/dev/null || { \
221 echo "ERROR: You must install riscv-gnu-toolchain:"; \
223 echo " dnf copr enable rjones/riscv"; \
224 echo " dnf install riscv-gnu-toolchain"; \
226 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
230 @riscv64-unknown-elf-gcc --version || { \
231 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
232 echo "Make sure you installed the riscv-gnu-toolchain package."; \
237 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
239 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
242 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
243 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
244 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
248 stamp-riscv-pk-installed:
250 @rpm -q riscv-pk >/dev/null || { \
251 echo "ERROR: You must install riscv-pk:"; \
253 echo " dnf copr enable rjones/riscv"; \
254 echo " dnf install riscv-pk"; \
256 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
264 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
265 stage3-chroot-original/etc/fedora-release \
266 stage3-chroot/etc/fedora-release \
267 stage3-chroot/lib64/libc.so.6 \
268 stage3-chroot/usr/bin/tic \
269 stage3-chroot/bin/bash \
270 stage3-chroot/bin/ls \
271 stage3-chroot/usr/lib64/libgmp.so.10 \
272 stage3-chroot/usr/lib64/libmpfr.so.4 \
273 stage3-chroot/usr/lib64/libmpc.so.3 \
274 stage3-chroot/usr/bin/as \
275 stage3-chroot/usr/bin/gcc \
276 stage3-chroot/usr/bin/mount \
277 stage3-chroot/usr/bin/tar \
278 stage3-chroot/usr/bin/gzip \
279 stage3-chroot/usr/lib64/libz.so \
280 stage3-chroot/usr/bin/file \
281 stage3-chroot/usr/lib64/libpopt.so \
282 stage3-chroot/usr/lib64/libbeecrypt.so \
283 stage3-chroot/usr/bin/rpm \
284 stage3-chroot/usr/bin/nano \
285 stage3-chroot/usr/bin/grep \
286 stage3-chroot/usr/bin/less \
287 stage3-chroot/usr/bin/strace \
291 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
292 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
293 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
294 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
295 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
298 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
299 git remote add riscv https://github.com/riscv/riscv-linux && \
301 git checkout -f linux-4.1.y-riscv && \
303 make ARCH=riscv defconfig
304 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
305 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
306 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
307 make ARCH=riscv olddefconfig
308 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
309 make ARCH=riscv vmlinux
312 # Build an original (x86-64) chroot using supermin. We then aim to
313 # rebuild (using cross-compiled versions) every ELF binary in this
315 stage3-chroot-original/etc/fedora-release:
316 rm -rf stage3-chroot-original tmp-supermin.d
317 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
318 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
320 @echo -n "Total files in chroot: "
321 @find stage3-chroot-original -type f | wc -l
322 @echo -n "ELF files to be rebuilt: "
323 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
325 # Copy the original chroot to the final chroot, remove all the ELF
327 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
329 cp -a stage3-chroot-original stage3-chroot
330 find stage3-chroot -type d | xargs chmod u+w
331 find stage3-chroot -type f | xargs chmod u+w
332 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
333 rm -f stage3-chroot/lib64/libc.so.6
335 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
336 # copy files and symlinks, leave the target directory structure
338 stage3-chroot/lib64/libc.so.6:
339 mkdir -p stage3-chroot/usr/lib/audit
340 mkdir -p stage3-chroot/usr/lib/gconv
341 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
342 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
344 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
346 # Cross-compile ncurses.
347 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
349 cd ncurses-$(NCURSES_VERSION) && \
350 PATH=$(ROOT)/fixed-gcc:$$PATH \
351 ./configure --host=riscv64-unknown-linux-gnu \
352 --prefix=/usr --libdir=/usr/lib64 \
354 --with-termlib=tinfo \
356 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
357 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
359 ncurses-$(NCURSES_VERSION).tgz:
361 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
364 # Cross-compile bash.
365 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
367 cd bash-$(BASH_VERSION) && \
368 PATH=$(ROOT)/fixed-gcc:$$PATH \
369 ./configure --host=riscv64-unknown-linux-gnu \
370 --prefix=/usr --libdir=/usr/lib64
371 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
372 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
374 bash-$(BASH_VERSION).tar.gz:
376 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
379 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
380 # known-broken and upstream don't care, hence the 'touch' command.
382 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
384 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
385 rm -rf coreutils-$(COREUTILS_VERSION)
387 cd coreutils-$(COREUTILS_VERSION) && \
388 PATH=$(ROOT)/fixed-gcc:$$PATH \
389 ./configure --host=riscv64-unknown-linux-gnu \
390 --prefix=/usr --libdir=/usr/lib64
391 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
392 cd coreutils-$(COREUTILS_VERSION)/man && \
393 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
394 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
395 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
397 coreutils-$(COREUTILS_VERSION).tar.xz:
399 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
402 # Cross-compile binutils.
403 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
404 rm -rf riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)
406 mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
407 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
408 PATH=$(ROOT)/fixed-gcc:$$PATH \
410 --host=riscv64-unknown-linux-gnu \
411 --prefix=/usr --libdir=/usr/lib64
412 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
413 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
415 binutils-$(BINUTILS_X_VERSION).tar.gz:
417 wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
420 # Cross-compile GMP, MPFR and MPC (deps of GCC).
421 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
422 rm -rf gmp-$(GMP_VERSION)
423 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
424 cd gmp-$(GMP_VERSION) && \
425 PATH=$(ROOT)/fixed-gcc:$$PATH \
426 ./configure --host=riscv64-unknown-linux-gnu \
427 --prefix=/usr --libdir=/usr/lib64
428 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
429 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
430 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
432 gmp-$(GMP_VERSION).tar.lz:
434 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
437 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
438 rm -rf mpfr-$(MPFR_VERSION)
439 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
440 cd mpfr-$(MPFR_VERSION) && \
441 PATH=$(ROOT)/fixed-gcc:$$PATH \
442 ./configure --host=riscv64-unknown-linux-gnu \
443 --prefix=/usr --libdir=/usr/lib64 \
444 --with-gmp=$(ROOT)/stage3-chroot/usr
445 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
446 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
447 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
448 rm -f stage3-chroot/usr/lib64/*.la
450 mpfr-$(MPFR_VERSION).tar.gz:
452 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
455 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
456 rm -rf mpc-$(MPC_VERSION)
457 tar -zxf mpc-$(MPC_VERSION).tar.gz
458 cd mpc-$(MPC_VERSION) && \
459 PATH=$(ROOT)/fixed-gcc:$$PATH \
460 ./configure --host=riscv64-unknown-linux-gnu \
461 --prefix=/usr --libdir=/usr/lib64 \
462 --with-gmp=$(ROOT)/stage3-chroot/usr \
463 --with-mpfr=$(ROOT)/stage3-chroot/usr
464 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
465 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
466 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
467 rm -f stage3-chroot/usr/lib64/*.la
469 mpc-$(MPC_VERSION).tar.gz:
471 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
475 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
476 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
478 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
479 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
480 PATH=$(ROOT)/fixed-gcc:$$PATH \
482 --host=riscv64-unknown-linux-gnu \
483 --prefix=/usr --libdir=/usr/lib64 \
486 --enable-languages=c,c++ \
487 --disable-libmudflap \
489 --disable-libquadmath \
492 # XXX use make all & make install here. However building libgcc
493 # fails, see 'broken-gcc.log'.
494 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
495 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
497 gcc-$(GCC_X_VERSION).tar.gz:
499 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
502 # Cross-compile util-linux.
503 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
504 rm -rf util-linux-$(UTIL_LINUX_VERSION)
506 cd util-linux-$(UTIL_LINUX_VERSION) && \
507 PATH=$(ROOT)/fixed-gcc:$$PATH \
508 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
510 --host=riscv64-unknown-linux-gnu \
511 --prefix=/usr --libdir=/usr/lib64 \
514 --disable-makeinstall-chown \
515 --enable-static-programs=mount
516 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
517 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
518 rm -f stage3-chroot/usr/lib64/*.la
520 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
522 wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
525 # Cross-compile GNU tar.
526 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
527 rm -rf tar-$(TAR_VERSION)
529 cd tar-$(TAR_VERSION) && \
530 PATH=$(ROOT)/fixed-gcc:$$PATH \
532 --host=riscv64-unknown-linux-gnu \
533 --prefix=/usr --libdir=/usr/lib64
534 cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
535 cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
537 tar-$(TAR_VERSION).tar.xz:
539 wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
542 # Cross-compile GNU gzip.
543 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
544 rm -rf gzip-$(GZIP_VERSION)
546 cd gzip-$(GZIP_VERSION) && \
547 PATH=$(ROOT)/fixed-gcc:$$PATH \
549 --host=riscv64-unknown-linux-gnu \
550 --prefix=/usr --libdir=/usr/lib64
551 cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
552 cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
554 gzip-$(GZIP_VERSION).tar.gz:
556 wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
559 # Cross-compile zlib.
560 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
561 rm -rf zlib-$(ZLIB_VERSION)
563 cd zlib-$(ZLIB_VERSION) && \
564 PATH=$(ROOT)/fixed-gcc:$$PATH \
565 CC=riscv64-unknown-linux-gnu-gcc \
566 CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
568 --prefix=/usr --libdir=/usr/lib64
569 cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
570 cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
572 zlib-$(ZLIB_VERSION).tar.gz:
574 wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
577 # Cross-compile file/libmagic.
578 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
579 rm -rf file-$(FILE_VERSION)
581 cd file-$(FILE_VERSION) && \
582 PATH=$(ROOT)/fixed-gcc:$$PATH \
583 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
585 --host=riscv64-unknown-linux-gnu \
586 --prefix=/usr --libdir=/usr/lib64 \
587 --disable-static --enable-shared
588 cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
589 cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
590 rm -f stage3-chroot/usr/lib64/*.la
592 file-$(FILE_VERSION).tar.gz:
594 wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
597 # Cross-compile popt.
598 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
599 rm -rf popt-$(POPT_VERSION)
601 cd popt-$(POPT_VERSION) && \
602 PATH=$(ROOT)/fixed-gcc:$$PATH \
603 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
605 --host=riscv64-unknown-linux-gnu \
606 --prefix=/usr --libdir=/usr/lib64 \
607 --disable-static --enable-shared
608 cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
609 cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
610 rm -f stage3-chroot/usr/lib64/*.la
612 popt-$(POPT_VERSION).tar.gz:
614 wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
617 # Cross-compile beecrypt.
618 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
619 rm -rf beecrypt-$(BEECRYPT_VERSION)
621 cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
622 cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
623 cd beecrypt-$(BEECRYPT_VERSION) && \
624 PATH=$(ROOT)/fixed-gcc:$$PATH \
625 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
627 --host=riscv64-unknown-linux-gnu \
628 --prefix=/usr --libdir=/usr/lib64 \
629 --without-cplusplus \
634 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
635 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
636 chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
637 rm -f stage3-chroot/usr/lib64/*.la
639 beecrypt-$(BEECRYPT_VERSION).tar.gz:
641 wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
644 # Cross-compile RPM / rpmbuild.
645 # We build this from a git commit, with a few hacks to the configure
647 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
648 rm -rf rpm-$(RPM_SHORT_COMMIT)
649 tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
650 tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
651 cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
652 cd rpm-$(RPM_SHORT_COMMIT) && patch -p1 < ../0001-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
653 cd rpm-$(RPM_SHORT_COMMIT) && patch -p1 < ../0002-RISCV-64-bit-riscv64-support.patch
654 cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
655 cd rpm-$(RPM_SHORT_COMMIT) && \
656 PATH=$(ROOT)/fixed-gcc:$$PATH \
657 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
659 --host=riscv64-unknown-linux-gnu \
660 --prefix=/usr --libdir=/usr/lib64 \
662 --without-libarchive \
666 --without-external-db \
669 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
670 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
671 rm -f stage3-chroot/usr/lib64/*.la
673 rpm-$(RPM_SHORT_COMMIT).tar.gz:
675 wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
678 db-$(BDB_VERSION).tar.gz:
680 wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
683 # Cross-compile GNU nano (editor).
684 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
685 rm -rf nano-$(NANO_VERSION)
687 cd nano-$(NANO_VERSION) && \
688 PATH=$(ROOT)/fixed-gcc:$$PATH \
689 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
691 --host=riscv64-unknown-linux-gnu \
692 --prefix=/usr --libdir=/usr/lib64
693 cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
694 cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
696 nano-$(NANO_VERSION).tar.gz:
698 wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
701 # Cross-compile GNU grep.
702 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
703 rm -rf grep-$(GREP_VERSION)
705 cd grep-$(GREP_VERSION) && \
706 PATH=$(ROOT)/fixed-gcc:$$PATH \
708 --host=riscv64-unknown-linux-gnu \
709 --prefix=/usr --libdir=/usr/lib64
710 cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
711 cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
713 grep-$(GREP_VERSION).tar.xz:
715 wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
718 # Cross-compile less.
719 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
720 rm -rf less-$(LESS_VERSION)
722 cd less-$(LESS_VERSION) && \
723 PATH=$(ROOT)/fixed-gcc:$$PATH \
724 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
726 --host=riscv64-unknown-linux-gnu \
727 --prefix=/usr --libdir=/usr/lib64
728 cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
729 cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
731 less-$(LESS_VERSION).tar.gz:
733 wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
736 # Cross-compile strace.
737 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
738 rm -rf strace-$(STRACE_SHORT_COMMIT)
740 cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
741 cd riscv-strace-$(STRACE_COMMIT) && \
742 PATH=$(ROOT)/fixed-gcc:$$PATH \
743 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
745 --host=riscv64-unknown-linux-gnu \
746 --prefix=/usr --libdir=/usr/lib64
747 cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
748 cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
750 strace-$(STRACE_SHORT_COMMIT).tar.gz:
752 wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
755 # Create an /init script.
756 stage3-chroot/init: init.sh
757 install -m 0755 $^ $@
759 # Create the stage3 disk image.
760 # Note `-s +...' adds spare space to the disk image.
761 stage3-disk.img: stage3-chroot
762 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
764 # Upload the compressed disk image.
765 upload-stage3: stage3-disk.img.xz
766 scp $^ tick:public_html/riscv/
767 stage3-disk.img.xz: stage3-disk.img
771 # Helper which boots stage3 disk image in spike.
772 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
773 spike +disk=stage3-disk.img \
774 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
776 # Helper which boots stage3 disk image in qemu.
777 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
778 qemu-system-riscv -kernel /usr/bin/bbl \
779 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
780 -drive file=stage3-disk.img,format=raw -nographic