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