#!/bin/bash set -x -e -v # This script is for building a mingw-clang toolchain for use on Linux. if [[ $# -eq 0 ]]; then echo "Provide either x86 or x64 to specify a toolchain." exit 1; elif [ "$1" == "x86" ]; then machine="i686" compiler_rt_machine="i386" crt_flags="--enable-lib32 --disable-lib64" WRAPPER_FLAGS="" elif [ "$1" == "x64" ]; then machine="x86_64" compiler_rt_machine="x86_64" crt_flags="--disable-lib32 --enable-lib64" WRAPPER_FLAGS="" else echo "Provide either x86 or x64 to specify a toolchain." exit 1; fi TOOLCHAIN_DIR=$MOZ_FETCHES_DIR/llvm-project INSTALL_DIR=$TOOLCHAIN_DIR/build/stage4/clang CROSS_PREFIX_DIR=$INSTALL_DIR/$machine-w64-mingw32 make_flags="-j$(nproc)" if [ -d "$MOZ_FETCHES_DIR/binutils/bin" ]; then export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH" fi # This is default value of _WIN32_WINNT. Gecko configure script explicitly sets this, # so this is not used to build Gecko itself. We default to 0x601, which is Windows 7. default_win32_winnt=0x601 cd $GECKO_PATH patch_file1="$(pwd)/taskcluster/scripts/misc/mingw-winrt.patch" patch_file2="$(pwd)/taskcluster/scripts/misc/mingw-dwrite_3.patch" prepare() { pushd $MOZ_FETCHES_DIR/mingw-w64 patch -p1 <$patch_file1 patch -p1 <$patch_file2 popd } install_wrappers() { pushd $INSTALL_DIR/bin compiler_flags="--sysroot \$DIR/../$machine-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld $WRAPPER_FLAGS -fuse-cxa-atexit -Qunused-arguments" cat <$machine-w64-mingw32-clang #!/bin/sh DIR="\$(cd "\$(dirname "\$0")" && pwd)" \$DIR/clang -target $machine-w64-mingw32 $compiler_flags "\$@" EOF chmod +x $machine-w64-mingw32-clang cat <$machine-w64-mingw32-clang++ #!/bin/sh DIR="\$(cd "\$(dirname "\$0")" && pwd)" \$DIR/clang -target $machine-w64-mingw32 --driver-mode=g++ $compiler_flags "\$@" EOF chmod +x $machine-w64-mingw32-clang++ CC="$machine-w64-mingw32-clang" CXX="$machine-w64-mingw32-clang++" popd } build_mingw() { mkdir mingw-w64-headers pushd mingw-w64-headers $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-headers/configure \ --host=$machine-w64-mingw32 \ --enable-sdk=all \ --enable-idl \ --with-default-msvcrt=ucrt \ --with-default-win32-winnt=$default_win32_winnt \ --prefix=$CROSS_PREFIX_DIR make $make_flags install popd mkdir mingw-w64-crt pushd mingw-w64-crt $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-crt/configure \ --host=$machine-w64-mingw32 \ $crt_flags \ --with-default-msvcrt=ucrt \ CC="$CC" \ AR=llvm-ar \ RANLIB=llvm-ranlib \ DLLTOOL=llvm-dlltool \ --prefix=$CROSS_PREFIX_DIR make $make_flags make $make_flags install popd mkdir widl pushd widl $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-tools/widl/configure --target=$machine-w64-mingw32 --prefix=$INSTALL_DIR make $make_flags make $make_flags install popd } build_compiler_rt() { CLANG_VERSION=$(basename $(dirname $(dirname $(dirname $($CC --print-libgcc-file-name -rtlib=compiler-rt))))) mkdir compiler-rt pushd compiler-rt cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=$CC \ -DCMAKE_SYSTEM_NAME=Windows \ -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \ -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \ -DCMAKE_C_COMPILER_WORKS=1 \ -DCMAKE_C_COMPILER_TARGET=$compiler_rt_machine-windows-gnu \ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \ $TOOLCHAIN_DIR/compiler-rt/lib/builtins make $make_flags mkdir -p $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows cp lib/windows/libclang_rt.builtins-$compiler_rt_machine.a $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows/ popd } merge_libs() { cat < clangmingw.tar.zst mv clangmingw.tar.zst $UPLOAD_DIR popd