#!/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="-fsjlj-exceptions" 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 WORKSPACE=$HOME/workspace HOME_DIR=$WORKSPACE/build UPLOAD_DIR=$HOME/artifacts TOOLCHAIN_DIR=$WORKSPACE/moz-toolchain INSTALL_DIR=$TOOLCHAIN_DIR/build/stage3/clang CROSS_PREFIX_DIR=$INSTALL_DIR/$machine-w64-mingw32 SRC_DIR=$TOOLCHAIN_DIR/src make_flags="-j$(nproc)" mingw_version=1b373beec6d07478ffba33726bb3bb21f32e4411 libunwind_version=6ee92fcc97350ae32db3172a269e9afcc2bab686 llvm_mingw_version=c3a16814bd26aa6702e1e5b482a3d9044bb0f725 # 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 $HOME_DIR/src . taskcluster/scripts/misc/tooltool-download.sh patch_file="$(pwd)/taskcluster/scripts/misc/mingw-winrt.patch" prepare() { mkdir -p $TOOLCHAIN_DIR touch $TOOLCHAIN_DIR/.build-clang mkdir -p $TOOLCHAIN_DIR pushd $TOOLCHAIN_DIR git clone -n git://git.code.sf.net/p/mingw-w64/mingw-w64 pushd mingw-w64 git checkout $mingw_version patch -p1 <$patch_file popd git clone https://github.com/llvm-mirror/libunwind.git pushd libunwind git checkout $libunwind_version popd git clone https://github.com/mstorsjo/llvm-mingw.git pushd llvm-mingw git checkout $llvm_mingw_version popd 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 $TOOLCHAIN_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 $TOOLCHAIN_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 $TOOLCHAIN_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 \ $SRC_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 <