aboutsummaryrefslogtreecommitdiff
path: root/build.sh
blob: ee1df94c3bd0ef99e298c01cc8cc0851f8ed98f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/env bash

set -ex

X_ROOT=/tmp/mingw
X_DOWNLOADS=$X_ROOT/downloads
X_BUILD=$X_ROOT/build
X_DEST=$X_ROOT/dest
X_CROSS=$X_ROOT/cross
# Use all processors and collect output nicely
X_MAKE_OPTS="-j$(nproc) -O"
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

# A helper function to setup common directory structure for each package.
#
# Source archives are downloaded to $X_DOWNLOADS. The archives are extracted
# to $X_BUILD/PKG_NAME so that sources are usually available at
# $X_BUILD/PKG_NAME/PKG_NAME-PKG_VERSION. A build directory is created at
# $X_BUILD/PKG_NAME/bld.
function prepare {
	local PKG_NAME=$1
	local PKG_VERSION=$2
	local PKG_SOURCE=$3
	local PKG_FILENAME=$4
	rm -rf $X_BUILD/$PKG_NAME
	mkdir -pv $X_DOWNLOADS $X_BUILD/$PKG_NAME
	cd $X_DOWNLOADS
	if [ ! -f $PKG_FILENAME ]; then
		wget $PKG_SOURCE
	fi
	cd $X_BUILD/$PKG_NAME
	tar xf $X_DOWNLOADS/$PKG_FILENAME
	mkdir bld
}

### BUILD THE CROSS COMPILER

prepare binutils 2.36.1 https://ftpmirror.gnu.org/binutils/binutils-2.36.1.tar.xz binutils-2.36.1.tar.xz
cd bld
../binutils-2.36.1/configure --target=x86_64-w64-mingw32 --prefix=$X_CROSS --with-sysroot=$X_CROSS \
	--disable-multilib --disable-nls --disable-shared
make $X_MAKE_OPTS all "CFLAGS=-O3" "LDFLAGS=-s"
make $X_MAKE_OPTS install

export PATH=$PATH:$X_CROSS/bin

prepare mingw-w64 9.0.0 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v9.0.0.tar.bz2 mingw-w64-v9.0.0.tar.bz2
cd bld
# We need to install headers first, so use --without-crt here.
../mingw-w64-v9.0.0/configure --host=x86_64-w64-mingw32 --prefix=$X_CROSS/x86_64-w64-mingw32 \
	--with-sysroot=$X_CROSS/x86_64-w64-mingw32 --disable-lib32 --enable-wildcard --disable-shared --without-crt
cd mingw-w64-headers
make $X_MAKE_OPTS install

[ -e $X_CROSS/mingw ] || ln -sv $X_CROSS/x86_64-w64-mingw32 $X_CROSS/mingw
mkdir -pv $X_CROSS/x86_64-w64-mingw32/lib
[ -e $X_CROSS/x86_64-w64-mingw32/lib64 ] || ln -sv $X_CROSS/x86_64-w64-mingw32/lib $X_CROSS/x86_64-w64-mingw32/lib64

prepare gcc 11.2.0 https://ftpmirror.gnu.org/gcc/gcc-11.2.0/gcc-11.2.0.tar.xz gcc-11.2.0.tar.xz
(cd gcc-11.2.0 && ./contrib/download_prerequisites --directory=$X_DOWNLOADS)
cd bld
../gcc-11.2.0/configure --enable-languages=c,c++ --target=x86_64-w64-mingw32 --disable-multilib \
	--prefix=$X_CROSS --with-sysroot=$X_CROSS --disable-libstdcxx-pch --disable-libstdcxx-verbose \
	--disable-nls --disable-shared --disable-win32-registry --enable-threads=posix --enable-libgomp
make $X_MAKE_OPTS all-gcc
make $X_MAKE_OPTS install-gcc

# Now we can build the rest of mingw-w64 (crt + winpthreads).
cd $X_BUILD/mingw-w64/bld
../mingw-w64-v9.0.0/configure --host=x86_64-w64-mingw32 --prefix=$X_CROSS/x86_64-w64-mingw32 \
	--with-sysroot=$X_CROSS/x86_64-w64-mingw32 --disable-lib32 --enable-wildcard \
	--disable-shared --with-libraries=winpthreads
make $X_MAKE_OPTS "CFLAGS=-s -O3"
make $X_MAKE_OPTS install

cd $X_BUILD/gcc/bld
make $X_MAKE_OPTS "CFLAGS=-g0 -O3" "CXXFLAGS=-g0 -O3" \
	"CFLAGS_FOR_TARGET=-g0 -O3" "CXXFLAGS_FOR_TARGET=-g0 -O3" \
	"BOOT_CFLAGS=-g0 -O3" "BOOT_CXXFLAGS=-g0 -O3"
make $X_MAKE_OPTS install

# These symlinks are not needed anymore.
rm $X_CROSS/mingw
rm $X_CROSS/x86_64-w64-mingw32/lib64

# ### BUILD THE NATIVE COMPILER

prepare binutils 2.36.1 https://ftpmirror.gnu.org/binutils/binutils-2.36.1.tar.xz binutils-2.36.1.tar.xz
cd bld
../binutils-2.36.1/configure --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=$X_DEST \
	--with-sysroot=$X_DEST --disable-multilib --disable-nls --disable-shared
make $X_MAKE_OPTS all "CFLAGS=-O3" "LDFLAGS=-s"
make $X_MAKE_OPTS install

prepare gcc 11.2.0 https://ftpmirror.gnu.org/gcc/gcc-11.2.0/gcc-11.2.0.tar.xz gcc-11.2.0.tar.xz
(
	cd gcc-11.2.0
	./contrib/download_prerequisites --directory=$X_DOWNLOADS
	mkdir -p winsup/mingw
	cd winsup/mingw
	# Note that this needs to point to the cross compilers include directory
	[ -e include ] || ln -s $X_CROSS/x86_64-w64-mingw32/include include
)

prepare mingw-w64 9.0.0 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v9.0.0.tar.bz2 mingw-w64-v9.0.0.tar.bz2
cd bld
../mingw-w64-v9.0.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 \
	--prefix=$X_DEST/x86_64-w64-mingw32 --with-sysroot=$X_DEST/x86_64-w64-mingw32 \
	--disable-lib32 --enable-wildcard --disable-shared --without-crt
cd mingw-w64-headers
make $X_MAKE_OPTS
make $X_MAKE_OPTS install

[ -e $X_DEST/mingw ] || ln -s $X_DEST/x86_64-w64-mingw32 $X_DEST/mingw
[ -e $X_DEST/x86_64-w64-mingw32/lib64 ] || ln -s $X_DEST/x86_64-w64-mingw32/lib $X_DEST/x86_64-w64-mingw32/lib64

cd $X_BUILD/gcc/bld
../gcc-11.2.0/configure --enable-languages=c,c++ --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 \
	--disable-multilib --prefix=$X_DEST --with-sysroot=$X_DEST --disable-libstdcxx-pch \
	--disable-libstdcxx-verbose --disable-nls --disable-shared --disable-win32-registry \
	--enable-threads=posix --enable-libgomp
make $X_MAKE_OPTS all-gcc
make $X_MAKE_OPTS install-gcc

cd $X_BUILD/mingw-w64/bld
../mingw-w64-v9.0.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 \
	--prefix=$X_DEST/x86_64-w64-mingw32 --with-sysroot=$X_DEST/x86_64-w64-mingw32 \
	--disable-lib32 --enable-wildcard --disable-shared --with-libraries=winpthreads \
	--with-tools=all
make $X_MAKE_OPTS "CFLAGS=-s -O3"
make $X_MAKE_OPTS install

cd $X_BUILD/gcc/bld
make $X_MAKE_OPTS clean
make $X_MAKE_OPTS "CFLAGS=-g0 -O3" "CXXFLAGS=-g0 -O3" "CFLAGS_FOR_TARGET=-g0 -O3" "CXXFLAGS_FOR_TARGET=-g0 -O3" "BOOT_CFLAGS=-g0 -O3" "BOOT_CXXFLAGS=-g0 -O3"
make $X_MAKE_OPTS install

# These symlinks are not needed anymore.
rm -v $X_DEST/mingw
rm -v $X_DEST/x86_64-w64-mingw32/lib64

# https://github.com/msys2/MINGW-packages/issues/7890
# https://github.com/msys2/MINGW-packages/pull/8248
rm -v $X_DEST/lib/bfd-plugins/libdep.a

### BUILD EXTRA STUFF

prepare gdb 10.2 https://ftpmirror.gnu.org/gnu/gdb/gdb-10.2.tar.xz gdb-10.2.tar.xz
# Hack around undefined reference to BCryptGenRandom by defining HAVE_LIB_BCRYPT to 0.
cp -v $SCRIPT_DIR/gdb-gnulib-import-m4-getrandom.m4 gdb-10.2/gnulib/import/m4/getrandom.m4
(cd gdb-10.2/gnulib && autoreconf --force --install --verbose)
cd bld
../gdb-10.2/configure --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=$X_DEST --disable-nls
make $X_MAKE_OPTS "CFLAGS=-O3" "CXXFLAGS=-O3" "LDFLAGS=-s"
make $X_MAKE_OPTS install

cd $X_DEST
7zr a $X_ROOT/mingw.7z .