# Refer to the README file to understand how Fedora on RISC-V is
# bootstrapped.
+# Absolute path to the current directory.
+ROOT := $(shell pwd)
+
# Note these are chosen very specifically to ensure the different
# versions work together. Don't blindly update to the latest
# versions. See also:
STAGE3_PACKAGES = gcc rpm-build
# Versions of cross-compiled packages.
-BASH_VERSION = 4.3
-COREUTILS_VERSION = 8.25
+NCURSES_VERSION = 6.0-20160730
+BASH_VERSION = 4.3
+COREUTILS_VERSION = 8.25
+GMP_VERSION = 6.1.1
+MPFR_VERSION = 3.1.4
+MPC_VERSION = 1.0.3
+BINUTILS_X_VERSION = 2.26
+GCC_X_VERSION = 6.1.0
+UTIL_LINUX_VERSION = 2.28
all: stage1 stage2 stage3 stage4
stage3-chroot-original/etc/fedora-release \
stage3-chroot/etc/fedora-release \
stage3-chroot/lib64/libc.so.6 \
+ stage3-chroot/usr/bin/tic \
stage3-chroot/bin/bash \
stage3-chroot/bin/ls \
+ stage3-chroot/usr/lib64/libgmp.so.10 \
+ stage3-chroot/usr/lib64/libmpfr.so.4 \
+ stage3-chroot/usr/lib64/libmpc.so.3 \
+ stage3-chroot/usr/bin/as \
+ stage3-chroot/usr/bin/gcc \
+ stage3-chroot/usr/bin/mount \
stage3-chroot/init \
stage3-disk.img
done
cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
+# Cross-compile ncurses.
+stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
+ tar zxf $^
+ cd ncurses-$(NCURSES_VERSION) && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64 \
+ --with-shared
+ cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
+ cd $(ROOT)/stage3-chroot/usr/lib64 && ln -sf libtinfo.so.6 libtinfo.so
+
+ncurses-$(NCURSES_VERSION).tgz:
+ rm -f $@ $@-t
+ wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
+ mv $@-t $@
+
# Cross-compile bash.
stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
tar zxf $^
cd bash-$(BASH_VERSION) && \
- ./configure --host=riscv64-unknown-linux-gnu CFLAGS="--sysroot=/usr/sysroot" && \
- make
- cp bash-$(BASH_VERSION)/bash stage3-chroot/bin/
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64
+ cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
bash-$(BASH_VERSION).tar.gz:
rm -f $@ $@-t
rm -rf coreutils-$(COREUTILS_VERSION)
tar Jxf $^
cd coreutils-$(COREUTILS_VERSION) && \
- ./configure --host=riscv64-unknown-linux-gnu CFLAGS="--sysroot=/usr/sysroot"
- -cd coreutils-$(COREUTILS_VERSION) && make
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64
+ -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
cd coreutils-$(COREUTILS_VERSION)/man && \
for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
- cd coreutils-$(COREUTILS_VERSION) && make
- for f in $(COREUTILS_PROGRAMS); do \
- cp coreutils-$(COREUTILS_VERSION)/src/$$f stage3-chroot/bin/; \
- done
+ cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
coreutils-$(COREUTILS_VERSION).tar.xz:
rm -f $@ $@-t
wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
mv $@-t $@
+# Cross-compile binutils.
+stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
+ rm -rf binutils-$(BINUTILS_X_VERSION)
+ zcat $^ | tar xf -
+ mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
+ cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ../configure \
+ --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64
+ cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
+
+binutils-$(BINUTILS_X_VERSION).tar.gz:
+ rm -f $@ $@-t
+ wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
+ mv $@-t $@
+
+# Cross-compile GMP, MPFR and MPC (deps of GCC).
+stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
+ rm -rf gmp-$(GMP_VERSION)
+ tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
+ cd gmp-$(GMP_VERSION) && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64
+ cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+ cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
+
+gmp-$(GMP_VERSION).tar.lz:
+ rm -f $@ $@-t
+ wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
+ mv $@-t $@
+
+stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
+ rm -rf mpfr-$(MPFR_VERSION)
+ tar -zxf mpfr-$(MPFR_VERSION).tar.gz
+ cd mpfr-$(MPFR_VERSION) && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64 \
+ --with-gmp=$(ROOT)/stage3-chroot/usr
+ cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+ cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
+
+mpfr-$(MPFR_VERSION).tar.gz:
+ rm -f $@ $@-t
+ wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
+ mv $@-t $@
+
+stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
+ rm -rf mpc-$(MPC_VERSION)
+ tar -zxf mpc-$(MPC_VERSION).tar.gz
+ cd mpc-$(MPC_VERSION) && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64 \
+ --with-gmp=$(ROOT)/stage3-chroot/usr \
+ --with-mpfr=$(ROOT)/stage3-chroot/usr
+ cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+ cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+ cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
+
+mpc-$(MPC_VERSION).tar.gz:
+ rm -f $@ $@-t
+ wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
+ mv $@-t $@
+
+# Cross-compile GCC.
+stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
+ rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
+ zcat $^ | tar xf -
+ mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
+ cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ../configure \
+ --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64 \
+ --enable-shared \
+ --enable-tls \
+ --enable-languages=c,c++ \
+ --disable-libmudflap \
+ --disable-libssp \
+ --disable-libquadmath \
+ --disable-nls \
+ --disable-multilib
+# XXX use make all & make install here. However building libgcc
+# fails, see 'broken-gcc.log'.
+ cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
+ cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
+
+gcc-$(GCC_X_VERSION).tar.gz:
+ rm -f $@ $@-t
+ wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
+ mv $@-t $@
+
+# Cross-compile util-linux.
+# XXX Be nice to fix ncurses/tinfo support which in theory should work.
+stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
+ rm -rf util-linux-$(UTIL_LINUX_VERSION)
+ tar -Jxf $^
+ cd util-linux-$(UTIL_LINUX_VERSION) && \
+ PATH=$(ROOT)/fixed-gcc:$$PATH \
+ ./configure \
+ --host=riscv64-unknown-linux-gnu \
+ --prefix=/usr --libdir=/usr/lib64 \
+ --without-python \
+ --without-tinfo \
+ --without-ncurses \
+ --without-systemd \
+ --disable-makeinstall-chown
+ cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+# libtool fucks something up here, ignore the failure and continue.
+ -cd util-linux-$(UTIL_LINUX_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot -j1 -k V=1
+
+util-linux-$(UTIL_LINUX_VERSION).tar.xz:
+ rm -f $@ $@-t
+ wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
+ mv $@-t $@
+
# Create an /init script.
stage3-chroot/init: init.sh
install -m 0755 $^ $@
stage3-disk.img: stage3-chroot
cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
+# Upload the compressed disk image.
+upload-stage3: stage3-disk.img.xz
+ scp $^ tick:public_html/riscv/
+stage3-disk.img.xz: stage3-disk.img
+ rm -f $@
+ xz --best $^
+
# Helper which boots stage3 disk image in spike.
boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
spike +disk=stage3-disk.img \