fbbfacafec4d7c23cef94c846e775a58b2002ee5
[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
70 all: stage1 stage2 stage3 stage4
71
72 # Stage 1
73
74 stage1: stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz \
75         stage1-riscv-qemu/riscv-qemu.spec \
76         stamp-riscv-qemu-installed \
77         stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz \
78         stage1-riscv-fesvr/riscv-fesvr.spec \
79         stamp-riscv-fesvr-installed \
80         stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz \
81         stage1-riscv-isa-sim/riscv-isa-sim.spec \
82         stamp-riscv-isa-sim-installed
83
84 stage1-riscv-qemu/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz:
85         rm -f $@ $@-t
86         wget -O $@-t 'https://github.com/riscv/riscv-qemu/archive/$(RISCV_QEMU_COMMIT)/riscv-qemu-$(RISCV_QEMU_SHORTCOMMIT).tar.gz'
87         mv $@-t $@
88
89 stage1-riscv-qemu/riscv-qemu.spec: stage1-riscv-qemu/riscv-qemu.spec.in
90         sed -e 's/@COMMIT@/$(RISCV_QEMU_COMMIT)/g' \
91             -e 's/@SHORTCOMMIT@/$(RISCV_QEMU_SHORTCOMMIT)/g' \
92             < $^ > $@-t
93         mv $@-t $@
94
95 stamp-riscv-qemu-installed:
96         rm -f $@
97         @rpm -q riscv-qemu >/dev/null || { \
98           echo "ERROR: You must install riscv-qemu:"; \
99           echo; \
100           echo "       dnf copr enable rjones/riscv"; \
101           echo "       dnf install riscv-qemu"; \
102           echo; \
103           echo "OR: you can build it yourself from the stage1-riscv-qemu directory."; \
104           echo; \
105           exit 1; \
106         }
107         @qemu-system-riscv --version || { \
108           echo "ERROR: qemu-system-riscv is not working."; \
109           echo "Make sure you installed the riscv-qemu package."; \
110           exit 1; \
111         }
112         touch $@
113
114 stage1-riscv-fesvr/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz:
115         rm -f $@ $@-t
116         wget -O $@-t 'https://github.com/riscv/riscv-fesvr/archive/$(RISCV_FESVR_COMMIT)/riscv-fesvr-$(RISCV_FESVR_SHORTCOMMIT).tar.gz'
117         mv $@-t $@
118
119 stage1-riscv-fesvr/riscv-fesvr.spec: stage1-riscv-fesvr/riscv-fesvr.spec.in
120         sed -e 's/@COMMIT@/$(RISCV_FESVR_COMMIT)/g' \
121             -e 's/@SHORTCOMMIT@/$(RISCV_FESVR_SHORTCOMMIT)/g' \
122             < $^ > $@-t
123         mv $@-t $@
124
125 stamp-riscv-fesvr-installed:
126         rm -f $@
127         @rpm -q riscv-fesvr >/dev/null || { \
128           echo "ERROR: You must install riscv-fesvr:"; \
129           echo; \
130           echo "       dnf copr enable rjones/riscv"; \
131           echo "       dnf install riscv-fesvr"; \
132           echo; \
133           echo "OR: you can build it yourself from the stage1-riscv-fesvr directory."; \
134           echo; \
135           exit 1; \
136         }
137         touch $@
138
139 stage1-riscv-isa-sim/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz:
140         rm -f $@ $@-t
141         wget -O $@-t 'https://github.com/riscv/riscv-isa-sim/archive/$(RISCV_ISA_SIM_COMMIT)/riscv-isa-sim-$(RISCV_ISA_SIM_SHORTCOMMIT).tar.gz'
142         mv $@-t $@
143
144 stage1-riscv-isa-sim/riscv-isa-sim.spec: stage1-riscv-isa-sim/riscv-isa-sim.spec.in
145         sed -e 's/@COMMIT@/$(RISCV_ISA_SIM_COMMIT)/g' \
146             -e 's/@SHORTCOMMIT@/$(RISCV_ISA_SIM_SHORTCOMMIT)/g' \
147             < $^ > $@-t
148         mv $@-t $@
149
150 stamp-riscv-isa-sim-installed:
151         rm -f $@
152         @rpm -q riscv-isa-sim >/dev/null || { \
153           echo "ERROR: You must install riscv-isa-sim:"; \
154           echo; \
155           echo "       dnf copr enable rjones/riscv"; \
156           echo "       dnf install riscv-isa-sim"; \
157           echo; \
158           echo "OR: you can build it yourself from the stage1-riscv-isa-sim directory."; \
159           echo; \
160           exit 1; \
161         }
162         touch $@
163
164 # Stage 2
165
166 stage2: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz \
167         stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz \
168         stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz \
169         stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz \
170         stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz \
171         stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec \
172         stamp-riscv-gnu-toolchain-installed \
173         stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz \
174         stage2-riscv-pk/riscv-pk.spec \
175         stamp-riscv-pk-installed
176
177 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz:
178         rm -f $@ $@-t
179         wget -O $@-t https://github.com/lowRISC/riscv-gnu-toolchain/archive/$(RISCV_GNU_TOOLCHAIN_COMMIT)/riscv-gnu-toolchain-$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT).tar.gz
180         mv $@-t $@
181
182 stage2-riscv-gnu-toolchain/binutils-$(BINUTILS_VERSION).tar.gz:
183         rm -f $@ $@-t
184         wget -O $@-t http://mirrors.kernel.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.gz
185         mv $@-t $@
186
187 # GCC 5 no longer compiles with GCC 6 unless we patch it.
188 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69959
189 stage2-riscv-gnu-toolchain/gcc-$(GCC_VERSION).tar.gz:
190         rm -f $@ $@-t
191         wget -O $@-t http://mirrors.kernel.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.gz
192         zcat $@-t | tar xf -
193         cd gcc-$(GCC_VERSION) && patch -p0 < ../stage2-riscv-gnu-toolchain/gcc-5-fix-compilation-with-gcc-6.patch
194         tar zcf $@-t gcc-$(GCC_VERSION)
195         rm -r gcc-$(GCC_VERSION)
196         mv $@-t $@
197
198 stage2-riscv-gnu-toolchain/glibc-$(GLIBC_VERSION).tar.gz:
199         rm -f $@ $@-t
200         wget -O $@-t http://mirrors.kernel.org/gnu/glibc/glibc-$(GLIBC_VERSION).tar.gz
201         mv $@-t $@
202
203 stage2-riscv-gnu-toolchain/newlib-$(NEWLIB_VERSION).tar.gz:
204         rm -f $@ $@-t
205         wget -O $@-t ftp://sourceware.org/pub/newlib/newlib-$(NEWLIB_VERSION).tar.gz
206         mv $@-t $@
207
208 stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec: stage2-riscv-gnu-toolchain/riscv-gnu-toolchain.spec.in
209         sed -e 's/@COMMIT@/$(RISCV_GNU_TOOLCHAIN_COMMIT)/g' \
210             -e 's/@SHORTCOMMIT@/$(RISCV_GNU_TOOLCHAIN_SHORTCOMMIT)/g' \
211             -e 's/@BINUTILS_VERSION@/$(BINUTILS_VERSION)/g' \
212             -e 's/@GCC_VERSION@/$(GCC_VERSION)/g' \
213             -e 's/@GLIBC_VERSION@/$(GLIBC_VERSION)/g' \
214             -e 's/@NEWLIB_VERSION@/$(NEWLIB_VERSION)/g' \
215             < $^ > $@-t
216         mv $@-t $@
217
218 stamp-riscv-gnu-toolchain-installed:
219         rm -f $@
220         @rpm -q riscv-gnu-toolchain >/dev/null || { \
221           echo "ERROR: You must install riscv-gnu-toolchain:"; \
222           echo; \
223           echo "       dnf copr enable rjones/riscv"; \
224           echo "       dnf install riscv-gnu-toolchain"; \
225           echo; \
226           echo "OR: you can build it yourself from the stage2-riscv-gnu-toolchain directory."; \
227           echo; \
228           exit 1; \
229         }
230         @riscv64-unknown-elf-gcc --version || { \
231           echo "ERROR: riscv64-unknown-elf-gcc (cross compiler) is not working."; \
232           echo "Make sure you installed the riscv-gnu-toolchain package."; \
233           exit 1; \
234         }
235         touch $@
236
237 stage2-riscv-pk/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz:
238         rm -f $@ $@-t
239         wget -O $@-t https://github.com/lowRISC/riscv-pk/archive/$(RISCV_PK_COMMIT)/riscv-pk-$(RISCV_PK_SHORTCOMMIT).tar.gz
240         mv $@-t $@
241
242 stage2-riscv-pk/riscv-pk.spec: stage2-riscv-pk/riscv-pk.spec.in
243         sed -e 's/@COMMIT@/$(RISCV_PK_COMMIT)/g' \
244             -e 's/@SHORTCOMMIT@/$(RISCV_PK_SHORTCOMMIT)/g' \
245             < $^ > $@-t
246         mv $@-t $@
247
248 stamp-riscv-pk-installed:
249         rm -f $@
250         @rpm -q riscv-pk >/dev/null || { \
251           echo "ERROR: You must install riscv-pk:"; \
252           echo; \
253           echo "       dnf copr enable rjones/riscv"; \
254           echo "       dnf install riscv-pk"; \
255           echo; \
256           echo "OR: you can build it yourself from the stage2-riscv-pk directory."; \
257           echo; \
258           exit 1; \
259         }
260         touch $@
261
262 # Stage 3
263
264 stage3: stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
265         stage3-chroot-original/etc/fedora-release \
266         stage3-chroot/etc/fedora-release \
267         stage3-chroot/lib64/libc.so.6 \
268         stage3-chroot/usr/bin/tic \
269         stage3-chroot/bin/bash \
270         stage3-chroot/bin/ls \
271         stage3-chroot/usr/lib64/libgmp.so.10 \
272         stage3-chroot/usr/lib64/libmpfr.so.4 \
273         stage3-chroot/usr/lib64/libmpc.so.3 \
274         stage3-chroot/usr/bin/as \
275         stage3-chroot/usr/bin/gcc \
276         stage3-chroot/usr/bin/mount \
277         stage3-chroot/usr/bin/tar \
278         stage3-chroot/usr/bin/gzip \
279         stage3-chroot/usr/lib64/libz.so \
280         stage3-chroot/usr/bin/file \
281         stage3-chroot/usr/lib64/libpopt.so \
282         stage3-chroot/usr/lib64/libbeecrypt.so \
283         stage3-chroot/usr/bin/rpm \
284         stage3-chroot/usr/bin/nano \
285         stage3-chroot/usr/bin/grep \
286         stage3-chroot/usr/bin/less \
287         stage3-chroot/usr/bin/strace \
288         stage3-chroot/init \
289         stage3-disk.img
290
291 stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux:
292         rm -rf stage3-kernel/linux-$(KERNEL_VERSION)
293         cp -a $(LOCAL_LINUX_GIT_COPY) stage3-kernel/linux-$(KERNEL_VERSION) || { \
294           mkdir stage3-kernel/linux-$(KERNEL_VERSION) && \
295           cd stage3-kernel/linux-$(KERNEL_VERSION) && \
296           git init; \
297         }
298         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
299         git remote add riscv https://github.com/riscv/riscv-linux && \
300         git fetch riscv && \
301         git checkout -f linux-4.1.y-riscv && \
302         make mrproper && \
303         make ARCH=riscv defconfig
304         echo CONFIG_CMDLINE=\"root=/dev/htifblk0 init=/init\" >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
305         echo CONFIG_CROSS_COMPILE=riscv64-unknown-elf- >> stage3-kernel/linux-$(KERNEL_VERSION)/.config
306         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
307         make ARCH=riscv olddefconfig
308         cd stage3-kernel/linux-$(KERNEL_VERSION) && \
309         make ARCH=riscv vmlinux
310         ls -l $@
311
312 # Build an original (x86-64) chroot using supermin.  We then aim to
313 # rebuild (using cross-compiled versions) every ELF binary in this
314 # chroot.
315 stage3-chroot-original/etc/fedora-release:
316         rm -rf stage3-chroot-original tmp-supermin.d
317         supermin --prepare $(STAGE3_PACKAGES) -o tmp-supermin.d
318         supermin --build -f chroot tmp-supermin.d -o stage3-chroot-original
319         rm -r tmp-supermin.d
320         @echo -n "Total files in chroot: "
321         @find stage3-chroot-original -type f | wc -l
322         @echo -n "ELF files to be rebuilt: "
323         @find stage3-chroot-original -type f | xargs file -N | grep -E '\bELF.*LSB\b' | wc -l
324
325 # Copy the original chroot to the final chroot, remove all the ELF
326 # files.
327 stage3-chroot/etc/fedora-release: stage3-chroot-original/etc/fedora-release
328         rm -rf stage3-chroot
329         cp -a stage3-chroot-original stage3-chroot
330         find stage3-chroot -type d | xargs chmod u+w
331         find stage3-chroot -type f | xargs chmod u+w
332         find stage3-chroot -type f | xargs file -N | grep -E '\bELF.*LSB\b' | awk -F: '{print $$1}' | xargs rm -f
333         rm -f stage3-chroot/lib64/libc.so.6
334
335 # Copy in compiled glibc from the riscv-gnu-toolchain sysroot.  Only
336 # copy files and symlinks, leave the target directory structure
337 # intact.
338 stage3-chroot/lib64/libc.so.6:
339         mkdir -p stage3-chroot/usr/lib/audit
340         mkdir -p stage3-chroot/usr/lib/gconv
341         for f in `cd /usr/sysroot && find -type f -o -type l`; do \
342             cp -d /usr/sysroot/$$f stage3-chroot/$$f; \
343         done
344         cd stage3-chroot/lib64 && for f in ../lib/*; do ln -sf $$f; done
345
346 # Cross-compile ncurses.
347 stage3-chroot/usr/bin/tic: ncurses-$(NCURSES_VERSION).tgz
348         tar zxf $^
349         cd ncurses-$(NCURSES_VERSION) && \
350         PATH=$(ROOT)/fixed-gcc:$$PATH \
351         ./configure --host=riscv64-unknown-linux-gnu \
352             --prefix=/usr --libdir=/usr/lib64 \
353             --with-shared \
354             --with-termlib=tinfo \
355             --enable-widec
356         cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
357         cd ncurses-$(NCURSES_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
358
359 ncurses-$(NCURSES_VERSION).tgz:
360         rm -f $@ $@-t
361         wget -O $@-t ftp://invisible-island.net/ncurses/current/ncurses-$(NCURSES_VERSION).tgz
362         mv $@-t $@
363
364 # Cross-compile bash.
365 stage3-chroot/bin/bash: bash-$(BASH_VERSION).tar.gz
366         tar zxf $^
367         cd bash-$(BASH_VERSION) && \
368         PATH=$(ROOT)/fixed-gcc:$$PATH \
369         ./configure --host=riscv64-unknown-linux-gnu \
370             --prefix=/usr --libdir=/usr/lib64
371         cd bash-$(BASH_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
372         cd bash-$(BASH_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
373
374 bash-$(BASH_VERSION).tar.gz:
375         rm -f $@ $@-t
376         wget -O $@-t ftp://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz
377         mv $@-t $@
378
379 # Cross-compile coreutils.  Bleah, coreutils cross-compilation is
380 # known-broken and upstream don't care, hence the 'touch' command.
381
382 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
383
384 stage3-chroot/bin/ls: coreutils-$(COREUTILS_VERSION).tar.xz
385         rm -rf coreutils-$(COREUTILS_VERSION)
386         tar Jxf $^
387         cd coreutils-$(COREUTILS_VERSION) && \
388         PATH=$(ROOT)/fixed-gcc:$$PATH \
389         ./configure --host=riscv64-unknown-linux-gnu \
390             --prefix=/usr --libdir=/usr/lib64
391         -cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
392         cd coreutils-$(COREUTILS_VERSION)/man && \
393         for f in $(COREUTILS_PROGRAMS); do touch $$f.1; done
394         cd coreutils-$(COREUTILS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
395         cd coreutils-$(COREUTILS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
396
397 coreutils-$(COREUTILS_VERSION).tar.xz:
398         rm -f $@ $@-t
399         wget -O $@-t ftp://ftp.gnu.org/gnu/coreutils/coreutils-$(COREUTILS_VERSION).tar.xz
400         mv $@-t $@
401
402 # Cross-compile binutils.
403 stage3-chroot/usr/bin/as: binutils-$(BINUTILS_X_VERSION).tar.gz
404         rm -rf riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)
405         zcat $^ | tar xf -
406         mkdir riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build
407         cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && \
408         PATH=$(ROOT)/fixed-gcc:$$PATH \
409         ../configure \
410             --host=riscv64-unknown-linux-gnu \
411             --prefix=/usr --libdir=/usr/lib64
412         cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make
413         cd riscv-binutils-gdb-riscv-binutils-$(BINUTILS_X_VERSION)/build && make DESTDIR=$(ROOT)/stage3-chroot install
414
415 binutils-$(BINUTILS_X_VERSION).tar.gz:
416         rm -f $@ $@-t
417         wget -O $@-t https://github.com/riscv/riscv-binutils-gdb/archive/riscv-binutils-$(BINUTILS_X_VERSION).tar.gz
418         mv $@-t $@
419
420 # Cross-compile GMP, MPFR and MPC (deps of GCC).
421 stage3-chroot/usr/lib64/libgmp.so.10: gmp-$(GMP_VERSION).tar.lz
422         rm -rf gmp-$(GMP_VERSION)
423         tar --lzip -xf gmp-$(GMP_VERSION).tar.lz
424         cd gmp-$(GMP_VERSION) && \
425         PATH=$(ROOT)/fixed-gcc:$$PATH \
426         ./configure --host=riscv64-unknown-linux-gnu \
427             --prefix=/usr --libdir=/usr/lib64
428         cd gmp-$(GMP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
429         cd gmp-$(GMP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
430         cd stage3-chroot/usr/lib && ln -s ../lib64/libgmp.so
431
432 gmp-$(GMP_VERSION).tar.lz:
433         rm -f $@ $@-t
434         wget -O $@-t https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.lz
435         mv $@-t $@
436
437 stage3-chroot/usr/lib64/libmpfr.so.4: mpfr-$(MPFR_VERSION).tar.gz
438         rm -rf mpfr-$(MPFR_VERSION)
439         tar -zxf mpfr-$(MPFR_VERSION).tar.gz
440         cd mpfr-$(MPFR_VERSION) && \
441         PATH=$(ROOT)/fixed-gcc:$$PATH \
442         ./configure --host=riscv64-unknown-linux-gnu \
443             --prefix=/usr --libdir=/usr/lib64 \
444             --with-gmp=$(ROOT)/stage3-chroot/usr
445         cd mpfr-$(MPFR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
446         cd mpfr-$(MPFR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
447         cd stage3-chroot/usr/lib && ln -s ../lib64/libmpfr.so
448         rm -f stage3-chroot/usr/lib64/*.la
449
450 mpfr-$(MPFR_VERSION).tar.gz:
451         rm -f $@ $@-t
452         wget -O $@-t http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.gz
453         mv $@-t $@
454
455 stage3-chroot/usr/lib64/libmpc.so.3: mpc-$(MPC_VERSION).tar.gz
456         rm -rf mpc-$(MPC_VERSION)
457         tar -zxf mpc-$(MPC_VERSION).tar.gz
458         cd mpc-$(MPC_VERSION) && \
459         PATH=$(ROOT)/fixed-gcc:$$PATH \
460         ./configure --host=riscv64-unknown-linux-gnu \
461             --prefix=/usr --libdir=/usr/lib64 \
462             --with-gmp=$(ROOT)/stage3-chroot/usr \
463             --with-mpfr=$(ROOT)/stage3-chroot/usr
464         cd mpc-$(MPC_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
465         cd mpc-$(MPC_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
466         cd stage3-chroot/usr/lib && ln -s ../lib64/libmpc.so
467         rm -f stage3-chroot/usr/lib64/*.la
468
469 mpc-$(MPC_VERSION).tar.gz:
470         rm -f $@ $@-t
471         wget -O $@-t ftp://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VERSION).tar.gz
472         mv $@-t $@
473
474 # Cross-compile GCC.
475 stage3-chroot/usr/bin/gcc: gcc-$(GCC_X_VERSION).tar.gz
476         rm -rf riscv-gcc-riscv-gcc-$(GCC_X_VERSION)
477         zcat $^ | tar xf -
478         mkdir riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build
479         cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && \
480         PATH=$(ROOT)/fixed-gcc:$$PATH \
481         ../configure \
482             --host=riscv64-unknown-linux-gnu \
483             --prefix=/usr --libdir=/usr/lib64 \
484             --enable-shared \
485             --enable-tls \
486             --enable-languages=c,c++ \
487             --disable-libmudflap \
488             --disable-libssp \
489             --disable-libquadmath \
490             --disable-nls \
491             --disable-multilib
492 # XXX use make all & make install here.  However building libgcc
493 # fails, see 'broken-gcc.log'.
494         cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && PATH=$(ROOT)/fixed-gcc:$$PATH make all-gcc
495         cd riscv-gcc-riscv-gcc-$(GCC_X_VERSION)/build && make install-gcc DESTDIR=$(ROOT)/stage3-chroot
496
497 gcc-$(GCC_X_VERSION).tar.gz:
498         rm -f $@ $@-t
499         wget -O $@-t https://github.com/riscv/riscv-gcc/archive/riscv-gcc-$(GCC_X_VERSION).tar.gz
500         mv $@-t $@
501
502 # Cross-compile util-linux.
503 stage3-chroot/usr/bin/mount: util-linux-$(UTIL_LINUX_VERSION).tar.xz
504         rm -rf util-linux-$(UTIL_LINUX_VERSION)
505         tar -Jxf $^
506         cd util-linux-$(UTIL_LINUX_VERSION) && \
507         PATH=$(ROOT)/fixed-gcc:$$PATH \
508         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
509         ./configure \
510             --host=riscv64-unknown-linux-gnu \
511             --prefix=/usr --libdir=/usr/lib64 \
512             --without-python \
513             --without-systemd \
514             --disable-makeinstall-chown \
515             --enable-static-programs=mount
516         cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
517         cd util-linux-$(UTIL_LINUX_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
518         rm -f stage3-chroot/usr/lib64/*.la
519
520 util-linux-$(UTIL_LINUX_VERSION).tar.xz:
521         rm -f $@ $@-t
522         wget -O $@-t ftp://ftp.kernel.org/pub/linux/utils/util-linux/v$(UTIL_LINUX_VERSION)/util-linux-$(UTIL_LINUX_VERSION).tar.xz
523         mv $@-t $@
524
525 # Cross-compile GNU tar.
526 stage3-chroot/usr/bin/tar: tar-$(TAR_VERSION).tar.xz
527         rm -rf tar-$(TAR_VERSION)
528         tar -Jxf $^
529         cd tar-$(TAR_VERSION) && \
530         PATH=$(ROOT)/fixed-gcc:$$PATH \
531         ./configure \
532             --host=riscv64-unknown-linux-gnu \
533             --prefix=/usr --libdir=/usr/lib64
534         cd tar-$(TAR_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
535         cd tar-$(TAR_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
536
537 tar-$(TAR_VERSION).tar.xz:
538         rm -f $@ $@-t
539         wget -O $@-t https://ftp.gnu.org/gnu/tar/tar-$(TAR_VERSION).tar.xz
540         mv $@-t $@
541
542 # Cross-compile GNU gzip.
543 stage3-chroot/usr/bin/gzip: gzip-$(GZIP_VERSION).tar.gz
544         rm -rf gzip-$(GZIP_VERSION)
545         tar -zxf $^
546         cd gzip-$(GZIP_VERSION) && \
547         PATH=$(ROOT)/fixed-gcc:$$PATH \
548         ./configure \
549             --host=riscv64-unknown-linux-gnu \
550             --prefix=/usr --libdir=/usr/lib64
551         cd gzip-$(GZIP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
552         cd gzip-$(GZIP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
553
554 gzip-$(GZIP_VERSION).tar.gz:
555         rm -f $@ $@-t
556         wget -O $@-t https://ftp.gnu.org/gnu/gzip/gzip-$(GZIP_VERSION).tar.gz
557         mv $@-t $@
558
559 # Cross-compile zlib.
560 stage3-chroot/usr/lib64/libz.so: zlib-$(ZLIB_VERSION).tar.gz
561         rm -rf zlib-$(ZLIB_VERSION)
562         tar -zxf $^
563         cd zlib-$(ZLIB_VERSION) && \
564         PATH=$(ROOT)/fixed-gcc:$$PATH \
565         CC=riscv64-unknown-linux-gnu-gcc \
566         CFLAGS="-I$(ROOT)/stage3-chroot/usr/include -L$(ROOT)/stage3-chroot/usr/lib" \
567         ./configure \
568             --prefix=/usr --libdir=/usr/lib64
569         cd zlib-$(ZLIB_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make shared
570         cd zlib-$(ZLIB_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
571
572 zlib-$(ZLIB_VERSION).tar.gz:
573         rm -f $@ $@-t
574         wget -O $@-t http://zlib.net/zlib-$(ZLIB_VERSION).tar.gz
575         mv $@-t $@
576
577 # Cross-compile file/libmagic.
578 stage3-chroot/usr/bin/file: file-$(FILE_VERSION).tar.gz
579         rm -rf file-$(FILE_VERSION)
580         tar -zxf $^
581         cd file-$(FILE_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 file-$(FILE_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
589         cd file-$(FILE_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
590         rm -f stage3-chroot/usr/lib64/*.la
591
592 file-$(FILE_VERSION).tar.gz:
593         rm -f $@ $@-t
594         wget -O $@-t ftp://ftp.astron.com/pub/file/file-$(FILE_VERSION).tar.gz
595         mv $@-t $@
596
597 # Cross-compile popt.
598 stage3-chroot/usr/lib64/libpopt.so: popt-$(POPT_VERSION).tar.gz
599         rm -rf popt-$(POPT_VERSION)
600         tar -zxf $^
601         cd popt-$(POPT_VERSION) && \
602         PATH=$(ROOT)/fixed-gcc:$$PATH \
603         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
604         ./configure \
605             --host=riscv64-unknown-linux-gnu \
606             --prefix=/usr --libdir=/usr/lib64 \
607             --disable-static --enable-shared
608         cd popt-$(POPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
609         cd popt-$(POPT_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
610         rm -f stage3-chroot/usr/lib64/*.la
611
612 popt-$(POPT_VERSION).tar.gz:
613         rm -f $@ $@-t
614         wget -O $@-t http://rpm5.org/files/popt/popt-$(POPT_VERSION).tar.gz
615         mv $@-t $@
616
617 # Cross-compile beecrypt.
618 stage3-chroot/usr/lib64/libbeecrypt.so: beecrypt-$(BEECRYPT_VERSION).tar.gz
619         rm -rf beecrypt-$(BEECRYPT_VERSION)
620         tar -zxf $^
621         cd beecrypt-$(BEECRYPT_VERSION) && patch -p0 < ../beecrypt-disable-cplusplus.patch
622         cd beecrypt-$(BEECRYPT_VERSION) && autoreconf -i
623         cd beecrypt-$(BEECRYPT_VERSION) && \
624         PATH=$(ROOT)/fixed-gcc:$$PATH \
625         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
626         ./configure \
627             --host=riscv64-unknown-linux-gnu \
628             --prefix=/usr --libdir=/usr/lib64 \
629             --without-cplusplus \
630             --without-java \
631             --disable-openmp \
632             --disable-static \
633             --enable-shared
634         cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
635         cd beecrypt-$(BEECRYPT_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot V=1
636         chrpath -d stage3-chroot/usr/lib64/libbeecrypt.so.*
637         rm -f stage3-chroot/usr/lib64/*.la
638
639 beecrypt-$(BEECRYPT_VERSION).tar.gz:
640         rm -f $@ $@-t
641         wget -O $@-t http://downloads.sourceforge.net/sourceforge/beecrypt/beecrypt-$(BEECRYPT_VERSION).tar.gz
642         mv $@-t $@
643
644 # Cross-compile RPM / rpmbuild.
645 # We build this from a git commit, with a few hacks to the configure
646 # script.
647 stage3-chroot/usr/bin/rpm: rpm-$(RPM_SHORT_COMMIT).tar.gz db-$(BDB_VERSION).tar.gz
648         rm -rf rpm-$(RPM_SHORT_COMMIT)
649         tar -zxf rpm-$(RPM_SHORT_COMMIT).tar.gz
650         tar -zxf db-$(BDB_VERSION).tar.gz -C rpm-$(RPM_SHORT_COMMIT)
651         cd rpm-$(RPM_SHORT_COMMIT) && ln -s db-$(BDB_VERSION) db
652         cd rpm-$(RPM_SHORT_COMMIT) && patch -p1 < ../0001-HACKS-TO-GET-RPM-TO-CROSS-COMPILE.patch
653         cd rpm-$(RPM_SHORT_COMMIT) && patch -p1 < ../0002-RISCV-64-bit-riscv64-support.patch
654         cd rpm-$(RPM_SHORT_COMMIT) && autoreconf -i
655         cd rpm-$(RPM_SHORT_COMMIT) && \
656         PATH=$(ROOT)/fixed-gcc:$$PATH \
657         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
658         ./configure \
659             --host=riscv64-unknown-linux-gnu \
660             --prefix=/usr --libdir=/usr/lib64 \
661             --disable-rpath \
662             --without-libarchive \
663             --without-lua \
664             --with-beecrypt \
665             --without-archive \
666             --without-external-db \
667             --enable-ndb \
668             --disable-plugins
669         cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make V=1
670         cd rpm-$(RPM_SHORT_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make install DESTDIR=$(ROOT)/stage3-chroot
671         rm -f stage3-chroot/usr/lib64/*.la
672
673 rpm-$(RPM_SHORT_COMMIT).tar.gz:
674         rm -f $@ $@-t
675         wget -O $@-t 'http://rpm.org/gitweb?p=rpm.git;a=snapshot;h=$(RPM_COMMIT);sf=tgz'
676         mv $@-t $@
677
678 db-$(BDB_VERSION).tar.gz:
679         rm -f $@ $@-t
680         wget -O $@-t http://download.oracle.com/berkeley-db/db-$(BDB_VERSION).tar.gz
681         mv $@-t $@
682
683 # Cross-compile GNU nano (editor).
684 stage3-chroot/usr/bin/nano: nano-$(NANO_VERSION).tar.gz
685         rm -rf nano-$(NANO_VERSION)
686         tar -zxf $^
687         cd nano-$(NANO_VERSION) && \
688         PATH=$(ROOT)/fixed-gcc:$$PATH \
689         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
690         ./configure \
691             --host=riscv64-unknown-linux-gnu \
692             --prefix=/usr --libdir=/usr/lib64
693         cd nano-$(NANO_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
694         cd nano-$(NANO_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
695
696 nano-$(NANO_VERSION).tar.gz:
697         rm -f $@ $@-t
698         wget -O $@-t https://www.nano-editor.org/dist/v2.6/nano-$(NANO_VERSION).tar.gz
699         mv $@-t $@
700
701 # Cross-compile GNU grep.
702 stage3-chroot/usr/bin/grep: grep-$(GREP_VERSION).tar.xz
703         rm -rf grep-$(GREP_VERSION)
704         tar -Jxf $^
705         cd grep-$(GREP_VERSION) && \
706         PATH=$(ROOT)/fixed-gcc:$$PATH \
707         ./configure \
708             --host=riscv64-unknown-linux-gnu \
709             --prefix=/usr --libdir=/usr/lib64
710         cd grep-$(GREP_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
711         cd grep-$(GREP_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
712
713 grep-$(GREP_VERSION).tar.xz:
714         rm -f $@ $@-t
715         wget -O $@-t https://ftp.gnu.org/gnu/grep/grep-$(GREP_VERSION).tar.xz
716         mv $@-t $@
717
718 # Cross-compile less.
719 stage3-chroot/usr/bin/less: less-$(LESS_VERSION).tar.gz
720         rm -rf less-$(LESS_VERSION)
721         tar -zxf $^
722         cd less-$(LESS_VERSION) && \
723         PATH=$(ROOT)/fixed-gcc:$$PATH \
724         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
725         ./configure \
726             --host=riscv64-unknown-linux-gnu \
727             --prefix=/usr --libdir=/usr/lib64
728         cd less-$(LESS_VERSION) && PATH=$(ROOT)/fixed-gcc:$$PATH make
729         cd less-$(LESS_VERSION) && make install DESTDIR=$(ROOT)/stage3-chroot
730
731 less-$(LESS_VERSION).tar.gz:
732         rm -f $@ $@-t
733         wget -O $@-t http://www.greenwoodsoftware.com/less/less-$(LESS_VERSION).tar.gz
734         mv $@-t $@
735
736 # Cross-compile strace.
737 stage3-chroot/usr/bin/strace: strace-$(STRACE_SHORT_COMMIT).tar.gz
738         rm -rf strace-$(STRACE_SHORT_COMMIT)
739         tar -zxf $^
740         cd riscv-strace-$(STRACE_COMMIT) && patch -p1 < ../0001-Update-riscv_regs-for-ptrace.h-from-Linux-4.1.x.patch
741         cd riscv-strace-$(STRACE_COMMIT) && \
742         PATH=$(ROOT)/fixed-gcc:$$PATH \
743         LDFLAGS=-L$(ROOT)/stage3-chroot/usr/lib64 \
744         ./configure \
745             --host=riscv64-unknown-linux-gnu \
746             --prefix=/usr --libdir=/usr/lib64
747         cd riscv-strace-$(STRACE_COMMIT) && PATH=$(ROOT)/fixed-gcc:$$PATH make
748         cd riscv-strace-$(STRACE_COMMIT) && make install DESTDIR=$(ROOT)/stage3-chroot
749
750 strace-$(STRACE_SHORT_COMMIT).tar.gz:
751         rm -f $@ $@-t
752         wget -O $@-t 'https://github.com/riscv/riscv-strace/archive/$(STRACE_COMMIT)/riscv-strace-$(STRACE_SHORTCOMMIT).tar.gz'
753         mv $@-t $@
754
755 # Create an /init script.
756 stage3-chroot/init: init.sh
757         install -m 0755 $^ $@
758
759 # Create the stage3 disk image.
760 # Note `-s +...' adds spare space to the disk image.
761 stage3-disk.img: stage3-chroot
762         cd stage3-chroot && virt-make-fs . ../$@ -t ext2 -F raw -s +4G
763
764 # Upload the compressed disk image.
765 upload-stage3: stage3-disk.img.xz
766         scp $^ tick:public_html/riscv/
767 stage3-disk.img.xz: stage3-disk.img
768         rm -f $@
769         xz --best $^
770
771 # Helper which boots stage3 disk image in spike.
772 boot-stage3-in-spike: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
773         spike +disk=stage3-disk.img \
774             /usr/bin/bbl stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
775
776 # Helper which boots stage3 disk image in qemu.
777 boot-stage3-in-qemu: stage3-disk.img stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux
778         qemu-system-riscv -kernel /usr/bin/bbl \
779             -append ./stage3-kernel/linux-$(KERNEL_VERSION)/vmlinux \
780             -drive file=stage3-disk.img,format=raw -nographic
781
782 # Stage 4
783
784 stage4:
785         echo "XXX TO DO"
786         exit 1
787
788 .NOTPARALLEL: