tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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