Bug 1890689 accumulate input in LargerReceiverBlockSizeThanDesiredBuffering GTest...
[gecko.git] / taskcluster / scripts / misc / build-clang-mingw.sh
blobfafc43cce751b9528f24e8750689403409e96d66
1 #!/bin/bash
2 set -x -e -v
4 # This script is for building a mingw-clang toolchain for use on Linux.
6 if [[ $# -eq 0 ]]; then
7 echo "Provide either x86 or x64 to specify a toolchain."
8 exit 1;
9 elif [ "$1" == "x86" ]; then
10 machine="i686"
11 compiler_rt_machine="i386"
12 crt_flags="--enable-lib32 --disable-lib64"
13 WRAPPER_FLAGS=""
14 elif [ "$1" == "x64" ]; then
15 machine="x86_64"
16 compiler_rt_machine="x86_64"
17 crt_flags="--disable-lib32 --enable-lib64"
18 WRAPPER_FLAGS=""
19 else
20 echo "Provide either x86 or x64 to specify a toolchain."
21 exit 1;
24 TOOLCHAIN_DIR=$MOZ_FETCHES_DIR/llvm-project
25 INSTALL_DIR=$MOZ_FETCHES_DIR/clang
26 CROSS_PREFIX_DIR=$INSTALL_DIR/$machine-w64-mingw32
28 make_flags="-j$(nproc)"
30 if [ -d "$MOZ_FETCHES_DIR/binutils/bin" ]; then
31 export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH"
34 # This is default value of _WIN32_WINNT. Gecko configure script explicitly sets this,
35 # so this is not used to build Gecko itself. We default to 0x601, which is Windows 7.
36 default_win32_winnt=0x601
38 cd $GECKO_PATH
40 patch_file2="$(pwd)/taskcluster/scripts/misc/mingw-dwrite_3.patch"
41 patch_file3="$(pwd)/taskcluster/scripts/misc/mingw-unknown.patch"
42 patch_file4="$(pwd)/taskcluster/scripts/misc/mingw-enum.patch"
43 patch_file5="$(pwd)/taskcluster/scripts/misc/mingw-widl.patch"
44 patch_file6="$(pwd)/taskcluster/scripts/misc/mingw-dispatchqueue.patch"
45 patch_file10="$(pwd)/taskcluster/scripts/misc/mingw-ts_sd.patch"
46 patch_file11="$(pwd)/taskcluster/scripts/misc/mingw-composition.patch"
48 prepare() {
49 pushd $MOZ_FETCHES_DIR/mingw-w64
50 patch -p1 <$patch_file2
51 patch -p1 <$patch_file3
52 patch -p1 <$patch_file4
53 patch -p1 <$patch_file5
54 patch -p1 <$patch_file6
55 patch -p1 <$patch_file10
56 patch -p1 <$patch_file11
57 popd
60 install_wrappers() {
61 pushd $INSTALL_DIR/bin
63 compiler_flags="--sysroot \$DIR/../$machine-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld $WRAPPER_FLAGS -fuse-cxa-atexit -Qunused-arguments"
65 cat <<EOF >$machine-w64-mingw32-clang
66 #!/bin/sh
67 DIR="\$(cd "\$(dirname "\$0")" && pwd)"
68 \$DIR/clang -target $machine-w64-mingw32 $compiler_flags "\$@"
69 EOF
70 chmod +x $machine-w64-mingw32-clang
72 cat <<EOF >$machine-w64-mingw32-clang++
73 #!/bin/sh
74 DIR="\$(cd "\$(dirname "\$0")" && pwd)"
75 \$DIR/clang -target $machine-w64-mingw32 --driver-mode=g++ $compiler_flags "\$@"
76 EOF
77 chmod +x $machine-w64-mingw32-clang++
79 CC="$machine-w64-mingw32-clang"
80 CXX="$machine-w64-mingw32-clang++"
82 popd
85 build_mingw() {
86 mkdir mingw-w64-headers
87 pushd mingw-w64-headers
88 $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-headers/configure \
89 --host=$machine-w64-mingw32 \
90 --enable-sdk=all \
91 --enable-idl \
92 --with-default-msvcrt=ucrt \
93 --with-default-win32-winnt=$default_win32_winnt \
94 --prefix=$CROSS_PREFIX_DIR
95 make $make_flags install
96 popd
98 mkdir mingw-w64-crt
99 pushd mingw-w64-crt
100 $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-crt/configure \
101 --host=$machine-w64-mingw32 \
102 $crt_flags \
103 --with-default-msvcrt=ucrt \
104 CC="$CC" \
105 AR=llvm-ar \
106 RANLIB=llvm-ranlib \
107 DLLTOOL=llvm-dlltool \
108 --prefix=$CROSS_PREFIX_DIR
109 make $make_flags
110 make $make_flags install
111 popd
113 mkdir widl
114 pushd widl
115 $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-tools/widl/configure --target=$machine-w64-mingw32 --prefix=$INSTALL_DIR
116 make $make_flags
117 make $make_flags install
118 popd
121 build_compiler_rt() {
122 CLANG_VERSION=$(basename $(dirname $(dirname $(dirname $($CC --print-libgcc-file-name -rtlib=compiler-rt)))))
123 mkdir compiler-rt
124 pushd compiler-rt
125 cmake \
126 -DCMAKE_BUILD_TYPE=Release \
127 -DCMAKE_C_COMPILER=$CC \
128 -DCMAKE_SYSTEM_NAME=Windows \
129 -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
130 -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
131 -DCMAKE_C_COMPILER_WORKS=1 \
132 -DCMAKE_C_COMPILER_TARGET=$compiler_rt_machine-windows-gnu \
133 -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
134 $TOOLCHAIN_DIR/compiler-rt/lib/builtins
135 make $make_flags
136 mkdir -p $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows
137 cp lib/windows/libclang_rt.builtins-$compiler_rt_machine.a $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows/
138 popd
141 build_runtimes() {
142 # Below, we specify -g -gcodeview to build static libraries with debug information.
143 # Because we're not distributing these builds, this is fine. If one were to distribute
144 # the builds, perhaps one would want to make those flags conditional or investigation
145 # other options.
146 DEBUG_FLAGS="-g -gcodeview"
148 # First configure libcxx
149 mkdir runtimes
150 pushd runtimes
151 cmake \
152 -DCMAKE_BUILD_TYPE=Release \
153 -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
154 -DCMAKE_C_COMPILER=$CC \
155 -DCMAKE_CXX_COMPILER=$CXX \
156 -DCMAKE_CROSSCOMPILING=TRUE \
157 -DCMAKE_SYSTEM_NAME=Windows \
158 -DCMAKE_C_COMPILER_WORKS=TRUE \
159 -DCMAKE_CXX_COMPILER_WORKS=TRUE \
160 -DLLVM_COMPILER_CHECKED=TRUE \
161 -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
162 -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
163 -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \
164 -DLIBCXX_USE_COMPILER_RT=ON \
165 -DLIBCXX_INSTALL_HEADERS=ON \
166 -DLIBCXX_ENABLE_EXCEPTIONS=ON \
167 -DLIBCXX_ENABLE_THREADS=ON \
168 -DLIBCXX_HAS_WIN32_THREAD_API=ON \
169 -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \
170 -DLIBCXX_ENABLE_SHARED=OFF \
171 -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \
172 -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
173 -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
174 -DLIBCXX_ENABLE_FILESYSTEM=ON \
175 -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
176 -DLIBCXX_CXX_ABI=libcxxabi \
177 -DLIBCXXABI_USE_LLVM_UNWINDER=TRUE \
178 -DLIBCXXABI_ENABLE_STATIC_UNWINDER=TRUE \
179 -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
180 -DLIBUNWIND_USE_COMPILER_RT=TRUE \
181 -DLIBUNWIND_ENABLE_THREADS=TRUE \
182 -DLIBUNWIND_ENABLE_SHARED=FALSE \
183 -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
184 -DLIBUNWIND_CXX_FLAGS="${DEBUG_FLAGS} -Wno-dll-attribute-on-redeclaration -nostdinc++ -DPSAPI_VERSION=2" \
185 -DLIBUNWIND_C_FLAGS="-Wno-dll-attribute-on-redeclaration" \
186 -DLIBUNWIND_ENABLE_FRAME_APIS=ON \
187 -DLIBCXXABI_USE_COMPILER_RT=ON \
188 -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \
189 -DLIBCXXABI_ENABLE_THREADS=ON \
190 -DLIBCXXABI_TARGET_TRIPLE=$machine-w64-mingw32 \
191 -DLIBCXXABI_ENABLE_SHARED=OFF \
192 -DLIBCXXABI_CXX_FLAGS="${DEBUG_FLAGS} -D_LIBCPP_HAS_THREAD_API_WIN32" \
193 -DLLVM_ENABLE_RUNTIMES="libcxxabi;libcxx;libunwind" \
194 $TOOLCHAIN_DIR/runtimes
196 make $make_flags VERBOSE=1
197 make $make_flags install
199 popd
202 build_libssp() {
203 pushd $MOZ_FETCHES_DIR/gcc-source/
205 # Massage the environment for the build-libssp.sh script
206 mkdir -p ./$machine-w64-mingw32/lib
207 cp $MOZ_FETCHES_DIR/llvm-mingw/libssp-Makefile .
208 sed -i 's/set -e/set -x -e -v/' $MOZ_FETCHES_DIR/llvm-mingw/build-libssp.sh
209 sed -i 's/(CROSS)gcc/(CROSS)clang/' libssp-Makefile
210 sed -i 's/\$(CROSS)ar/llvm-ar/' libssp-Makefile
211 OLDPATH=$PATH
212 PATH=$INSTALL_DIR/bin:$PATH
214 # Run the script
215 TOOLCHAIN_ARCHS=$machine $MOZ_FETCHES_DIR/llvm-mingw/build-libssp.sh .
217 # Grab the artifacts, cleanup
218 cp $MOZ_FETCHES_DIR/gcc-source/$machine-w64-mingw32/lib/{libssp.a,libssp_nonshared.a} $INSTALL_DIR/$machine-w64-mingw32/lib/
219 unset TOOLCHAIN_ARCHS
220 PATH=$OLDPATH
221 popd
224 build_utils() {
225 pushd $INSTALL_DIR/bin/
226 for prog in ar nm objcopy ranlib readobj strip; do
227 ln -s llvm-$prog $machine-w64-mingw32-$prog
228 done
229 ./clang $MOZ_FETCHES_DIR/llvm-mingw/wrappers/windres-wrapper.c -O2 -Wl,-s -o $machine-w64-mingw32-windres
230 popd
233 export PATH=$INSTALL_DIR/bin:$PATH
235 prepare
237 mkdir $TOOLCHAIN_DIR/build
238 pushd $TOOLCHAIN_DIR/build
240 install_wrappers
241 build_mingw
242 build_compiler_rt
243 build_runtimes
244 build_libssp
245 build_utils
247 popd
249 # Put a tarball in the artifacts dir
250 mkdir -p $UPLOAD_DIR
252 pushd $(dirname $INSTALL_DIR)
253 tar caf clangmingw.tar.zst clang
254 mv clangmingw.tar.zst $UPLOAD_DIR
255 popd