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