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
72 all: stage1 stage2 stage3 stage4
76 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
77 stage1-riscv-qemu/riscv-qemu.spec \
78 stamp-riscv-qemu-installed \
79 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
80 stage1-riscv-fesvr/riscv-fesvr.spec \
81 stamp-riscv-fesvr-installed \
82 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
83 stage1-riscv-isa-sim/riscv-isa-sim.spec \
84 stamp-riscv-isa-sim-installed
86 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
88 wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
91 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
92 sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
93 -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
97 stamp-riscv-qemu-installed:
99 @rpm -q riscv-qemu >/dev/null || { \
100 echo "ERROR: You must install riscv-qemu:"; \
102 echo " dnf copr enable rjones/riscv"; \
103 echo " dnf install riscv-qemu"; \
105 echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
109 @qemu-system-riscv --version || { \
110 echo "ERROR: qemu-system-riscv is not working."; \
111 echo "Make sure you installed the riscv-qemu package."; \
116 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
118 wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
121 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
122 sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
123 -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
127 stamp-riscv-fesvr-installed:
129 @rpm -q riscv-fesvr >/dev/null || { \
130 echo "ERROR: You must install riscv-fesvr:"; \
132 echo " dnf copr enable rjones/riscv"; \
133 echo " dnf install riscv-fesvr"; \
135 echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
141 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
143 wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
146 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
147 sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
148 -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
152 stamp-riscv-isa-sim-installed:
154 @rpm -q riscv-isa-sim >/dev/null || { \
155 echo "ERROR: You must install riscv-isa-sim:"; \
157 echo " dnf copr enable rjones/riscv"; \
158 echo " dnf install riscv-isa-sim"; \
160 echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
168 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
169 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
170 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
171 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
172 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
173 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
174 stamp-riscv-gnu-toolchain-installed \
175 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
176 stage2-riscv-pk/riscv-pk.spec \
177 stamp-riscv-pk-installed
179 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
181 wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
184 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
186 wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
189 # GCC 5 no longer compiles with GCC 6 unless we patch it.
190 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
191 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
193 wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
195 cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
196 tar zcf $@-t gcc-$(GCC_VERSION)
197 rm -r gcc-$(GCC_VERSION)
200 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
202 wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
205 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
207 wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
210 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
211 sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
212 -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
213 -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
214 -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
215 -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
216 -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
220 stamp-riscv-gnu-toolchain-installed:
222 @rpm -q riscv-gnu-toolchain >/dev/null || { \
223 echo "ERROR: You must install riscv-gnu-toolchain:"; \
225 echo " dnf copr enable rjones/riscv"; \
226 echo " dnf install riscv-gnu-toolchain"; \
228 echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
232 @riscv64-unknown-elf-gcc --version || { \
233 echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
234 echo "Make sure you installed the riscv-gnu-toolchain package."; \
239 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
241 wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
244 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
245 sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
246 -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
250 stamp-riscv-pk-installed:
252 @rpm -q riscv-pk >/dev/null || { \
253 echo "ERROR: You must install riscv-pk:"; \
255 echo " dnf copr enable rjones/riscv"; \
256 echo " dnf install riscv-pk"; \
258 echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
266 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
267 stage3-chroot-original/etc/fedora-release \
268 stage3-chroot/etc/fedora-release \
269 stage3-chroot/lib64/libc.so.6 \
270 stage3-chroot/usr/bin/tic \
271 stage3-chroot/bin/bash \
272 stage3-chroot/bin/ls \
273 stage3-chroot/usr/lib64/libgmp.so.10 \
274 stage3-chroot/usr/lib64/libmpfr.so.4 \
275 stage3-chroot/usr/lib64/libmpc.so.3 \
276 stage3-chroot/usr/bin/as \
277 stage3-chroot/usr/bin/gcc \
278 stage3-chroot/usr/bin/mount \
279 stage3-chroot/usr/bin/tar \
280 stage3-chroot/usr/bin/gzip \
281 stage3-chroot/usr/lib64/libz.so \
282 stage3-chroot/usr/bin/file \
283 stage3-chroot/usr/lib64/libpopt.so \
284 stage3-chroot/usr/lib64/libbeecrypt.so \
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 \
290 stage3-chroot/usr/bin/make \
291 stage3-chroot/usr/bin/rpm \
295 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
296 rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
297 cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
298 mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
299 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
302 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
303 git remote add riscv https://github.com/riscv/riscv-linux && \
305 git checkout -f linux-4.1.y-riscv && \
307 make ARCH=riscv defconfig
308 echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
309 echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
310 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
311 make ARCH=riscv olddefconfig
312 cd stage3-kernel/linux-$(KERNEL_VERSION) && \
313 make ARCH=riscv vmlinux
316 # Build an original (x86-64) chroot using supermin. We then aim to
317 # rebuild (using cross-compiled versions) every ELF binary in this
319 stage3-chroot-original/etc/fedora-release:
320 rm -rf stage3-chroot-original tmp-supermin.d
321 supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
322 supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
324 @echo -n "Total files in chroot: "
325 @find stage3-chroot-original -type f | wc -l
326 @echo -n "ELF files to be rebuilt: "
327 @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
329 # Copy the original chroot to the final chroot, remove all the ELF
331 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
333 cp -a stage3-chroot-original stage3-chroot
334 find stage3-chroot -type d | xargs chmod u+w
335 find stage3-chroot -type f | xargs chmod u+w
336 find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
337 rm -f stage3-chroot/lib64/libc.so.6
339 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot. Only
340 # copy files and symlinks, leave the target directory structure
342 stage3-chroot/lib64/libc.so.6:
343 mkdir -p stage3-chroot/usr/lib/audit
344 mkdir -p stage3-chroot/usr/lib/gconv
345 for f in `cd /usr/sysroot && find -type f -o -type l`; do \
346 cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
348 cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
350 # Cross-compile ncurses.
351 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
353 cd ncurses-$(NCURSES_VERSION) && \
354 PATH=$(ROOT)/fixed-gcc:$$PATH \
355 ./configure --host=riscv64-unknown-linux-gnu \
356 --prefix=/usr --libdir=/usr/lib64 \
358 --with-termlib=tinfo \
360 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
361 cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
363 ncurses-$(NCURSES_VERSION).tgz:
365 wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
368 # Cross-compile bash.
369 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
371 cd bash-$(BASH_VERSION) && \
372 PATH=$(ROOT)/fixed-gcc:$$PATH \
373 ./configure --host=riscv64-unknown-linux-gnu \
374 --prefix=/usr --libdir=/usr/lib64
375 cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
376 cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
378 bash-$(BASH_VERSION).tar.gz:
380 wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
383 # Cross-compile coreutils. Bleah, coreutils cross-compilation is
384 # known-broken and upstream don't care, hence the 'touch' command.
386 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
388 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
389 rm -rf coreutils-$(COREUTILS_VERSION)
391 cd coreutils-$(COREUTILS_VERSION) && \
392 PATH=$(ROOT)/fixed-gcc:$$PATH \
393 ./configure --host=riscv64-unknown-linux-gnu \
394 --prefix=/usr --libdir=/usr/lib64
395 -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
396 cd coreutils-$(COREUTILS_VERSION)/man && \
397 for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
398 cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
399 cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
401 coreutils-$(COREUTILS_VERSION).tar.xz:
403 wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
406 # Cross-compile binutils.
407 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
408 rm -rf riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)
410 mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
411 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
412 PATH=$(ROOT)/fixed-gcc:$$PATH \
414 --host=riscv64-unknown-linux-gnu \
415 --prefix=/usr --libdir=/usr/lib64
416 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
417 cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
419 binutils-$(BINUTILS_X_VERSION).tar.gz:
421 wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
424 # Cross-compile GMP, MPFR and MPC (deps of GCC).
425 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
426 rm -rf gmp-$(GMP_VERSION)
427 tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
428 cd gmp-$(GMP_VERSION) && \
429 PATH=$(ROOT)/fixed-gcc:$$PATH \
430 ./configure --host=riscv64-unknown-linux-gnu \
431 --prefix=/usr --libdir=/usr/lib64
432 cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
433 cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
434 cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
436 gmp-$(GMP_VERSION).tar.lz:
438 wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
441 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
442 rm -rf mpfr-$(MPFR_VERSION)
443 tar -zxf mpfr-$(MPFR_VERSION).tar.gz
444 cd mpfr-$(MPFR_VERSION) && \
445 PATH=$(ROOT)/fixed-gcc:$$PATH \
446 ./configure --host=riscv64-unknown-linux-gnu \
447 --prefix=/usr --libdir=/usr/lib64 \
448 --with-gmp=$(ROOT)/stage3-chroot/usr
449 cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
450 cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
451 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
452 rm -f stage3-chroot/usr/lib64/*.la
454 mpfr-$(MPFR_VERSION).tar.gz:
456 wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
459 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
460 rm -rf mpc-$(MPC_VERSION)
461 tar -zxf mpc-$(MPC_VERSION).tar.gz
462 cd mpc-$(MPC_VERSION) && \
463 PATH=$(ROOT)/fixed-gcc:$$PATH \
464 ./configure --host=riscv64-unknown-linux-gnu \
465 --prefix=/usr --libdir=/usr/lib64 \
466 --with-gmp=$(ROOT)/stage3-chroot/usr \
467 --with-mpfr=$(ROOT)/stage3-chroot/usr
468 cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
469 cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
470 cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
471 rm -f stage3-chroot/usr/lib64/*.la
473 mpc-$(MPC_VERSION).tar.gz:
475 wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
479 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
480 rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
482 mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
483 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
484 PATH=$(ROOT)/fixed-gcc:$$PATH \
486 --host=riscv64-unknown-linux-gnu \
487 --prefix=/usr --libdir=/usr/lib64 \
490 --enable-languages=c,c++ \
491 --disable-libmudflap \
493 --disable-libquadmath \
496 # XXX use make all & make install here. However building libgcc
497 # fails, see 'broken-gcc.log'.
498 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
499 cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
501 gcc-$(GCC_X_VERSION).tar.gz:
503 wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
506 # Cross-compile util-linux.
507 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
508 rm -rf util-linux-$(UTIL_LINUX_VERSION)
510 cd util-linux-$(UTIL_LINUX_VERSION) && \
511 PATH=$(ROOT)/fixed-gcc:$$PATH \
512 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
514 --host=riscv64-unknown-linux-gnu \
515 --prefix=/usr --libdir=/usr/lib64 \
518 --disable-makeinstall-chown \
519 --enable-static-programs=mount
520 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
521 cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
522 rm -f stage3-chroot/usr/lib64/*.la
524 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
526 wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
529 # Cross-compile GNU tar.
530 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
531 rm -rf tar-$(TAR_VERSION)
533 cd tar-$(TAR_VERSION) && \
534 PATH=$(ROOT)/fixed-gcc:$$PATH \
536 --host=riscv64-unknown-linux-gnu \
537 --prefix=/usr --libdir=/usr/lib64
538 cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
539 cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
541 tar-$(TAR_VERSION).tar.xz:
543 wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
546 # Cross-compile GNU gzip.
547 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
548 rm -rf gzip-$(GZIP_VERSION)
550 cd gzip-$(GZIP_VERSION) && \
551 PATH=$(ROOT)/fixed-gcc:$$PATH \
553 --host=riscv64-unknown-linux-gnu \
554 --prefix=/usr --libdir=/usr/lib64
555 cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
556 cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
558 gzip-$(GZIP_VERSION).tar.gz:
560 wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
563 # Cross-compile zlib.
564 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
565 rm -rf zlib-$(ZLIB_VERSION)
567 cd zlib-$(ZLIB_VERSION) && \
568 PATH=$(ROOT)/fixed-gcc:$$PATH \
569 CC=riscv64-unknown-linux-gnu-gcc \
570 CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
572 --prefix=/usr --libdir=/usr/lib64
573 cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
574 cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
576 zlib-$(ZLIB_VERSION).tar.gz:
578 wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
581 # Cross-compile file/libmagic.
582 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
583 rm -rf file-$(FILE_VERSION)
585 cd file-$(FILE_VERSION) && \
586 PATH=$(ROOT)/fixed-gcc:$$PATH \
587 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
589 --host=riscv64-unknown-linux-gnu \
590 --prefix=/usr --libdir=/usr/lib64 \
591 --disable-static --enable-shared
592 cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
593 cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
594 rm -f stage3-chroot/usr/lib64/*.la
596 file-$(FILE_VERSION).tar.gz:
598 wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
601 # Cross-compile popt.
602 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
603 rm -rf popt-$(POPT_VERSION)
605 cd popt-$(POPT_VERSION) && \
606 PATH=$(ROOT)/fixed-gcc:$$PATH \
607 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
609 --host=riscv64-unknown-linux-gnu \
610 --prefix=/usr --libdir=/usr/lib64 \
611 --disable-static --enable-shared
612 cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
613 cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
614 rm -f stage3-chroot/usr/lib64/*.la
616 popt-$(POPT_VERSION).tar.gz:
618 wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
621 # Cross-compile beecrypt.
622 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
623 rm -rf beecrypt-$(BEECRYPT_VERSION)
625 cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
626 cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
627 cd beecrypt-$(BEECRYPT_VERSION) && \
628 PATH=$(ROOT)/fixed-gcc:$$PATH \
629 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
631 --host=riscv64-unknown-linux-gnu \
632 --prefix=/usr --libdir=/usr/lib64 \
633 --without-cplusplus \
638 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
639 cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
640 chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
641 rm -f stage3-chroot/usr/lib64/*.la
643 beecrypt-$(BEECRYPT_VERSION).tar.gz:
645 wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
648 # Cross-compile GNU nano (editor).
649 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
650 rm -rf nano-$(NANO_VERSION)
652 cd nano-$(NANO_VERSION) && \
653 PATH=$(ROOT)/fixed-gcc:$$PATH \
654 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
656 --host=riscv64-unknown-linux-gnu \
657 --prefix=/usr --libdir=/usr/lib64
658 cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
659 cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
661 nano-$(NANO_VERSION).tar.gz:
663 wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
666 # Cross-compile GNU grep.
667 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
668 rm -rf grep-$(GREP_VERSION)
670 cd grep-$(GREP_VERSION) && \
671 PATH=$(ROOT)/fixed-gcc:$$PATH \
673 --host=riscv64-unknown-linux-gnu \
674 --prefix=/usr --libdir=/usr/lib64
675 cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
676 cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
678 grep-$(GREP_VERSION).tar.xz:
680 wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
683 # Cross-compile less.
684 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
685 rm -rf less-$(LESS_VERSION)
687 cd less-$(LESS_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 less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
694 cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
696 less-$(LESS_VERSION).tar.gz:
698 wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
701 # Cross-compile strace.
702 # XXX This does not work.
703 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
704 rm -rf strace-$(STRACE_SHORT_COMMIT)
706 cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
707 cd riscv-strace-$(STRACE_COMMIT) && \
708 PATH=$(ROOT)/fixed-gcc:$$PATH \
709 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
711 --host=riscv64-unknown-linux-gnu \
712 --prefix=/usr --libdir=/usr/lib64
713 cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
714 cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
716 strace-$(STRACE_SHORT_COMMIT).tar.gz:
718 wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
721 # Cross-compile bzip2.
722 stage3-chroot/usr/bin/bzip2: bzip2-$(BZIP2_VERSION).tar.gz
723 rm -rf bzip2-$(BZIP2_VERSION)
725 cd bzip2-$(BZIP2_VERSION) && \
726 PATH=$(ROOT)/fixed-gcc:$$PATH \
727 make libbz2.a bzip2 bzip2recover \
729 CC=riscv64-unknown-linux-gnu-gcc \
730 AR=riscv64-unknown-linux-gnu-ar \
731 RANLIB=riscv64-unknown-linux-gnu-ranlib \
732 CFLAGS="-Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -fPIC"
733 cd bzip2-$(BZIP2_VERSION) && \
734 make install PREFIX=$(ROOT)/stage3-chroot/usr
736 bzip2-$(BZIP2_VERSION).tar.gz:
738 wget -O $@-t http://www.bzip.org/1.0.6/bzip2-$(BZIP2_VERSION).tar.gz
741 # Cross-compile GNU make.
742 stage3-chroot/usr/bin/make: make-$(MAKE_VERSION).tar.gz
743 rm -rf make-$(MAKE_VERSION)
745 cd make-$(MAKE_VERSION) && \
746 PATH=$(ROOT)/fixed-gcc:$$PATH \
748 --host=riscv64-unknown-linux-gnu \
749 --prefix=/usr --libdir=/usr/lib64
750 cd make-$(MAKE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
751 cd make-$(MAKE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
753 make-$(MAKE_VERSION).tar.gz:
755 wget -O $@-t https://ftp.gnu.org/gnu/make/make-$(MAKE_VERSION).tar.gz
758 # Cross-compile RPM / rpmbuild.
759 # We build this from a git commit, with a few hacks to the configure
761 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
762 rm -rf rpm-$(RPM_SHORT_COMMIT)
763 tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
764 tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
765 cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
766 cd rpm-$(RPM_SHORT_COMMIT) && \
767 patch -p1 < ../0001-RISCV-64-bit-riscv64-support.patch && \
768 patch -p1 < ../0002-build-fgetc-returns-int-not-char.patch && \
769 patch -p1 < ../0003-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
770 cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
771 cd rpm-$(RPM_SHORT_COMMIT) && \
772 PATH=$(ROOT)/fixed-gcc:$$PATH \
773 LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
775 --host=riscv64-unknown-linux-gnu \
776 --prefix=/usr --libdir=/usr/lib64 \
778 --without-libarchive \
782 --without-external-db \
785 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
786 cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
787 rm -f stage3-chroot/usr/lib64/*.la
789 rpm-$(RPM_SHORT_COMMIT).tar.gz:
791 wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
794 db-$(BDB_VERSION).tar.gz:
796 wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
799 # Create an /init script.
800 stage3-chroot/init: init.sh
801 install -m 0755 $^ $@
803 # Create the stage3 disk image.
804 # Note `-s +...' adds spare space to the disk image.
805 stage3-disk.img: stage3-chroot
806 cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
808 # Upload the compressed disk image.
809 upload-stage3: stage3-disk.img.xz
810 scp $^ tick:public_html/riscv/
811 stage3-disk.img.xz: stage3-disk.img
815 # Helper which boots stage3 disk image in spike.
816 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
817 spike +disk=stage3-disk.img \
818 /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
820 # Helper which boots stage3 disk image in qemu.
821 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
822 qemu-system-riscv -kernel /usr/bin/bbl \
823 -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
824 -drive file=stage3-disk.img,format=raw -nographic