Bug 1330608 Add the MinGW32 toolchain build to Taskcluster draft
authorTom Ritter <tom@mozilla.com>
Thu, 21 Sep 2017 12:23:37 -0500
changeset 668862 07e6591b97cee4475fc101dcb48d44da9595205c
parent 668505 6c0cbda303cce0609babb26e957d8b92a3225714
child 668863 9e9edbd9c45d06f5cdd2b689003ba1dfec1bbd4b
push id81145
push userbmo:tom@mozilla.com
push dateFri, 22 Sep 2017 05:15:34 +0000
bugs1330608
milestone57.0a1
Bug 1330608 Add the MinGW32 toolchain build to Taskcluster MozReview-Commit-ID: 5MQTV6s0IBb
build/unix/build-gcc/7F74F97C103468EE5D750B583AB00996FC26A641.key
build/unix/build-gcc/build-gcc.sh
build/unix/build-gcc/download-tools.sh
taskcluster/ci/toolchain/linux.yml
taskcluster/docker/desktop-build/Dockerfile
taskcluster/scripts/misc/build-gcc-mingw32.sh
taskcluster/scripts/misc/build-mingw32-fxc2.sh
taskcluster/scripts/misc/build-mingw32-nsis.sh
taskcluster/scripts/misc/build-upx.sh
taskcluster/scripts/misc/build-wine.sh
taskcluster/taskgraph/transforms/task.py
new file mode 100644
--- /dev/null
+++ b/build/unix/build-gcc/7F74F97C103468EE5D750B583AB00996FC26A641.key
@@ -0,0 +1,54 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+GPYAnArpX32fDdu/xhuqjqHrNkwyO/Yo
+=TzkT
+-----END PGP PUBLIC KEY BLOCK-----
--- a/build/unix/build-gcc/build-gcc.sh
+++ b/build/unix/build-gcc/build-gcc.sh
@@ -1,38 +1,16 @@
 #!/bin/bash
 
 set -e
 set -x
 
 make_flags='-j12'
 
-if [ -z "$root_dir" -o ! -d "$root_dir" ]; then
-  root_dir=$(mktemp -d)
-fi
-
-if test -z $TMPDIR; then
-  TMPDIR=/tmp/
-fi
-
-mkdir $root_dir/gpg
-GPG="gpg --homedir $root_dir/gpg"
-
-> $root_dir/downloads
-
-download() {
-  wget -c -P $TMPDIR $1/$2
-  (cd $TMPDIR; sha256sum $2) >> $root_dir/downloads
-}
-
-download_and_check() {
-  download $1 ${2%.*}
-  wget -c -P $TMPDIR $1/$2
-  $GPG --verify $TMPDIR/$2 $TMPDIR/${2%.*}
-}
+. $data_dir/download-tools.sh
 
 prepare() {
   pushd $root_dir
   download_and_check ftp://ftp.gnu.org/gnu/binutils binutils-$binutils_version.tar.$binutils_ext.sig
   tar xaf $TMPDIR/binutils-$binutils_version.tar.$binutils_ext
 
   case "$gcc_version" in
   *-*)
@@ -90,29 +68,91 @@ prepare() {
 
 apply_patch() {
   pushd $root_dir/gcc-$gcc_version
   patch -p1 < $1
   popd
 }
 
 build_binutils() {
+  # if binutils_configure_flags is not set at all, give it the default value
+  if [ -z "${binutils_configure_flags+xxx}" ];
+  then
+    # gold is disabled because we don't use it on automation, and also we ran into
+    # some issues with it using this script in build-clang.py.
+    binutils_configure_flags="--disable-gold --enable-plugins --disable-nls"
+  fi
+
   mkdir $root_dir/binutils-objdir
   pushd $root_dir/binutils-objdir
-  # gold is disabled because we don't use it on automation, and also we ran into
-  # some issues with it using this script in build-clang.py.
-  ../binutils-$binutils_version/configure --prefix /tools/gcc/ --disable-gold --enable-plugins --disable-nls
+  ../binutils-$binutils_version/configure --prefix /tools/gcc/ $binutils_configure_flags
   make $make_flags
   make install $make_flags DESTDIR=$root_dir
   popd
 }
 
 build_gcc() {
   mkdir $root_dir/gcc-objdir
   pushd $root_dir/gcc-objdir
   ../gcc-$gcc_version/configure --prefix=/tools/gcc --enable-languages=c,c++  --disable-nls --disable-gnu-unique-object --enable-__cxa_atexit --with-arch-32=pentiumpro
   make $make_flags
   make $make_flags install DESTDIR=$root_dir
 
   cd $root_dir/tools
   tar caf $root_dir/gcc.tar.xz gcc/
   popd
 }
+
+build_gcc_and_mingw() {
+  export install_dir=$root_dir/tools/gcc/
+  mkdir -p $install_dir
+  export PATH=$PATH:$install_dir/bin/
+
+  cd $root_dir
+
+  git clone -n git://git.code.sf.net/p/mingw-w64/mingw-w64
+  pushd mingw-w64
+  git checkout $mingw_version # Asserts the integrity of the checkout (Right?)
+  popd
+
+  mkdir gcc-objdir
+  pushd gcc-objdir
+  ../gcc-$gcc_version/configure --prefix=$install_dir --target=i686-w64-mingw32 --with-gnu-ld --with-gnu-as --disable-multilib --enable-threads=posix
+  make $make_flags all-gcc
+  make $make_flags install-gcc
+  popd
+
+  mkdir mingw-w64-headers32
+  pushd mingw-w64-headers32
+  ../mingw-w64/mingw-w64-headers/configure --host=i686-w64-mingw32 --prefix=$install_dir/i686-w64-mingw32/ --enable-sdk=all --enable-secure-api --enable-idl
+  make $make_flags install
+  popd
+
+  mkdir mingw-w64-crt32
+  pushd mingw-w64-crt32
+  ../mingw-w64/mingw-w64-crt/configure --host=i686-w64-mingw32 --prefix=$install_dir/i686-w64-mingw32/
+  make
+  make install
+  popd
+
+  mkdir mingw-w64-pthread
+  pushd mingw-w64-pthread
+  ../mingw-w64/mingw-w64-libraries/winpthreads/configure --host=i686-w64-mingw32 --prefix=$install_dir/i686-w64-mingw32/
+  make
+  make install
+  popd
+
+  pushd gcc-objdir
+  make
+  make install
+  popd
+
+  mkdir widl32
+  pushd widl32
+  ../mingw-w64/mingw-w64-tools/widl/configure --prefix=$install_dir --target=i686-w64-mingw32
+  make
+  make install
+  popd
+
+  pushd $root_dir/tools
+  tar caf $root_dir/mingw32.tar.xz gcc/
+  popd
+}
new file mode 100755
--- /dev/null
+++ b/build/unix/build-gcc/download-tools.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+set -e
+set -x
+
+if [ -z "$root_dir" -o ! -d "$root_dir" ]; then
+  root_dir=$(mktemp -d)
+fi
+
+if test -z $TMPDIR; then
+  TMPDIR=/tmp/
+fi
+
+mkdir $root_dir/gpg
+GPG="gpg --homedir $root_dir/gpg"
+
+> $root_dir/downloads
+
+download() {
+  wget -c -P $TMPDIR $1/$2
+  (cd $TMPDIR; sha256sum $2) >> $root_dir/downloads
+}
+
+download_and_check() {
+  download $1 ${2%.*}
+  wget -c -P $TMPDIR $1/$2
+  $GPG --verify $TMPDIR/$2 $TMPDIR/${2%.*}
+}
\ No newline at end of file
old mode 100644
new mode 100755
--- a/taskcluster/ci/toolchain/linux.yml
+++ b/taskcluster/ci/toolchain/linux.yml
@@ -201,8 +201,94 @@ linux64-sccache:
     run:
         using: toolchain-script
         script: build-sccache.sh
         resources:
             - 'taskcluster/scripts/misc/tooltool-download.sh'
         toolchain-artifact: public/build/sccache2.tar.xz
     toolchains:
         - linux64-clang
+
+linux64-upx:
+    description: "UPX build for MinGW32 Cross Compile"
+    treeherder:
+        kind: build
+        platform: toolchains/opt
+        symbol: TMW(upx)
+        tier: 2
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
+    worker:
+        docker-image: {in-tree: desktop-build}
+        max-run-time: 3600
+    run:
+        using: toolchain-script
+        script: build-upx.sh
+        toolchain-artifact: public/build/upx.tar.xz
+
+linux64-wine:
+    description: "Wine build for MinGW32 Cross Compile"
+    treeherder:
+        kind: build
+        platform: toolchains/opt
+        symbol: TMW(wine)
+        tier: 2
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
+    worker:
+        docker-image: {in-tree: desktop-build}
+        max-run-time: 10800
+    run:
+        using: toolchain-script
+        script: build-wine.sh
+        toolchain-artifact: public/build/wine.tar.xz
+
+linux64-mingw32-gcc:
+    description: "GCC toolchain build for MinGW32 Cross Compile"
+    treeherder:
+        kind: build
+        platform: toolchains/opt
+        symbol: TMW(mingw32-gcc)
+        tier: 2
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
+    worker:
+        docker-image: {in-tree: desktop-build}
+        max-run-time: 10800
+    run:
+        using: toolchain-script
+        script: build-gcc-mingw32.sh
+        resources:
+            - 'build/unix/build-gcc/build-gcc.sh'
+        toolchain-artifact: public/build/mingw32.tar.xz
+
+linux64-mingw32-nsis:
+    description: "NSIS build for MinGW32 Cross Compile"
+    treeherder:
+        kind: build
+        platform: toolchains/opt
+        symbol: TMW(mingw32-nsis)
+        tier: 2
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
+    worker:
+        docker-image: {in-tree: desktop-build}
+        max-run-time: 3600
+    run:
+        using: toolchain-script
+        script: build-mingw32-nsis.sh
+        toolchain-artifact: public/build/nsis.tar.xz
+    toolchains:
+        - linux64-mingw32-gcc
+
+linux64-mingw32-fxc2:
+    description: "fxc2.exe build for MinGW32 Cross Compile"
+    treeherder:
+        kind: build
+        platform: toolchains/opt
+        symbol: TMW(mingw32-fxc2)
+        tier: 2
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
+    worker:
+        docker-image: {in-tree: desktop-build}
+        max-run-time: 1800
+    run:
+        using: toolchain-script
+        script: build-mingw32-fxc2.sh
+        toolchain-artifact: public/build/fxc2.tar.xz
+    toolchains:
+        - linux64-mingw32-gcc
\ No newline at end of file
old mode 100644
new mode 100755
--- a/taskcluster/docker/desktop-build/Dockerfile
+++ b/taskcluster/docker/desktop-build/Dockerfile
@@ -65,13 +65,16 @@ ADD           oauth.txt /home/worker/
 # the directory where mozharness is run (not its --work-dir)
 ADD           buildprops.json /home/worker/
 
 # Move installation to base centos6-build image once Bug 1272629 is fixed
 # Install the screen package here to use with xvfb.
 # Install bison to build binutils.
 RUN yum install -y bison screen
 
+# For the mingw toolchain & job (scons: nsis, flex: wine, p7zip: ff installer)
+RUN yum install -y scons flex p7zip
+
 # Install libtool.
 RUN yum install -y libtool
 
 # Set a default command useful for debugging
 CMD ["/bin/bash", "--login"]
new file mode 100755
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gcc-mingw32.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+set -e
+
+# This script is for building a MinGW GCC (and headers) to be used on Linux to compile for Windows.
+
+WORKSPACE=$HOME/workspace
+HOME_DIR=$WORKSPACE/build
+UPLOAD_DIR=$HOME/artifacts
+
+# Do not define root_dir so we build everything to a tmpdir
+#root_dir=$HOME_DIR
+data_dir=$HOME_DIR/src/build/unix/build-gcc
+
+. $data_dir/build-gcc.sh
+
+gcc_version=5.4.0
+gcc_ext=bz2
+binutils_version=2.27
+binutils_ext=bz2
+binutils_configure_flags="--target=i686-w64-mingw32"
+mingw_version=da41a54ba54c6e37322f111a5b76099b9cd39051
+
+# GPG keys used to sign GCC (collected from 5.1.0, 5.4.0, 6.4.0)
+$GPG --import $data_dir/33C235A34C46AA3FFB293709A328C3A2C3C45C06.key
+$GPG --import $data_dir/7F74F97C103468EE5D750B583AB00996FC26A641.key
+# GPG key used to sign binutils
+$GPG --import $data_dir/EAF1C276A747E9ED86210CBAC3126D3B4AE55E93.key
+# GPG key used to sign GMP
+$GPG --import $data_dir/343C2FF0FBEE5EC2EDBEF399F3599FF828C67298.key
+# GPG key used to sign MPFR
+$GPG --import $data_dir/07F3DBBECC1A39605078094D980C197698C3739D.key
+# GPG key used to sign MPC
+$GPG --import $data_dir/AD17A21EF8AED8F1CC02DBD9F7D5C9BF765C61E3.key
+
+cat > $root_dir/checksums <<EOF
+369737ce51587f92466041a97ab7d2358c6d9e1b6490b3940eb09fb0a9a6ac88  binutils-2.27.tar.bz2
+608df76dec2d34de6558249d8af4cbee21eceddbcb580d666f7a5a583ca3303a  gcc-5.4.0.tar.bz2
+752079520b4690531171d0f4532e40f08600215feefede70b24fabdc6f1ab160  gmp-5.1.3.tar.bz2
+7e3c02ff52f8540f6a85534f54158968417fd676001651c8289c705bd0228f36  isl-0.14.tar.bz2
+ae79f8d41d8a86456b68607e9ca398d00f8b7342d1d83bcf4428178ac45380c7  mpc-0.8.2.tar.gz
+ca498c1c7a74dd37a576f353312d1e68d490978de4395fa28f1cbd46a364e658  mpfr-3.1.5.tar.bz2
+EOF
+
+prepare
+build_binutils
+build_gcc_and_mingw
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp $root_dir/mingw32.tar.* $UPLOAD_DIR
new file mode 100755
--- /dev/null
+++ b/taskcluster/scripts/misc/build-mingw32-fxc2.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+set -x -e -v
+
+WORKSPACE=$HOME/workspace
+HOME_DIR=$WORKSPACE/build
+INSTALL_DIR=$WORKSPACE/fxc2
+TOOLTOOL_DIR=$WORKSPACE/build/src
+UPLOAD_DIR=$HOME/artifacts
+
+mkdir -p $INSTALL_DIR/bin
+
+cd $TOOLTOOL_DIR
+. taskcluster/scripts/misc/tooltool-download.sh
+export PATH="$TOOLTOOL_DIR/gcc/bin:$TOOLTOOL_DIR/gcc/i686-w64-mingw32/bin:$PATH"
+
+cd $WORKSPACE
+
+# --------------
+
+git clone -n https://github.com/mozilla/fxc2.git fxc2-clone
+cd fxc2-clone
+git checkout 82527b81104e5e21390d3ddcd328700c67ce73d4 # Asserts integrity of the clone (right?)
+make
+
+cp fxc2.exe $INSTALL_DIR/bin/
+cp d3dcompiler_47.dll $INSTALL_DIR/bin/
+cp $TOOLTOOL_DIR/gcc/i686-w64-mingw32/bin/libwinpthread-1.dll $INSTALL_DIR/bin/
+
+# --------------
+
+cd $WORKSPACE
+tar caf fxc2.tar.xz fxc2
+
+mkdir -p $UPLOAD_DIR
+cp fxc2.tar.* $UPLOAD_DIR
\ No newline at end of file
new file mode 100755
--- /dev/null
+++ b/taskcluster/scripts/misc/build-mingw32-nsis.sh
@@ -0,0 +1,106 @@
+#!/bin/bash
+set -x -e -v
+
+# We set the INSTALL_DIR to match the directory that it will run in exactly,
+# otherwise we get an NSIS error of the form:
+#   checking for NSIS version...
+#   DEBUG: Executing: `/home/worker/workspace/build/src/gcc/
+#   DEBUG: The command returned non-zero exit status 1.
+#   DEBUG: Its error output was:
+#   DEBUG: | Error: opening stub "/home/worker/workspace/gcc/
+#   DEBUG: | Error initalizing CEXEBuild: error setting
+#   ERROR: Failed to get nsis version.
+
+WORKSPACE=$HOME/workspace
+HOME_DIR=$WORKSPACE/build
+INSTALL_DIR=$WORKSPACE/build/src/gcc
+TOOLTOOL_DIR=$WORKSPACE/build/src
+UPLOAD_DIR=$HOME/artifacts
+
+mkdir -p $INSTALL_DIR
+
+root_dir=$HOME_DIR
+data_dir=$HOME_DIR/src/build/unix/build-gcc
+
+. $data_dir/download-tools.sh
+
+cd $TOOLTOOL_DIR
+. taskcluster/scripts/misc/tooltool-download.sh
+# After tooltool runs, we move the stuff we just downloaded.
+# As explained above, we have to build nsis to the directory it
+# will eventually be run from, which is the same place we just
+# installed our compiler. But at the end of the script we want
+# to package up what we just built. If we don't move the compiler,
+# we will package up the compiler we downloaded along with the
+# stuff we just built.
+mv gcc gcc-mingw
+export PATH="$TOOLTOOL_DIR/gcc-mingw/bin:$TOOLTOOL_DIR/gcc-mingw/i686-w64-mingw32/bin:$PATH"
+mkdir -p $INSTALL_DIR
+
+cd $WORKSPACE
+
+$GPG --import <<EOF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+pMCmSQ==
+=5shY
+-----END PGP PUBLIC KEY BLOCK-----
+EOF
+
+# --------------
+
+download_and_check http://zlib.net/ zlib-1.2.11.tar.gz.asc
+tar xaf $TMPDIR/zlib-1.2.11.tar.gz
+cd zlib-1.2.11
+make -f win32/Makefile.gcc PREFIX=i686-w64-mingw32-
+
+cd ..
+wget https://downloads.sourceforge.net/project/nsis/NSIS%203/3.01/nsis-3.01-src.tar.bz2
+echo "559703cc25f78697be1784a38d1d9a19c97d27a200dc9257d1483c028c6be9242cbcd10391ba618f88561c2ba57fdbd8b3607bea47ed8c3ad7509a6ae4075138  nsis-3.01-src.tar.bz2" | sha512sum -c -
+bunzip2 nsis-3.01-src.tar.bz2
+tar xaf nsis-3.01-src.tar
+cd nsis-3.01-src
+# I don't know how to make the version work with the environment variables/config flags the way the author appears to
+sed -i "s/'VERSION', 'Version of NSIS', cvs_version/'VERSION', 'Version of NSIS', '3.01'/" SConstruct
+scons XGCC_W32_PREFIX=i686-w64-mingw32- ZLIB_W32=../zlib-1.2.11 SKIPUTILS="NSIS Menu" PREFIX=$INSTALL_DIR/ install
+
+# --------------
+
+cd $WORKSPACE/build/src
+tar caf nsis.tar.xz gcc
+
+mkdir -p $UPLOAD_DIR
+cp nsis.tar.* $UPLOAD_DIR
new file mode 100755
--- /dev/null
+++ b/taskcluster/scripts/misc/build-upx.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -x -e -v
+
+WORKSPACE=$HOME/workspace
+HOME_DIR=$WORKSPACE/build
+INSTALL_DIR=$WORKSPACE/upx
+UPLOAD_DIR=$HOME/artifacts
+
+mkdir -p $INSTALL_DIR/bin
+
+cd $WORKSPACE
+
+# --------------
+
+wget http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz
+echo "5847003d136fbbca1334dd5de10554c76c755f7c  ucl-1.03.tar.gz" | sha1sum -c -
+tar xf ucl-1.03.tar.gz
+cd ucl-1.03
+./configure
+make
+
+# --------------
+
+cd ..
+git clone -n https://github.com/upx/upx.git upx-clone
+cd upx-clone
+git checkout d31947e1f016e87f24f88b944439bbee892f0429 # Asserts integrity of the clone (right?)
+git submodule update --init --recursive
+export UPX_UCLDIR=$WORKSPACE/ucl-1.03
+cd src
+make
+cp upx.out $INSTALL_DIR/bin/upx
+
+# --------------
+
+cd $WORKSPACE
+tar caf upx.tar.xz upx
+
+mkdir -p $UPLOAD_DIR
+cp upx.tar.* $UPLOAD_DIR
\ No newline at end of file
new file mode 100755
--- /dev/null
+++ b/taskcluster/scripts/misc/build-wine.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+set -x -e -v
+
+WORKSPACE=$HOME/workspace
+HOME_DIR=$WORKSPACE/build
+INSTALL_DIR=$WORKSPACE/wine
+UPLOAD_DIR=$HOME/artifacts
+
+mkdir -p $INSTALL_DIR
+
+root_dir=$HOME_DIR
+data_dir=$HOME_DIR/src/build/unix/build-gcc
+
+. $data_dir/download-tools.sh
+
+cd $WORKSPACE
+
+# --------------
+$GPG --import <<EOF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=6vF7
+-----END PGP PUBLIC KEY BLOCK-----
+EOF
+
+download_and_check http://dl.winehq.org/wine/source/2.0/ wine-2.0.1.tar.xz.sign
+tar xaf $TMPDIR/wine-2.0.1.tar.xz
+cd wine-2.0.1
+./configure --prefix=$INSTALL_DIR/
+make
+make install
+
+# --------------
+
+cd $WORKSPACE/
+tar caf wine.tar.xz wine
+
+mkdir -p $UPLOAD_DIR
+cp wine.tar.* $UPLOAD_DIR
--- a/taskcluster/taskgraph/transforms/task.py
+++ b/taskcluster/taskgraph/transforms/task.py
@@ -463,16 +463,17 @@ GROUP_NAMES = {
     'tc-cs': 'Checksum signing executed by Taskcluster',
     'tc-rs': 'Repackage signing executed by Taskcluster',
     'tc-BMcs': 'Beetmover checksums, executed by Taskcluster',
     'Aries': 'Aries Device Image',
     'Nexus 5-L': 'Nexus 5-L Device Image',
     'I': 'Docker Image Builds',
     'TL': 'Toolchain builds for Linux 64-bits',
     'TM': 'Toolchain builds for OSX',
+    'TMW': 'Toolchain builds for Windows MinGW',
     'TW32': 'Toolchain builds for Windows 32-bits',
     'TW64': 'Toolchain builds for Windows 64-bits',
     'SM-tc': 'Spidermonkey builds',
     'pub': 'APK publishing',
 }
 UNKNOWN_GROUP_NAME = "Treeherder group {} has no name; add it to " + __file__
 
 V2_ROUTE_TEMPLATES = [