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