Bug 1465798: Create a skeleton MinGW-Clang toolchain job r?froydnj draft
authorJacek Caban <jacek@codeweavers.com>
Fri, 22 Jun 2018 20:58:19 +0200
changeset 820357 80528b372a8d638b1fc257d2716201ea7ca6092e
parent 817770 05501672e947d707dd75df2784bc4e406202f0bd
child 820372 39729bcb1f6a26c8b6a594eff881ead7789a7c79
push id116794
push userbmo:jacek@codeweavers.com
push dateThu, 19 Jul 2018 12:47:18 +0000
reviewersfroydnj
bugs1465798
milestone60.1.1
Bug 1465798: Create a skeleton MinGW-Clang toolchain job r?froydnj MozReview-Commit-ID: DLxCmfDDyTk
build/build-clang/clang-7-pre-mingw.json
taskcluster/ci/toolchain/linux.yml
taskcluster/scripts/misc/build-clang-7-pre-mingw.sh
new file mode 100644
--- /dev/null
+++ b/build/build-clang/clang-7-pre-mingw.json
@@ -0,0 +1,18 @@
+{
+    "llvm_revision": "337146",
+    "stages": "3",
+    "build_libcxx": true,
+    "build_type": "Release",
+    "assertions": false,
+    "llvm_repo": "https://llvm.org/svn/llvm-project/llvm/trunk",
+    "clang_repo": "https://llvm.org/svn/llvm-project/cfe/trunk",
+    "lld_repo": "https://llvm.org/svn/llvm-project/lld/trunk",
+    "compiler_repo": "https://llvm.org/svn/llvm-project/compiler-rt/trunk",
+    "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/trunk",
+    "libcxxabi_repo": "https://llvm.org/svn/llvm-project/libcxxabi/trunk",
+    "python_path": "/usr/bin/python2.7",
+    "gcc_dir": "/builds/worker/workspace/build/src/gcc",
+    "cc": "/builds/worker/workspace/build/src/gcc/bin/gcc",
+    "cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
+    "as": "/builds/worker/workspace/build/src/gcc/bin/gcc"
+}
--- a/taskcluster/ci/toolchain/linux.yml
+++ b/taskcluster/ci/toolchain/linux.yml
@@ -86,16 +86,37 @@ linux64-clang-6-pre:
         resources:
             - 'build/build-clang/build-clang.py'
             - 'build/build-clang/clang-6-pre-linux64.json'
             - 'taskcluster/scripts/misc/tooltool-download.sh'
         toolchain-artifact: public/build/clang.tar.xz
     toolchains:
         - linux64-gcc-4.9
 
+linux64-clang-7-mingw:
+    description: "MinGW-Clang 7 Pre toolchain build"
+    treeherder:
+        kind: build
+        platform: toolchains/opt
+        symbol: TMW(clang7p)
+        tier: 2
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux-xlarge
+    worker:
+        max-run-time: 7200
+    run:
+        using: toolchain-script
+        script: build-clang-7-pre-mingw.sh
+        resources:
+            - 'build/build-clang/build-clang.py'
+            - 'build/build-clang/clang-7-pre-mingw.json'
+            - 'taskcluster/scripts/misc/tooltool-download.sh'
+        toolchain-artifact: public/build/clangmingw.tar.xz
+    toolchains:
+        - linux64-gcc-4.9
+
 linux64-clang-6-pre-macosx-cross:
     description: "Clang 6 Pre toolchain build with MacOS Compiler RT libs"
     treeherder:
         kind: build
         platform: toolchains/opt
         symbol: TL(clang6p-macosx-cross)
         tier: 1
     worker-type: aws-provisioner-v1/gecko-{level}-b-linux
new file mode 100755
--- /dev/null
+++ b/taskcluster/scripts/misc/build-clang-7-pre-mingw.sh
@@ -0,0 +1,289 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building clang for Linux.
+
+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/x86_64-w64-mingw32
+SRC_DIR=$TOOLCHAIN_DIR/src
+
+CLANG_VERSION=7.0.0
+make_flags="-j$(nproc)"
+
+mingw_version=49ca7cfe7e09f924e939921b42a3452203c437b7
+libunwind_version=86ab23972978242b6f9e27cebc239f3e8428b1af
+
+binutils_version=2.27
+binutils_ext=bz2
+binutils_sha=369737ce51587f92466041a97ab7d2358c6d9e1b6490b3940eb09fb0a9a6ac88
+
+# 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 0x600, which is Windows Vista.
+default_win32_winnt=0x600
+
+cd $HOME_DIR/src
+
+. taskcluster/scripts/misc/tooltool-download.sh
+
+prepare() {
+  mkdir -p $SRC_DIR
+  pushd $SRC_DIR
+
+  git clone -n git://git.code.sf.net/p/mingw-w64/mingw-w64
+  pushd mingw-w64
+  git checkout $mingw_version
+  popd
+
+  git clone https://github.com/llvm-mirror/libunwind.git
+  pushd libunwind
+  git checkout $libunwind_version
+  popd
+
+  wget -c --progress=dot:mega ftp://ftp.gnu.org/gnu/binutils/binutils-$binutils_version.tar.$binutils_ext
+  if [ "$(sha256sum binutils-$binutils_version.tar.$binutils_ext)" != "$binutils_sha  binutils-$binutils_version.tar.$binutils_ext" ];
+  then
+    echo Corrupted binutils archive
+    exit 1
+  fi
+  tar -jxf binutils-$binutils_version.tar.$binutils_ext
+
+  popd
+}
+
+install_wrappers() {
+  pushd $INSTALL_DIR/bin
+
+  cat <<EOF >x86_64-w64-mingw32-clang
+#!/bin/sh
+DIR="\$(cd "\$(dirname "\$0")" && pwd)"
+\$DIR/clang -target x86_64-264-mingw32 --sysroot \$DIR/../x86_64-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld -fdwarf-exceptions -Qunused-arguments "\$@"
+EOF
+  chmod +x x86_64-w64-mingw32-clang
+
+  cat <<EOF >x86_64-w64-mingw32-clang++
+#!/bin/sh
+DIR="\$(cd "\$(dirname "\$0")" && pwd)"
+\$DIR/clang -target x86_64-w64-mingw32 --sysroot \$DIR/../x86_64-w64-mingw32 --driver-mode=g++ -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld -fdwarf-exceptions -Qunused-arguments "\$@"
+EOF
+  chmod +x x86_64-w64-mingw32-clang++
+
+  CC="x86_64-w64-mingw32-clang"
+  CXX="x86_64-w64-mingw32-clang++"
+
+  popd
+}
+
+build_mingw() {
+  mkdir mingw-w64-headers
+  pushd mingw-w64-headers
+  $SRC_DIR/mingw-w64/mingw-w64-headers/configure --host=x86_64-w64-mingw32 \
+                                                 --enable-sdk=all \
+                                                 --enable-secure-api \
+                                                 --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
+  $SRC_DIR/mingw-w64/mingw-w64-crt/configure --host=x86_64-w64-mingw32 \
+                                             --disable-lib32 \
+                                             --enable-lib64 \
+                                             --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
+  $SRC_DIR/mingw-w64/mingw-w64-tools/widl/configure --target=x86_64-w64-mingw32 --prefix=$INSTALL_DIR
+  make $make_flags
+  make $make_flags install
+  popd
+}
+
+build_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=x86_64-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-x86_64.a $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows/
+  popd
+}
+
+merge_libs() {
+  cat <<EOF |llvm-ar -M
+CREATE tmp.a
+ADDLIB $1
+ADDLIB $2
+SAVE
+END
+EOF
+  llvm-ranlib tmp.a
+  mv tmp.a $1
+}
+
+build_libcxx() {
+  mkdir libunwind
+  pushd libunwind
+  cmake \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
+      -DCMAKE_C_COMPILER=$CC \
+      -DCMAKE_CXX_COMPILER=$CXX \
+      -DCMAKE_CROSSCOMPILING=TRUE \
+      -DCMAKE_SYSROOT=$CROSS_PREFIX_DIR \
+      -DCMAKE_SYSTEM_NAME=Windows \
+      -DCMAKE_C_COMPILER_WORKS=TRUE \
+      -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+      -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+      -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+      -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
+      -DCXX_SUPPORTS_CXX11=TRUE \
+      -DLIBUNWIND_USE_COMPILER_RT=TRUE \
+      -DLIBUNWIND_ENABLE_THREADS=TRUE \
+      -DLIBUNWIND_ENABLE_SHARED=FALSE \
+      -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
+      -DCMAKE_CXX_FLAGS="-nostdinc++ -I$SRC_DIR/libcxx/include -DPSAPI_VERSION=2" \
+      $SRC_DIR/libunwind
+  make $make_flags
+  make $make_flags install
+  popd
+
+  mkdir libcxxabi
+  pushd libcxxabi
+  cmake \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
+      -DCMAKE_C_COMPILER=$CC \
+      -DCMAKE_CXX_COMPILER=$CXX \
+      -DCMAKE_CROSSCOMPILING=TRUE \
+      -DCMAKE_SYSTEM_NAME=Windows \
+      -DCMAKE_C_COMPILER_WORKS=TRUE \
+      -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+      -DCMAKE_SYSROOT=$CROSS_PREFIX_DIR \
+      -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+      -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+      -DLIBCXXABI_USE_COMPILER_RT=ON \
+      -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \
+      -DLIBCXXABI_ENABLE_THREADS=ON \
+      -DLIBCXXABI_TARGET_TRIPLE=x86_64-w64-mingw32 \
+      -DLIBCXXABI_ENABLE_SHARED=OFF \
+      -DLIBCXXABI_LIBCXX_INCLUDES=$SRC_DIR/libcxx/include \
+      -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
+      -DCXX_SUPPORTS_CXX11=TRUE \
+      -DCMAKE_CXX_FLAGS="-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -D_LIBCPP_HAS_THREAD_API_WIN32" \
+      $SRC_DIR/libcxxabi
+  make $make_flags VERBOSE=1
+  popd
+
+  mkdir libcxx
+  pushd libcxx
+  cmake \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
+      -DCMAKE_C_COMPILER=$CC \
+      -DCMAKE_CXX_COMPILER=$CXX \
+      -DCMAKE_CROSSCOMPILING=TRUE \
+      -DCMAKE_SYSTEM_NAME=Windows \
+      -DCMAKE_C_COMPILER_WORKS=TRUE \
+      -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+      -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+      -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+      -DLIBCXX_USE_COMPILER_RT=ON \
+      -DLIBCXX_INSTALL_HEADERS=ON \
+      -DLIBCXX_ENABLE_EXCEPTIONS=ON \
+      -DLIBCXX_ENABLE_THREADS=ON \
+      -DLIBCXX_HAS_WIN32_THREAD_API=ON \
+      -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \
+      -DLIBCXX_ENABLE_SHARED=OFF \
+      -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \
+      -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
+      -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
+      -DLIBCXX_ENABLE_FILESYSTEM=OFF \
+      -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
+      -DLIBCXX_CXX_ABI=libcxxabi \
+      -DLIBCXX_CXX_ABI_INCLUDE_PATHS=$SRC_DIR/libcxxabi/include \
+      -DLIBCXX_CXX_ABI_LIBRARY_PATH=../libcxxabi/lib \
+      -DCMAKE_CXX_FLAGS="-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \
+      $SRC_DIR/libcxx
+  make $make_flags VERBOSE=1
+  make $make_flags install
+
+  # libc++.a depends on libunwind.a. Whild linker will automatically link
+  # to libc++.a in C++ mode, it won't pick libunwind.a, requiring caller
+  # to explicitly pass -lunwind. Wo work around that, we merge libunwind.a
+  # into libc++.a.
+  merge_libs $CROSS_PREFIX_DIR/lib/libc++.a $CROSS_PREFIX_DIR/lib/libunwind.a
+  popd
+}
+
+build_windres() {
+  # we build whole binutils, but use only windres in our toolchain
+  mkdir binutils
+  pushd binutils
+  $SRC_DIR/binutils-$binutils_version/configure --prefix=$INSTALL_DIR \
+                                                --disable-multilib \
+                                                --disable-nls \
+                                                --target=x86_64-w64-mingw32
+  make $make_flags
+
+  # Manually install only nm and windres
+  cp binutils/windres $INSTALL_DIR/bin/x86_64-w64-mingw32-windres
+  cp binutils/nm-new $INSTALL_DIR/bin/x86_64-w64-mingw32-nm
+  popd
+}
+
+export PATH=$INSTALL_DIR/bin:$PATH
+
+prepare
+
+# gets a bit too verbose here
+set +x
+
+cd build/build-clang
+# |mach python| sets up a virtualenv for us!
+../../mach python ./build-clang.py -c clang-7-pre-mingw.json --skip-tar
+
+set -x
+
+pushd $TOOLCHAIN_DIR/build
+
+install_wrappers
+build_mingw
+build_compiler_rt
+build_libcxx
+build_windres
+
+popd
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+
+pushd $(dirname $INSTALL_DIR)
+rm -f clang/lib/libstdc++*
+tar caf clangmingw.tar.xz clang
+mv clangmingw.tar.xz $UPLOAD_DIR
+popd