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