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