Fix mpc-devel -> libmpc-devel.
[fedora-riscv.git] / Makefile
index 2cc075c..64e35a5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,9 @@
 # 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:
@@ -31,12 +34,58 @@ KERNEL_VERSION   = 4.1.26
 # git commits (optional).
 LOCAL_LINUX_GIT_COPY = $(HOME)/d/linux
 
-# The root packages (plus their dependencies) that we want to
-# cross-compile into the stage 3 chroot.
-STAGE3_PACKAGES = gcc rpm-build
+# The root packages (plus their dependencies) that we want to in the
+# stage 3 chroot.  This must include all the cross-compiled packages
+# below, and may also include any noarch package we like.
+STAGE3_PACKAGES = iso-codes \
+ncurses-devel readline-devel bash coreutils gmp-devel \
+mpfr-devel libmpc-devel binutils gcc gcc-c++ util-linux tar \
+gzip zlib-devel file-devel popt-devel beecrypt-devel \
+rpm rpm-build rpm-devel libdb-utils libdb-devel nano \
+grep less strace bzip2-devel make diffutils findutils \
+sed patch hostname gettext-devel lua-devel xz-devel gawk \
+vim
 
 # Versions of cross-compiled packages.
-BASH_VERSION    = 4.3
+NCURSES_VERSION    = 6.0-20160730
+READLINE_VERSION   = 6.3
+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
+TAR_VERSION        = 1.29
+GZIP_VERSION       = 1.8
+ZLIB_VERSION       = 1.2.8
+# Needs to match the version of 'file' installed (on host), otherwise:
+#   "Cannot use the installed version of file (xx) to cross-compile file yy"
+# Also note that 5.25 is definitely broken (segfaults in libmagic:magic_close).
+FILE_VERSION       = 5.28
+POPT_VERSION       = 1.16
+BEECRYPT_VERSION   = 4.2.1
+RPM_COMMIT         = 95712183458748ea6cafebac1bdd5daa097d9bee
+RPM_SHORT_COMMIT   = 9571218
+BDB_VERSION        = 4.5.20
+NANO_VERSION       = 2.6.2
+GREP_VERSION       = 2.25
+LESS_VERSION       = 481
+STRACE_COMMIT      = f320e1897832fd07a62e18ed288e75d8e79f4c5b
+STRACE_SHORT_COMMIT = f320e189
+BZIP2_VERSION      = 1.0.6
+MAKE_VERSION       = 4.1
+DIFFUTILS_VERSION  = 3.4
+FINDUTILS_VERSION  = 4.6.0
+SED_VERSION        = 4.2
+PATCH_VERSION      = 2.7.5
+HOSTNAME_VERSION   = 3.15
+GETTEXT_VERSION    = 0.19
+LUA_VERSION        = 5.3.3
+XZ_VERSION         = 5.2.2
+GAWK_VERSION       = 4.1.3
+VIM_VERSION        = 7.4
 
 all: stage1 stage2 stage3 stage4
 
@@ -236,7 +285,39 @@ stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
        stage3-chroot-original/etc/fedora-release \
        stage3-chroot/etc/fedora-release \
        stage3-chroot/lib64/libc.so.6 \
+       stage3-chroot/usr/bin/tic \
+       stage3-chroot/usr/lib64/libhistory.so.6 \
        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/usr/bin/tar \
+       stage3-chroot/usr/bin/gzip \
+       stage3-chroot/usr/lib64/libz.so \
+       stage3-chroot/usr/bin/file \
+       stage3-chroot/usr/lib64/libpopt.so \
+       stage3-chroot/usr/lib64/libbeecrypt.so \
+       stage3-chroot/usr/bin/nano \
+       stage3-chroot/usr/bin/grep \
+       stage3-chroot/usr/bin/less \
+       stage3-chroot/usr/bin/strace \
+       stage3-chroot/usr/bin/bzip2 \
+       stage3-chroot/usr/bin/make \
+       stage3-chroot/usr/bin/diff \
+       stage3-chroot/usr/bin/find \
+       stage3-chroot/usr/bin/sed \
+       stage3-chroot/usr/bin/patch \
+       stage3-chroot/usr/bin/hostname \
+       stage3-chroot/usr/bin/gettext \
+       stage3-chroot/usr/bin/lua \
+       stage3-chroot/usr/bin/rpm \
+       stage3-chroot/usr/bin/xz \
+       stage3-chroot/usr/bin/gawk \
+       stage3-chroot/usr/bin/vim \
        stage3-chroot/init \
        stage3-disk.img
 
@@ -279,9 +360,9 @@ stage3-chroot-original/etc/fedora-release:
 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
        rm -rf stage3-chroot
        cp -a stage3-chroot-original stage3-chroot
-       find stage3-chroot -type d | xargs chmod u+w
-       find stage3-chroot -type f | xargs chmod u+w
-       find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
+       find stage3-chroot -type d -print0 | xargs -0 chmod u+w
+       find stage3-chroot -type f -print0 | xargs -0 chmod u+w
+       find stage3-chroot -type f -print0 | xargs -0 file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
        rm -f stage3-chroot/lib64/libc.so.6
 
 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot.  Only
@@ -295,19 +376,651 @@ stage3-chroot/lib64/libc.so.6:
        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 \
+           --with-termlib=tinfo \
+           --enable-widec
+       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
+
+ncurses-$(NCURSES_VERSION).tgz:
+       rm -f $@ $@-t
+       wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
+       mv $@-t $@
+
+# Cross-compile readline.
+stage3-chroot/usr/lib64/libhistory.so.6: readline-$(READLINE_VERSION).tar.gz
+       tar zxf $^
+       cd readline-$(READLINE_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       bash_cv_wcwidth_broken=no \
+       ./configure --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd readline-$(READLINE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd readline-$(READLINE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+readline-$(READLINE_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t ftp://ftp.gnu.org/gnu/readline/readline-$(READLINE_VERSION).tar.gz
+       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
        wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
        mv $@-t $@
 
+# Cross-compile coreutils.  Bleah, coreutils cross-compilation is
+# known-broken and upstream don't care, hence the 'touch' command.
+
+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
+
+stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
+       rm -rf coreutils-$(COREUTILS_VERSION)
+       tar Jxf $^
+       cd coreutils-$(COREUTILS_VERSION) && \
+       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) && 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 riscv-binutils-gdb-riscv-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
+       rm -f stage3-chroot/usr/lib64/*.la
+
+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
+       rm -f stage3-chroot/usr/lib64/*.la
+
+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 -
+       cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION) && \
+       patch -p1 < ../0001-HACKS-TO-GET-GCC-TO-COMPILE.patch
+       mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
+       cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
+       gcc_cv_as_leb128=no \
+       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
+       cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && gcc_cv_as_leb128=no PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+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.
+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 \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64 \
+           --without-python \
+           --without-systemd \
+           --disable-makeinstall-chown \
+           --enable-static-programs=mount
+       cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+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 $@
+
+# Cross-compile GNU tar.
+stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
+       rm -rf tar-$(TAR_VERSION)
+       tar -Jxf $^
+       cd tar-$(TAR_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+tar-$(TAR_VERSION).tar.xz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
+       mv $@-t $@
+
+# Cross-compile GNU gzip.
+stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
+       rm -rf gzip-$(GZIP_VERSION)
+       tar -zxf $^
+       cd gzip-$(GZIP_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+gzip-$(GZIP_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile zlib.
+stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
+       rm -rf zlib-$(ZLIB_VERSION)
+       tar -zxf $^
+       cd zlib-$(ZLIB_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       CC=riscv64-unknown-linux-gnu-gcc \
+       CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
+       ./configure \
+           --prefix=/usr --libdir=/usr/lib64
+       cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
+       cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+zlib-$(ZLIB_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile file/libmagic.
+stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
+       rm -rf file-$(FILE_VERSION)
+       tar -zxf $^
+       cd file-$(FILE_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64 \
+           --disable-static --enable-shared
+       cd file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
+       cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+file-$(FILE_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile popt.
+stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
+       rm -rf popt-$(POPT_VERSION)
+       tar -zxf $^
+       cd popt-$(POPT_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64 \
+           --disable-static --enable-shared
+       cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
+       cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+popt-$(POPT_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile beecrypt.
+stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
+       rm -rf beecrypt-$(BEECRYPT_VERSION)
+       tar -zxf $^
+       cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
+       cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
+       cd beecrypt-$(BEECRYPT_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64 \
+           --without-cplusplus \
+           --without-java \
+           --disable-openmp \
+           --disable-static \
+           --enable-shared
+       cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
+       cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
+       chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
+       rm -f stage3-chroot/usr/lib64/*.la
+
+beecrypt-$(BEECRYPT_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU nano (editor).
+stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
+       rm -rf nano-$(NANO_VERSION)
+       tar -zxf $^
+       cd nano-$(NANO_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+nano-$(NANO_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU grep.
+stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
+       rm -rf grep-$(GREP_VERSION)
+       tar -Jxf $^
+       cd grep-$(GREP_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+grep-$(GREP_VERSION).tar.xz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
+       mv $@-t $@
+
+# Cross-compile less.
+stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
+       rm -rf less-$(LESS_VERSION)
+       tar -zxf $^
+       cd less-$(LESS_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+less-$(LESS_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile strace.
+# XXX This does not work.
+stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
+       rm -rf strace-$(STRACE_SHORT_COMMIT)
+       tar -zxf $^
+       cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
+       cd riscv-strace-$(STRACE_COMMIT) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+strace-$(STRACE_SHORT_COMMIT).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
+       mv $@-t $@
+
+# Cross-compile bzip2.
+stage3-chroot/usr/bin/bzip2: bzip2-$(BZIP2_VERSION).tar.gz
+       rm -rf bzip2-$(BZIP2_VERSION)
+       tar -zxf $^
+       cd bzip2-$(BZIP2_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       make libbz2.a bzip2 bzip2recover \
+       PREFIX=/usr \
+       CC=riscv64-unknown-linux-gnu-gcc \
+       AR=riscv64-unknown-linux-gnu-ar \
+       RANLIB=riscv64-unknown-linux-gnu-ranlib \
+       CFLAGS="-Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -fPIC"
+       cd bzip2-$(BZIP2_VERSION) && \
+       make install PREFIX=$(ROOT)/stage3-chroot/usr
+
+bzip2-$(BZIP2_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://www.bzip.org/1.0.6/bzip2-$(BZIP2_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU make.
+stage3-chroot/usr/bin/make: make-$(MAKE_VERSION).tar.gz
+       rm -rf make-$(MAKE_VERSION)
+       tar -zxf $^
+       cd make-$(MAKE_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd make-$(MAKE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd make-$(MAKE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+make-$(MAKE_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/make/make-$(MAKE_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU diffutils.
+stage3-chroot/usr/bin/diff: diffutils-$(DIFFUTILS_VERSION).tar.xz
+       rm -rf diffutils-$(DIFFUTILS_VERSION)
+       tar -Jxf $^
+       cd diffutils-$(DIFFUTILS_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd diffutils-$(DIFFUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd diffutils-$(DIFFUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+diffutils-$(DIFFUTILS_VERSION).tar.xz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/diffutils/diffutils-$(DIFFUTILS_VERSION).tar.xz
+       mv $@-t $@
+
+# Cross-compile GNU findutils.
+stage3-chroot/usr/bin/find: findutils-$(FINDUTILS_VERSION).tar.gz
+       rm -rf findutils-$(FINDUTILS_VERSION)
+       tar -zxf $^
+       cd findutils-$(FINDUTILS_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd findutils-$(FINDUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd findutils-$(FINDUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+findutils-$(FINDUTILS_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/findutils/findutils-$(FINDUTILS_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU sed.
+stage3-chroot/usr/bin/sed: sed-$(SED_VERSION).tar.gz
+       rm -rf sed-$(SED_VERSION)
+       tar -zxf $^
+       cd sed-$(SED_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd sed-$(SED_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd sed-$(SED_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+sed-$(SED_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/sed/sed-$(SED_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile patch.
+stage3-chroot/usr/bin/patch: patch-$(PATCH_VERSION).tar.gz
+       rm -rf patch-$(PATCH_VERSION)
+       tar -zxf $^
+       cd patch-$(PATCH_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd patch-$(PATCH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd patch-$(PATCH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+patch-$(PATCH_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/patch/patch-$(PATCH_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile hostname.
+stage3-chroot/usr/bin/hostname: hostname-$(HOSTNAME_VERSION).tar.gz
+       rm -rf hostname-$(HOSTNAME_VERSION)
+       tar -zxf $^
+       cd hostname && patch -p1 < ../hostname-rh.patch
+       cd hostname && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       make \
+       CC=riscv64-unknown-linux-gnu-gcc \
+       CFLAGS="-O2 -g"
+       cd hostname && make install BASEDIR=$(ROOT)/stage3-chroot
+
+hostname-$(HOSTNAME_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://ftp.de.debian.org/debian/pool/main/h/hostname/hostname_$(HOSTNAME_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU gettext.
+stage3-chroot/usr/bin/gettext: gettext-$(GETTEXT_VERSION).tar.gz
+       rm -rf gettext-$(GETTEXT_VERSION)
+       tar -zxf $^
+       cd gettext-$(GETTEXT_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd gettext-$(GETTEXT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd gettext-$(GETTEXT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+gettext-$(GETTEXT_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/gettext/gettext-$(GETTEXT_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile lua.
+stage3-chroot/usr/bin/lua: lua-$(LUA_VERSION).tar.gz
+       rm -rf lua-$(LUA_VERSION)
+       tar -zxf $^
+       cd lua-$(LUA_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make PLAT=linux INSTALL_TOP=/usr CC=riscv64-unknown-linux-gnu-gcc AR="riscv64-unknown-linux-gnu-ar rcu" RANLIB="riscv64-unknown-linux-gnu-ranlib" MYLDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 MYLIBS=-ltinfo MYCFLAGS="-fPIC -DLUA_COMPAT_5_1"
+       cd lua-$(LUA_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install INSTALL_TOP=$(ROOT)/stage3-chroot/usr INSTALL_LIB=$(ROOT)/stage3-chroot/usr/lib64
+
+lua-$(LUA_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://www.lua.org/ftp/lua-$(LUA_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile xz.
+stage3-chroot/usr/bin/xz: xz-$(XZ_VERSION).tar.gz
+       rm -rf xz-$(XZ_VERSION)
+       tar -zxf $^
+       cd xz-$(XZ_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd xz-$(XZ_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd xz-$(XZ_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+xz-$(XZ_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://tukaani.org/xz/xz-$(XZ_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile GNU awk.
+stage3-chroot/usr/bin/gawk: gawk-$(GAWK_VERSION).tar.gz
+       rm -rf gawk-$(GAWK_VERSION)
+       tar -zxf $^
+       cd gawk-$(GAWK_VERSION) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64
+       cd gawk-$(GAWK_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd gawk-$(GAWK_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
+
+gawk-$(GAWK_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t https://ftp.gnu.org/gnu/gawk/gawk-$(GAWK_VERSION).tar.gz
+       mv $@-t $@
+
+# Cross-compile vim.
+stage3-chroot/usr/bin/vim: vim-$(VIM_VERSION).tar.gz
+       rm -rf vim-$(VIM_VERSION)
+       bzcat $^ | tar xf -
+       cd vim74/src && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       vim_cv_memmove_handles_overlap=yes \
+       vim_cv_stat_ignores_slash=no \
+       vim_cv_getcwd_broken=no \
+       vim_cv_tty_group=world \
+       vim_cv_terminfo=yes \
+       vim_cv_toupper_broken=no \
+       LDFLAGS=-L/home/rjones/d/fedora-riscv/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64 \
+           --with-tlib=tinfo
+       cd vim74/src && PATH=$(ROOT)/fixed-gcc:$$PATH make
+       cd vim74/src && make install DESTDIR=$(ROOT)/stage3-chroot STRIP=riscv64-unknown-linux-gnu-strip
+
+vim-$(VIM_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t ftp://ftp.vim.org/pub/vim/unix/vim-$(VIM_VERSION).tar.bz2
+       mv $@-t $@
+
+# Cross-compile RPM / rpmbuild.
+# We build this from a git commit, with a few hacks to the configure
+# script.
+stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
+       rm -rf rpm-$(RPM_SHORT_COMMIT)
+       tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
+       tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
+       cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
+       cd rpm-$(RPM_SHORT_COMMIT) && \
+       patch -p1 < ../0001-RISCV-64-bit-riscv64-support.patch && \
+       patch -p1 < ../0002-rpmrc-Convert-uname.machine-riscv-to-riscv32-riscv64.patch && \
+       patch -p1 < ../0003-build-fgetc-returns-int-not-char.patch && \
+       patch -p1 < ../0004-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
+       cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
+       cd rpm-$(RPM_SHORT_COMMIT) && \
+       PATH=$(ROOT)/fixed-gcc:$$PATH \
+       LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
+       ./configure \
+           --host=riscv64-unknown-linux-gnu \
+           --prefix=/usr --libdir=/usr/lib64 \
+           --disable-rpath \
+           --with-vendor=redhat \
+           --without-libarchive \
+           --with-lua \
+           --with-beecrypt \
+           --without-archive \
+           --without-external-db \
+           --enable-ndb \
+           --disable-plugins
+       cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
+       cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
+       rm -f stage3-chroot/usr/lib64/*.la
+
+rpm-$(RPM_SHORT_COMMIT).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
+       mv $@-t $@
+
+db-$(BDB_VERSION).tar.gz:
+       rm -f $@ $@-t
+       wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
+       mv $@-t $@
+
 # Create an /init script.
 stage3-chroot/init: init.sh
        install -m 0755 $^ $@
@@ -317,6 +1030,24 @@ stage3-chroot/init: init.sh
 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 \
+           /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
+
+# Helper which boots stage3 disk image in qemu.
+boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
+       qemu-system-riscv -kernel /usr/bin/bbl \
+           -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
+           -drive file=stage3-disk.img,format=raw -nographic
+
 # Stage 4
 
 stage4: