diff --git a/build-mingw-w64.sh b/build-mingw-w64.sh new file mode 100755 index 00000000..031d4218 --- /dev/null +++ b/build-mingw-w64.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +set -e + +if [ -z "$1" ]; then + echo "Makes a local build of mingw-w64 in this directory and installs it to the given path." + echo "" + echo "usage:" + echo -e "\t$0 " + exit 1 +fi + +if [ -z "$MAKEFLAGS" ]; then + JOBS=-j$(($(nproc) - 1)) +fi + +DST_DIR="$1" + +BINUTILS_VER=2.32 +BINUTILS_SRCTARBALL=binutils-$BINUTILS_VER.tar.xz +BINUTILS_URL="https://ftp.gnu.org/gnu/binutils/$BINUTILS_SRCTARBALL" +BINUTILS_SRCDIR=binutils-$BINUTILS_VER + +GCC_VER=9.2.0 +GCC_SRCTARBALL=gcc-$GCC_VER.tar.xz +GCC_URL="https://ftp.gnu.org/gnu/gcc/gcc-$GCC_VER/$GCC_SRCTARBALL" +GCC_SRCDIR=gcc-$GCC_VER + +MINGW_W64_GITVER=v6.0.0 +MINGW_W64_GITURL="git://git.code.sf.net/p/mingw-w64/mingw-w64" +MINGW_W64_SRCDIR=mingw-w64-git + +function setup_src { + if [ ! -e "$BINUTILS_SRCTARBALL" ]; then + wget -O "$BINUTILS_SRCTARBALL" "$BINUTILS_URL" + fi + + if [ ! -e "$BINUTILS_SRCDIR" ]; then + tar -xf "$BINUTILS_SRCTARBALL" + fi + + if [ ! -e "$GCC_SRCTARBALL" ]; then + wget -O "$GCC_SRCTARBALL" "$GCC_URL" + fi + + if [ ! -e "$GCC_SRCDIR" ]; then + tar -xf "$GCC_SRCTARBALL" + fi + + if [ ! -e "$MINGW_W64_SRCDIR" ]; then + #shallow clone, we just want this one version + git clone -b $MINGW_W64_GITVER --depth 1 \ + "$MINGW_W64_GITURL" "$MINGW_W64_SRCDIR" + fi +} + +function build_arch { + BUILD_ARCH=$(gcc -dumpmachine) #machine which is building the compiler + HOST_ARCH=$1 #machine which will run the compiler + WIN32_TARGET_ARCH=$2 #machine which we are building for + NEWPATH=$DST_DIR/bin:$PATH + + mkdir -p build-$WIN32_TARGET_ARCH/ + pushd build-$WIN32_TARGET_ARCH/ + + mkdir -p binutils/ + pushd binutils/ + if [ ! -e Makefile ]; then + ../../$BINUTILS_SRCDIR/configure --prefix=$DST_DIR/ --build=$BUILD_ARCH --host=$HOST_ARCH --target=$WIN32_TARGET_ARCH --disable-multilib --enable-lto $BINUTILS_EXTRA_CONFIGURE + fi + make $JOBS configure-host + make $JOBS LDFLAGS=-all-static + make $JOBS install + popd + + mkdir -p mingw-w64-headers/ + pushd mingw-w64-headers/ + if [ ! -e Makefile ]; then + PATH=$NEWPATH:$PATH ../../$MINGW_W64_SRCDIR/mingw-w64-headers/configure --prefix=$DST_DIR/$WIN32_TARGET_ARCH/ --host=$WIN32_TARGET_ARCH --enable-sdk=all --enable-secure-api --enable-idl $MINGW_W64_HEADERS_EXTRA_CONFIGURE + fi + PATH=$NEWPATH:$PATH make $JOBS install + popd + + mkdir -p gcc/ + pushd gcc/ + if [ ! -e Makefile ]; then + #arguments mostly taken from Arch AUR mingw-w64-gcc PKGBUILD, + #except "--disable-dw2-exceptions" swapped for "--disable-sjlj-exceptions --with-dwarf2" + #for performance reasons on 32-bit + LDFLAGS=-static PATH=$NEWPATH:$PATH ../../$GCC_SRCDIR/configure --prefix=$DST_DIR/ \ + --build=$BUILD_ARCH --host=$HOST_ARCH --target=$WIN32_TARGET_ARCH --with-gnu-ld --with-gnu-as \ + --enable-languages=c,c++ --disable-multilib --enable-threads=posix --enable-fully-dynamic-string \ + --enable-libstdcxx-time=yes --enable-libstdcxx-filesystem-ts=yes --enable-cloog-backend=isl \ + --enable-lto --disable-sjlj-exceptions --with-dwarf2 \ + $GCC_EXTRA_CONFIGURE + fi + PATH=$NEWPATH make $JOBS all-gcc + PATH=$NEWPATH make $JOBS install-gcc + popd + + mkdir -p mingw-w64-crt/ + pushd mingw-w64-crt/ + if [ ! -e Makefile ]; then + PATH=$NEWPATH ../../$MINGW_W64_SRCDIR/mingw-w64-crt/configure --prefix=$DST_DIR/$WIN32_TARGET_ARCH/ --host=$WIN32_TARGET_ARCH $MINGW_W64_CRT_EXTRA_CONFIGURE + fi + PATH=$NEWPATH make $JOBS + PATH=$NEWPATH make $JOBS install + popd + + mkdir -p mingw-w64-winpthreads/ + pushd mingw-w64-winpthreads/ + if [ ! -e Makefile ]; then + PATH=$NEWPATH ../../$MINGW_W64_SRCDIR/mingw-w64-libraries/winpthreads/configure --prefix=$DST_DIR/$WIN32_TARGET_ARCH/ --host=$WIN32_TARGET_ARCH $MINGW_W64_WINPTHREADS_EXTRA_CONFIGURE + fi + PATH=$NEWPATH make $JOBS + PATH=$NEWPATH make $JOBS install + popd + + pushd gcc/ + #below steps require libgcc in default library location, but + #"canadian" build doesn't handle that, so install it explicitly + PATH=$NEWPATH make configure-target-libgcc + PATH=$NEWPATH make -C $WIN32_TARGET_ARCH/libgcc $JOBS + PATH=$NEWPATH make -C $WIN32_TARGET_ARCH/libgcc $JOBS install + + PATH=$NEWPATH make $JOBS + PATH=$NEWPATH make $JOBS install + popd + + popd +} + +setup_src + +mkdir -p $DST_DIR + +build_arch i686-linux-gnu i686-w64-mingw32 + +build_arch x86_64-linux-gnu x86_64-w64-mingw32 + +echo "Done!"