56d330a6c8ee221d564fe69dee517f3e0babba3e
[fedora-riscv.git] / Makefile
1 # Refer to the README file to understand how Fedora on RISC-V is
2 # bootstrapped.
3
4 # Absolute path to the current directory.
5 ROOT := $(shell pwd)
6
7 # Note these are chosen very specifically to ensure the different
8 # versions work together.  Don't blindly update to the latest
9 # versions.  See also:
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
21
22 # For the correct versions, see
23 # riscv-gnu-toolchain/Makefile.in *_version variables
24 BINUTILS_VERSION = 2.25.1
25 GLIBC_VERSION    = 2.22
26 GCC_VERSION      = 5.3.0
27 NEWLIB_VERSION   = 2.2.0
28
29 # See linux-4.1.y-riscv branch of
30 # https://github.com/riscv/riscv-linux
31 KERNEL_VERSION   = 4.1.26
32
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
36
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
42
43 # Versions of cross-compiled packages.
44 NCURSES_VERSION    = 6.0-20160730
45 BASH_VERSION       = 4.3
46 COREUTILS_VERSION  = 8.25
47 GMP_VERSION        = 6.1.1
48 MPFR_VERSION       = 3.1.4
49 MPC_VERSION        = 1.0.3
50 BINUTILS_X_VERSION = 2.26
51 GCC_X_VERSION      = 6.1.0
52 UTIL_LINUX_VERSION = 2.28
53 TAR_VERSION        = 1.29
54 GZIP_VERSION       = 1.8
55 ZLIB_VERSION       = 1.2.8
56 # Needs to match the installed (on host) version, otherwise:
57 # "Cannot use the installed version of file (xx) to cross-compile file yy"
58 FILE_VERSION       = 5.25
59 POPT_VERSION       = 1.16
60 BEECRYPT_VERSION   = 4.2.1
61 RPM_COMMIT         = 95712183458748ea6cafebac1bdd5daa097d9bee
62 RPM_SHORT_COMMIT   = 9571218
63 BDB_VERSION        = 4.5.20
64 NANO_VERSION       = 2.6.2
65 GREP_VERSION       = 2.25
66 LESS_VERSION       = 481
67 STRACE_COMMIT      = f320e1897832fd07a62e18ed288e75d8e79f4c5b
68 STRACE_SHORT_COMMIT = f320e189
69 BZIP2_VERSION      = 1.0.6
70 MAKE_VERSION       = 4.1
71
72 all: stage1 stage2 stage3 stage4
73
74 # Stage 1
75
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
85
86 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
87         rm -f $@ $@-t
88         wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
89         mv $@-t $@
90
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' \
94             < $^ > $@-t
95         mv $@-t $@
96
97 stamp-riscv-qemu-installed:
98         rm -f $@
99         @rpm -q riscv-qemu >/dev/null || { \
100           echo "ERROR: You must install riscv-qemu:"; \
101           echo; \
102           echo "       dnf copr enable rjones/riscv"; \
103           echo "       dnf install riscv-qemu"; \
104           echo; \
105           echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
106           echo; \
107           exit 1; \
108         }
109         @qemu-system-riscv --version || { \
110           echo "ERROR: qemu-system-riscv is not working."; \
111           echo "Make sure you installed the riscv-qemu package."; \
112           exit 1; \
113         }
114         touch $@
115
116 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
117         rm -f $@ $@-t
118         wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
119         mv $@-t $@
120
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' \
124             < $^ > $@-t
125         mv $@-t $@
126
127 stamp-riscv-fesvr-installed:
128         rm -f $@
129         @rpm -q riscv-fesvr >/dev/null || { \
130           echo "ERROR: You must install riscv-fesvr:"; \
131           echo; \
132           echo "       dnf copr enable rjones/riscv"; \
133           echo "       dnf install riscv-fesvr"; \
134           echo; \
135           echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
136           echo; \
137           exit 1; \
138         }
139         touch $@
140
141 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
142         rm -f $@ $@-t
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'
144         mv $@-t $@
145
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' \
149             < $^ > $@-t
150         mv $@-t $@
151
152 stamp-riscv-isa-sim-installed:
153         rm -f $@
154         @rpm -q riscv-isa-sim >/dev/null || { \
155           echo "ERROR: You must install riscv-isa-sim:"; \
156           echo; \
157           echo "       dnf copr enable rjones/riscv"; \
158           echo "       dnf install riscv-isa-sim"; \
159           echo; \
160           echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
161           echo; \
162           exit 1; \
163         }
164         touch $@
165
166 # Stage 2
167
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
178
179 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
180         rm -f $@ $@-t
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
182         mv $@-t $@
183
184 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
185         rm -f $@ $@-t
186         wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
187         mv $@-t $@
188
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:
192         rm -f $@ $@-t
193         wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
194         zcat $@-t | tar xf -
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)
198         mv $@-t $@
199
200 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
201         rm -f $@ $@-t
202         wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
203         mv $@-t $@
204
205 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
206         rm -f $@ $@-t
207         wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
208         mv $@-t $@
209
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' \
217             < $^ > $@-t
218         mv $@-t $@
219
220 stamp-riscv-gnu-toolchain-installed:
221         rm -f $@
222         @rpm -q riscv-gnu-toolchain >/dev/null || { \
223           echo "ERROR: You must install riscv-gnu-toolchain:"; \
224           echo; \
225           echo "       dnf copr enable rjones/riscv"; \
226           echo "       dnf install riscv-gnu-toolchain"; \
227           echo; \
228           echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
229           echo; \
230           exit 1; \
231         }
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."; \
235           exit 1; \
236         }
237         touch $@
238
239 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
240         rm -f $@ $@-t
241         wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
242         mv $@-t $@
243
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' \
247             < $^ > $@-t
248         mv $@-t $@
249
250 stamp-riscv-pk-installed:
251         rm -f $@
252         @rpm -q riscv-pk >/dev/null || { \
253           echo "ERROR: You must install riscv-pk:"; \
254           echo; \
255           echo "       dnf copr enable rjones/riscv"; \
256           echo "       dnf install riscv-pk"; \
257           echo; \
258           echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
259           echo; \
260           exit 1; \
261         }
262         touch $@
263
264 # Stage 3
265
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/rpm \
286         stage3-chroot/usr/bin/nano \
287         stage3-chroot/usr/bin/grep \
288         stage3-chroot/usr/bin/less \
289         stage3-chroot/usr/bin/strace \
290         stage3-chroot/usr/bin/bzip2 \
291         stage3-chroot/usr/bin/make \
292         stage3-chroot/init \
293         stage3-disk.img
294
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) && \
300           git init; \
301         }
302         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
303         git remote add riscv https://github.com/riscv/riscv-linux && \
304         git fetch riscv && \
305         git checkout -f linux-4.1.y-riscv && \
306         make mrproper && \
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
314         ls -l $@
315
316 # Build an original (x86-64) chroot using supermin.  We then aim to
317 # rebuild (using cross-compiled versions) every ELF binary in this
318 # chroot.
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
323         rm -r tmp-supermin.d
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
328
329 # Copy the original chroot to the final chroot, remove all the ELF
330 # files.
331 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
332         rm -rf stage3-chroot
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
338
339 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot.  Only
340 # copy files and symlinks, leave the target directory structure
341 # intact.
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; \
347         done
348         cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
349
350 # Cross-compile ncurses.
351 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
352         tar zxf $^
353         cd ncurses-$(NCURSES_VERSION) && \
354         PATH=$(ROOT)/fixed-gcc:$$PATH \
355         ./configure --host=riscv64-unknown-linux-gnu \
356             --prefix=/usr --libdir=/usr/lib64 \
357             --with-shared \
358             --with-termlib=tinfo \
359             --enable-widec
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
362
363 ncurses-$(NCURSES_VERSION).tgz:
364         rm -f $@ $@-t
365         wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
366         mv $@-t $@
367
368 # Cross-compile bash.
369 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
370         tar zxf $^
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
377
378 bash-$(BASH_VERSION).tar.gz:
379         rm -f $@ $@-t
380         wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
381         mv $@-t $@
382
383 # Cross-compile coreutils.  Bleah, coreutils cross-compilation is
384 # known-broken and upstream don't care, hence the 'touch' command.
385
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
387
388 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
389         rm -rf coreutils-$(COREUTILS_VERSION)
390         tar Jxf $^
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
400
401 coreutils-$(COREUTILS_VERSION).tar.xz:
402         rm -f $@ $@-t
403         wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
404         mv $@-t $@
405
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)
409         zcat $^ | tar xf -
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 \
413         ../configure \
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
418
419 binutils-$(BINUTILS_X_VERSION).tar.gz:
420         rm -f $@ $@-t
421         wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
422         mv $@-t $@
423
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
435
436 gmp-$(GMP_VERSION).tar.lz:
437         rm -f $@ $@-t
438         wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
439         mv $@-t $@
440
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
453
454 mpfr-$(MPFR_VERSION).tar.gz:
455         rm -f $@ $@-t
456         wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
457         mv $@-t $@
458
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
472
473 mpc-$(MPC_VERSION).tar.gz:
474         rm -f $@ $@-t
475         wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
476         mv $@-t $@
477
478 # Cross-compile GCC.
479 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
480         rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
481         zcat $^ | tar xf -
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 \
485         ../configure \
486             --host=riscv64-unknown-linux-gnu \
487             --prefix=/usr --libdir=/usr/lib64 \
488             --enable-shared \
489             --enable-tls \
490             --enable-languages=c,c++ \
491             --disable-libmudflap \
492             --disable-libssp \
493             --disable-libquadmath \
494             --disable-nls \
495             --disable-multilib
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
500
501 gcc-$(GCC_X_VERSION).tar.gz:
502         rm -f $@ $@-t
503         wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
504         mv $@-t $@
505
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)
509         tar -Jxf $^
510         cd util-linux-$(UTIL_LINUX_VERSION) && \
511         PATH=$(ROOT)/fixed-gcc:$$PATH \
512         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
513         ./configure \
514             --host=riscv64-unknown-linux-gnu \
515             --prefix=/usr --libdir=/usr/lib64 \
516             --without-python \
517             --without-systemd \
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
523
524 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
525         rm -f $@ $@-t
526         wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
527         mv $@-t $@
528
529 # Cross-compile GNU tar.
530 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
531         rm -rf tar-$(TAR_VERSION)
532         tar -Jxf $^
533         cd tar-$(TAR_VERSION) && \
534         PATH=$(ROOT)/fixed-gcc:$$PATH \
535         ./configure \
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
540
541 tar-$(TAR_VERSION).tar.xz:
542         rm -f $@ $@-t
543         wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
544         mv $@-t $@
545
546 # Cross-compile GNU gzip.
547 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
548         rm -rf gzip-$(GZIP_VERSION)
549         tar -zxf $^
550         cd gzip-$(GZIP_VERSION) && \
551         PATH=$(ROOT)/fixed-gcc:$$PATH \
552         ./configure \
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
557
558 gzip-$(GZIP_VERSION).tar.gz:
559         rm -f $@ $@-t
560         wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
561         mv $@-t $@
562
563 # Cross-compile zlib.
564 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
565         rm -rf zlib-$(ZLIB_VERSION)
566         tar -zxf $^
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" \
571         ./configure \
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
575
576 zlib-$(ZLIB_VERSION).tar.gz:
577         rm -f $@ $@-t
578         wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
579         mv $@-t $@
580
581 # Cross-compile file/libmagic.
582 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
583         rm -rf file-$(FILE_VERSION)
584         tar -zxf $^
585         cd file-$(FILE_VERSION) && \
586         PATH=$(ROOT)/fixed-gcc:$$PATH \
587         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
588         ./configure \
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
595
596 file-$(FILE_VERSION).tar.gz:
597         rm -f $@ $@-t
598         wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
599         mv $@-t $@
600
601 # Cross-compile popt.
602 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
603         rm -rf popt-$(POPT_VERSION)
604         tar -zxf $^
605         cd popt-$(POPT_VERSION) && \
606         PATH=$(ROOT)/fixed-gcc:$$PATH \
607         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
608         ./configure \
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
615
616 popt-$(POPT_VERSION).tar.gz:
617         rm -f $@ $@-t
618         wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
619         mv $@-t $@
620
621 # Cross-compile beecrypt.
622 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
623         rm -rf beecrypt-$(BEECRYPT_VERSION)
624         tar -zxf $^
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 \
630         ./configure \
631             --host=riscv64-unknown-linux-gnu \
632             --prefix=/usr --libdir=/usr/lib64 \
633             --without-cplusplus \
634             --without-java \
635             --disable-openmp \
636             --disable-static \
637             --enable-shared
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
642
643 beecrypt-$(BEECRYPT_VERSION).tar.gz:
644         rm -f $@ $@-t
645         wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
646         mv $@-t $@
647
648 # Cross-compile RPM / rpmbuild.
649 # We build this from a git commit, with a few hacks to the configure
650 # script.
651 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
652         rm -rf rpm-$(RPM_SHORT_COMMIT)
653         tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
654         tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
655         cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
656         cd rpm-$(RPM_SHORT_COMMIT) && \
657         patch -p1 < ../0001-RISCV-64-bit-riscv64-support.patch && \
658         patch -p1 < ../0002-build-fgetc-returns-int-not-char.patch && \
659         patch -p1 < ../0003-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
660         cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
661         cd rpm-$(RPM_SHORT_COMMIT) && \
662         PATH=$(ROOT)/fixed-gcc:$$PATH \
663         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
664         ./configure \
665             --host=riscv64-unknown-linux-gnu \
666             --prefix=/usr --libdir=/usr/lib64 \
667             --disable-rpath \
668             --without-libarchive \
669             --without-lua \
670             --with-beecrypt \
671             --without-archive \
672             --without-external-db \
673             --enable-ndb \
674             --disable-plugins
675         cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
676         cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
677         rm -f stage3-chroot/usr/lib64/*.la
678
679 rpm-$(RPM_SHORT_COMMIT).tar.gz:
680         rm -f $@ $@-t
681         wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
682         mv $@-t $@
683
684 db-$(BDB_VERSION).tar.gz:
685         rm -f $@ $@-t
686         wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
687         mv $@-t $@
688
689 # Cross-compile GNU nano (editor).
690 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
691         rm -rf nano-$(NANO_VERSION)
692         tar -zxf $^
693         cd nano-$(NANO_VERSION) && \
694         PATH=$(ROOT)/fixed-gcc:$$PATH \
695         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
696         ./configure \
697             --host=riscv64-unknown-linux-gnu \
698             --prefix=/usr --libdir=/usr/lib64
699         cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
700         cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
701
702 nano-$(NANO_VERSION).tar.gz:
703         rm -f $@ $@-t
704         wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
705         mv $@-t $@
706
707 # Cross-compile GNU grep.
708 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
709         rm -rf grep-$(GREP_VERSION)
710         tar -Jxf $^
711         cd grep-$(GREP_VERSION) && \
712         PATH=$(ROOT)/fixed-gcc:$$PATH \
713         ./configure \
714             --host=riscv64-unknown-linux-gnu \
715             --prefix=/usr --libdir=/usr/lib64
716         cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
717         cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
718
719 grep-$(GREP_VERSION).tar.xz:
720         rm -f $@ $@-t
721         wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
722         mv $@-t $@
723
724 # Cross-compile less.
725 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
726         rm -rf less-$(LESS_VERSION)
727         tar -zxf $^
728         cd less-$(LESS_VERSION) && \
729         PATH=$(ROOT)/fixed-gcc:$$PATH \
730         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
731         ./configure \
732             --host=riscv64-unknown-linux-gnu \
733             --prefix=/usr --libdir=/usr/lib64
734         cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
735         cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
736
737 less-$(LESS_VERSION).tar.gz:
738         rm -f $@ $@-t
739         wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
740         mv $@-t $@
741
742 # Cross-compile strace.
743 # XXX This does not work.
744 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
745         rm -rf strace-$(STRACE_SHORT_COMMIT)
746         tar -zxf $^
747         cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
748         cd riscv-strace-$(STRACE_COMMIT) && \
749         PATH=$(ROOT)/fixed-gcc:$$PATH \
750         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
751         ./configure \
752             --host=riscv64-unknown-linux-gnu \
753             --prefix=/usr --libdir=/usr/lib64
754         cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
755         cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
756
757 strace-$(STRACE_SHORT_COMMIT).tar.gz:
758         rm -f $@ $@-t
759         wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
760         mv $@-t $@
761
762 # Cross-compile bzip2.
763 stage3-chroot/usr/bin/bzip2: bzip2-$(BZIP2_VERSION).tar.gz
764         rm -rf bzip2-$(BZIP2_VERSION)
765         tar -zxf $^
766         cd bzip2-$(BZIP2_VERSION) && \
767         PATH=$(ROOT)/fixed-gcc:$$PATH \
768         make libbz2.a bzip2 bzip2recover \
769         PREFIX=/usr \
770         CC=riscv64-unknown-linux-gnu-gcc \
771         AR=riscv64-unknown-linux-gnu-ar \
772         RANLIB=riscv64-unknown-linux-gnu-ranlib
773         cd bzip2-$(BZIP2_VERSION) && \
774         make install PREFIX=$(ROOT)/stage3-chroot/usr
775
776 bzip2-$(BZIP2_VERSION).tar.gz:
777         rm -f $@ $@-t
778         wget -O $@-t http://www.bzip.org/1.0.6/bzip2-$(BZIP2_VERSION).tar.gz
779         mv $@-t $@
780
781 # Cross-compile GNU make.
782 stage3-chroot/usr/bin/make: make-$(MAKE_VERSION).tar.gz
783         rm -rf make-$(MAKE_VERSION)
784         tar -zxf $^
785         cd make-$(MAKE_VERSION) && \
786         PATH=$(ROOT)/fixed-gcc:$$PATH \
787         ./configure \
788             --host=riscv64-unknown-linux-gnu \
789             --prefix=/usr --libdir=/usr/lib64
790         cd make-$(MAKE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
791         cd make-$(MAKE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
792
793 make-$(MAKE_VERSION).tar.gz:
794         rm -f $@ $@-t
795         wget -O $@-t https://ftp.gnu.org/gnu/make/make-$(MAKE_VERSION).tar.gz
796         mv $@-t $@
797
798 # Create an /init script.
799 stage3-chroot/init: init.sh
800         install -m 0755 $^ $@
801
802 # Create the stage3 disk image.
803 # Note `-s +...' adds spare space to the disk image.
804 stage3-disk.img: stage3-chroot
805         cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
806
807 # Upload the compressed disk image.
808 upload-stage3: stage3-disk.img.xz
809         scp $^ tick:public_html/riscv/
810 stage3-disk.img.xz: stage3-disk.img
811         rm -f $@
812         xz --best $^
813
814 # Helper which boots stage3 disk image in spike.
815 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
816         spike +disk=stage3-disk.img \
817             /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
818
819 # Helper which boots stage3 disk image in qemu.
820 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
821         qemu-system-riscv -kernel /usr/bin/bbl \
822             -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
823             -drive file=stage3-disk.img,format=raw -nographic
824
825 # Stage 4
826
827 stage4:
828         echo "XXX TO DO"
829         exit 1
830
831 .NOTPARALLEL: