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