Add tar, gzip, zlib to stage3 chroot.
[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 STAGE3_PACKAGES = gcc rpm-build
40
41 # Versions of cross-compiled packages.
42 NCURSES_VERSION    = 6.0-20160730
43 BASH_VERSION       = 4.3
44 COREUTILS_VERSION  = 8.25
45 GMP_VERSION        = 6.1.1
46 MPFR_VERSION       = 3.1.4
47 MPC_VERSION        = 1.0.3
48 BINUTILS_X_VERSION = 2.26
49 GCC_X_VERSION      = 6.1.0
50 UTIL_LINUX_VERSION = 2.28
51 TAR_VERSION        = 1.29
52 GZIP_VERSION       = 1.8
53 ZLIB_VERSION       = 1.2.8
54
55 all: stage1 stage2 stage3 stage4
56
57 # Stage 1
58
59 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
60         stage1-riscv-qemu/riscv-qemu.spec \
61         stamp-riscv-qemu-installed \
62         stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
63         stage1-riscv-fesvr/riscv-fesvr.spec \
64         stamp-riscv-fesvr-installed \
65         stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
66         stage1-riscv-isa-sim/riscv-isa-sim.spec \
67         stamp-riscv-isa-sim-installed
68
69 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
70         rm -f $@ $@-t
71         wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
72         mv $@-t $@
73
74 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
75         sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
76             -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
77             < $^ > $@-t
78         mv $@-t $@
79
80 stamp-riscv-qemu-installed:
81         rm -f $@
82         @rpm -q riscv-qemu >/dev/null || { \
83           echo "ERROR: You must install riscv-qemu:"; \
84           echo; \
85           echo "       dnf copr enable rjones/riscv"; \
86           echo "       dnf install riscv-qemu"; \
87           echo; \
88           echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
89           echo; \
90           exit 1; \
91         }
92         @qemu-system-riscv --version || { \
93           echo "ERROR: qemu-system-riscv is not working."; \
94           echo "Make sure you installed the riscv-qemu package."; \
95           exit 1; \
96         }
97         touch $@
98
99 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
100         rm -f $@ $@-t
101         wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
102         mv $@-t $@
103
104 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
105         sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
106             -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
107             < $^ > $@-t
108         mv $@-t $@
109
110 stamp-riscv-fesvr-installed:
111         rm -f $@
112         @rpm -q riscv-fesvr >/dev/null || { \
113           echo "ERROR: You must install riscv-fesvr:"; \
114           echo; \
115           echo "       dnf copr enable rjones/riscv"; \
116           echo "       dnf install riscv-fesvr"; \
117           echo; \
118           echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
119           echo; \
120           exit 1; \
121         }
122         touch $@
123
124 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
125         rm -f $@ $@-t
126         wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
127         mv $@-t $@
128
129 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
130         sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
131             -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
132             < $^ > $@-t
133         mv $@-t $@
134
135 stamp-riscv-isa-sim-installed:
136         rm -f $@
137         @rpm -q riscv-isa-sim >/dev/null || { \
138           echo "ERROR: You must install riscv-isa-sim:"; \
139           echo; \
140           echo "       dnf copr enable rjones/riscv"; \
141           echo "       dnf install riscv-isa-sim"; \
142           echo; \
143           echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
144           echo; \
145           exit 1; \
146         }
147         touch $@
148
149 # Stage 2
150
151 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
152         stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
153         stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
154         stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
155         stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
156         stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
157         stamp-riscv-gnu-toolchain-installed \
158         stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
159         stage2-riscv-pk/riscv-pk.spec \
160         stamp-riscv-pk-installed
161
162 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
163         rm -f $@ $@-t
164         wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
165         mv $@-t $@
166
167 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
168         rm -f $@ $@-t
169         wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
170         mv $@-t $@
171
172 # GCC 5 no longer compiles with GCC 6 unless we patch it.
173 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
174 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
175         rm -f $@ $@-t
176         wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
177         zcat $@-t | tar xf -
178         cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
179         tar zcf $@-t gcc-$(GCC_VERSION)
180         rm -r gcc-$(GCC_VERSION)
181         mv $@-t $@
182
183 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
184         rm -f $@ $@-t
185         wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
186         mv $@-t $@
187
188 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
189         rm -f $@ $@-t
190         wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
191         mv $@-t $@
192
193 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
194         sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
195             -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
196             -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
197             -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
198             -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
199             -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
200             < $^ > $@-t
201         mv $@-t $@
202
203 stamp-riscv-gnu-toolchain-installed:
204         rm -f $@
205         @rpm -q riscv-gnu-toolchain >/dev/null || { \
206           echo "ERROR: You must install riscv-gnu-toolchain:"; \
207           echo; \
208           echo "       dnf copr enable rjones/riscv"; \
209           echo "       dnf install riscv-gnu-toolchain"; \
210           echo; \
211           echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
212           echo; \
213           exit 1; \
214         }
215         @riscv64-unknown-elf-gcc --version || { \
216           echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
217           echo "Make sure you installed the riscv-gnu-toolchain package."; \
218           exit 1; \
219         }
220         touch $@
221
222 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
223         rm -f $@ $@-t
224         wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
225         mv $@-t $@
226
227 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
228         sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
229             -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
230             < $^ > $@-t
231         mv $@-t $@
232
233 stamp-riscv-pk-installed:
234         rm -f $@
235         @rpm -q riscv-pk >/dev/null || { \
236           echo "ERROR: You must install riscv-pk:"; \
237           echo; \
238           echo "       dnf copr enable rjones/riscv"; \
239           echo "       dnf install riscv-pk"; \
240           echo; \
241           echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
242           echo; \
243           exit 1; \
244         }
245         touch $@
246
247 # Stage 3
248
249 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
250         stage3-chroot-original/etc/fedora-release \
251         stage3-chroot/etc/fedora-release \
252         stage3-chroot/lib64/libc.so.6 \
253         stage3-chroot/usr/bin/tic \
254         stage3-chroot/bin/bash \
255         stage3-chroot/bin/ls \
256         stage3-chroot/usr/lib64/libgmp.so.10 \
257         stage3-chroot/usr/lib64/libmpfr.so.4 \
258         stage3-chroot/usr/lib64/libmpc.so.3 \
259         stage3-chroot/usr/bin/as \
260         stage3-chroot/usr/bin/gcc \
261         stage3-chroot/usr/bin/mount \
262         stage3-chroot/usr/bin/tar \
263         stage3-chroot/usr/bin/gzip \
264         stage3-chroot/usr/lib64/libz.so \
265         stage3-chroot/init \
266         stage3-disk.img
267
268 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
269         rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
270         cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
271           mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
272           cd stage3-kernel/linux-$(KERNEL_VERSION) && \
273           git init; \
274         }
275         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
276         git remote add riscv https://github.com/riscv/riscv-linux && \
277         git fetch riscv && \
278         git checkout -f linux-4.1.y-riscv && \
279         make mrproper && \
280         make ARCH=riscv defconfig
281         echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
282         echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
283         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
284         make ARCH=riscv olddefconfig
285         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
286         make ARCH=riscv vmlinux
287         ls -l $@
288
289 # Build an original (x86-64) chroot using supermin.  We then aim to
290 # rebuild (using cross-compiled versions) every ELF binary in this
291 # chroot.
292 stage3-chroot-original/etc/fedora-release:
293         rm -rf stage3-chroot-original tmp-supermin.d
294         supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
295         supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
296         rm -r tmp-supermin.d
297         @echo -n "Total files in chroot: "
298         @find stage3-chroot-original -type f | wc -l
299         @echo -n "ELF files to be rebuilt: "
300         @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
301
302 # Copy the original chroot to the final chroot, remove all the ELF
303 # files.
304 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
305         rm -rf stage3-chroot
306         cp -a stage3-chroot-original stage3-chroot
307         find stage3-chroot -type d | xargs chmod u+w
308         find stage3-chroot -type f | xargs chmod u+w
309         find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
310         rm -f stage3-chroot/lib64/libc.so.6
311
312 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot.  Only
313 # copy files and symlinks, leave the target directory structure
314 # intact.
315 stage3-chroot/lib64/libc.so.6:
316         mkdir -p stage3-chroot/usr/lib/audit
317         mkdir -p stage3-chroot/usr/lib/gconv
318         for f in `cd /usr/sysroot && find -type f -o -type l`; do \
319             cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
320         done
321         cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
322
323 # Cross-compile ncurses.
324 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
325         tar zxf $^
326         cd ncurses-$(NCURSES_VERSION) && \
327         PATH=$(ROOT)/fixed-gcc:$$PATH \
328         ./configure --host=riscv64-unknown-linux-gnu \
329             --prefix=/usr --libdir=/usr/lib64 \
330             --with-shared
331         cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
332         cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
333         cd $(ROOT)/stage3-chroot/usr/lib64 && ln -sf libtinfo.so.6 libtinfo.so
334
335 ncurses-$(NCURSES_VERSION).tgz:
336         rm -f $@ $@-t
337         wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
338         mv $@-t $@
339
340 # Cross-compile bash.
341 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
342         tar zxf $^
343         cd bash-$(BASH_VERSION) && \
344         PATH=$(ROOT)/fixed-gcc:$$PATH \
345         ./configure --host=riscv64-unknown-linux-gnu \
346             --prefix=/usr --libdir=/usr/lib64
347         cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
348         cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
349
350 bash-$(BASH_VERSION).tar.gz:
351         rm -f $@ $@-t
352         wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
353         mv $@-t $@
354
355 # Cross-compile coreutils.  Bleah, coreutils cross-compilation is
356 # known-broken and upstream don't care, hence the 'touch' command.
357
358 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
359
360 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
361         rm -rf coreutils-$(COREUTILS_VERSION)
362         tar Jxf $^
363         cd coreutils-$(COREUTILS_VERSION) && \
364         PATH=$(ROOT)/fixed-gcc:$$PATH \
365         ./configure --host=riscv64-unknown-linux-gnu \
366             --prefix=/usr --libdir=/usr/lib64
367         -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
368         cd coreutils-$(COREUTILS_VERSION)/man && \
369         for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
370         cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
371         cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
372
373 coreutils-$(COREUTILS_VERSION).tar.xz:
374         rm -f $@ $@-t
375         wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
376         mv $@-t $@
377
378 # Cross-compile binutils.
379 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
380         rm -rf binutils-$(BINUTILS_X_VERSION)
381         zcat $^ | tar xf -
382         mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
383         cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
384         PATH=$(ROOT)/fixed-gcc:$$PATH \
385         ../configure \
386             --host=riscv64-unknown-linux-gnu \
387             --prefix=/usr --libdir=/usr/lib64
388         cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
389         cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
390
391 binutils-$(BINUTILS_X_VERSION).tar.gz:
392         rm -f $@ $@-t
393         wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
394         mv $@-t $@
395
396 # Cross-compile GMP, MPFR and MPC (deps of GCC).
397 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
398         rm -rf gmp-$(GMP_VERSION)
399         tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
400         cd gmp-$(GMP_VERSION) && \
401         PATH=$(ROOT)/fixed-gcc:$$PATH \
402         ./configure --host=riscv64-unknown-linux-gnu \
403             --prefix=/usr --libdir=/usr/lib64
404         cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
405         cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
406         cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
407
408 gmp-$(GMP_VERSION).tar.lz:
409         rm -f $@ $@-t
410         wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
411         mv $@-t $@
412
413 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
414         rm -rf mpfr-$(MPFR_VERSION)
415         tar -zxf mpfr-$(MPFR_VERSION).tar.gz
416         cd mpfr-$(MPFR_VERSION) && \
417         PATH=$(ROOT)/fixed-gcc:$$PATH \
418         ./configure --host=riscv64-unknown-linux-gnu \
419             --prefix=/usr --libdir=/usr/lib64 \
420             --with-gmp=$(ROOT)/stage3-chroot/usr
421         cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
422         cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
423         cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
424
425 mpfr-$(MPFR_VERSION).tar.gz:
426         rm -f $@ $@-t
427         wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
428         mv $@-t $@
429
430 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
431         rm -rf mpc-$(MPC_VERSION)
432         tar -zxf mpc-$(MPC_VERSION).tar.gz
433         cd mpc-$(MPC_VERSION) && \
434         PATH=$(ROOT)/fixed-gcc:$$PATH \
435         ./configure --host=riscv64-unknown-linux-gnu \
436             --prefix=/usr --libdir=/usr/lib64 \
437             --with-gmp=$(ROOT)/stage3-chroot/usr \
438             --with-mpfr=$(ROOT)/stage3-chroot/usr
439         cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
440         cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
441         cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
442
443 mpc-$(MPC_VERSION).tar.gz:
444         rm -f $@ $@-t
445         wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
446         mv $@-t $@
447
448 # Cross-compile GCC.
449 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
450         rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
451         zcat $^ | tar xf -
452         mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
453         cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
454         PATH=$(ROOT)/fixed-gcc:$$PATH \
455         ../configure \
456             --host=riscv64-unknown-linux-gnu \
457             --prefix=/usr --libdir=/usr/lib64 \
458             --enable-shared \
459             --enable-tls \
460             --enable-languages=c,c++ \
461             --disable-libmudflap \
462             --disable-libssp \
463             --disable-libquadmath \
464             --disable-nls \
465             --disable-multilib
466 # XXX use make all & make install here.  However building libgcc
467 # fails, see 'broken-gcc.log'.
468         cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
469         cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
470
471 gcc-$(GCC_X_VERSION).tar.gz:
472         rm -f $@ $@-t
473         wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
474         mv $@-t $@
475
476 # Cross-compile util-linux.
477 # XXX Be nice to fix ncurses/tinfo support which in theory should work.
478 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
479         rm -rf util-linux-$(UTIL_LINUX_VERSION)
480         tar -Jxf $^
481         cd util-linux-$(UTIL_LINUX_VERSION) && \
482         PATH=$(ROOT)/fixed-gcc:$$PATH \
483         ./configure \
484             --host=riscv64-unknown-linux-gnu \
485             --prefix=/usr --libdir=/usr/lib64 \
486             --without-python \
487             --without-tinfo \
488             --without-ncurses \
489             --without-systemd \
490             --disable-makeinstall-chown
491         cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
492 #       libtool fucks something up here, ignore the failure and continue.
493         -cd util-linux-$(UTIL_LINUX_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot -j1 -k V=1
494
495 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
496         rm -f $@ $@-t
497         wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
498         mv $@-t $@
499
500 # Cross-compile GNU tar.
501 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
502         rm -rf tar-$(TAR_VERSION)
503         tar -Jxf $^
504         cd tar-$(TAR_VERSION) && \
505         PATH=$(ROOT)/fixed-gcc:$$PATH \
506         ./configure \
507             --host=riscv64-unknown-linux-gnu \
508             --prefix=/usr --libdir=/usr/lib64
509         cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
510         cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
511
512 tar-$(TAR_VERSION).tar.xz:
513         rm -f $@ $@-t
514         wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
515         mv $@-t $@
516
517 # Cross-compile GNU gzip.
518 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
519         rm -rf gzip-$(GZIP_VERSION)
520         tar -zxf $^
521         cd gzip-$(GZIP_VERSION) && \
522         PATH=$(ROOT)/fixed-gcc:$$PATH \
523         ./configure \
524             --host=riscv64-unknown-linux-gnu \
525             --prefix=/usr --libdir=/usr/lib64
526         cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
527         cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
528
529 gzip-$(GZIP_VERSION).tar.gz:
530         rm -f $@ $@-t
531         wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
532         mv $@-t $@
533
534 # Cross-compile zlib.
535 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
536         rm -rf zlib-$(ZLIB_VERSION)
537         tar -zxf $^
538         cd zlib-$(ZLIB_VERSION) && \
539         PATH=$(ROOT)/fixed-gcc:$$PATH \
540         CC=riscv64-unknown-linux-gnu-gcc \
541         CFLAGS="-I/home/rjones/d/fedora-riscv/stage3-chroot/usr/include -L/home/rjones/d/fedora-riscv/stage3-chroot/usr/lib" \
542         ./configure \
543             --prefix=/usr --libdir=/usr/lib64
544         cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
545         cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
546
547 zlib-$(ZLIB_VERSION).tar.gz:
548         rm -f $@ $@-t
549         wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
550         mv $@-t $@
551
552 # Create an /init script.
553 stage3-chroot/init: init.sh
554         install -m 0755 $^ $@
555
556 # Create the stage3 disk image.
557 # Note `-s +...' adds spare space to the disk image.
558 stage3-disk.img: stage3-chroot
559         cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
560
561 # Upload the compressed disk image.
562 upload-stage3: stage3-disk.img.xz
563         scp $^ tick:public_html/riscv/
564 stage3-disk.img.xz: stage3-disk.img
565         rm -f $@
566         xz --best $^
567
568 # Helper which boots stage3 disk image in spike.
569 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
570         spike +disk=stage3-disk.img \
571             /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
572
573 # Helper which boots stage3 disk image in qemu.
574 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
575         qemu-system-riscv -kernel /usr/bin/bbl \
576             -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
577             -drive file=stage3-disk.img,format=raw -nographic
578
579 # Stage 4
580
581 stage4:
582         echo "XXX TO DO"
583         exit 1
584
585 .NOTPARALLEL: