Skip to content

Instantly share code, notes, and snippets.

@jedisct1
Forked from Drakulix/mingw-w64-3.10-osx10.9.sh
Last active August 29, 2015 14:24
Show Gist options
  • Save jedisct1/1ed4e7e1d05ad20a6eb1 to your computer and use it in GitHub Desktop.
Save jedisct1/1ed4e7e1d05ad20a6eb1 to your computer and use it in GitHub Desktop.
Install a Windows cross-compiler on OSX
#!/bin/sh
PREFIX="/usr/local/mingw"
BINUTILS_VERSION=2.25
GCC_VERSION=5.1.0
GCC_SUFFIX_VERSION=5.1
MINGW_VERSION=4.0.2
SHA256_SUM=yolo
# check_error my_cmd --param ...
check_error() {
$*
if [ $? -ne 0 ]; then
echo "The following command returned an error:"
echo "$*"
echo "Continue? y/n"
read a
if [ $a != "y" ]; then
exit
fi
echo "Ignoring..."
else
echo "OK: $*"
fi
}
# check_download "file_maybe_existing" download_cmd...
check_download() {
file=$1
shift
if [ ! -f "$file" ]; then
echo "Downloading ${file}"
$*
else
echo "${file} already downloaded"
fi
}
# check_decompression "dir" decompression_cmd...
check_decompression() {
decompressed=$1
shift
if [ ! -d "$1" ]; then
echo "Decompressing..."
$*
else
echo "Decompression not needed, ${decompressed} already exists"
fi
}
# prerequisites
check_error brew install gmp mpfr libmpc cloog isl
check_error brew link gmp mpfr libmpc cloog isl
# mingw
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
check_error cd $DIR
check_error mkdir -p source
check_error mkdir -p $PREFIX
echo "Downloading binutils"
check_error cd ./source
check_error check_download "binutils-${BINUTILS_VERSION}.tar.bz2" \
curl -LO http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2
check_error check_decompression "binutils-${BINUTILS_VERSION}" \
tar xjf binutils-${BINUTILS_VERSION}.tar.bz2
echo "Building binutils"
echo "1/2 32-bit"
check_error cd binutils-${BINUTILS_VERSION}
check_error mkdir -p build
check_error cd build
CC=gcc-${GCC_SUFFIX_VERSION} CXX=g++-${GCC_SUFFIX_VERSION} \
CPP=cpp-${GCC_SUFFIX_VERSION} LD=gcc-${GCC_SUFFIX_VERSION}
check_error ../configure --target=i686-w64-mingw32 --disable-werror \
--disable-multilib --prefix=$PREFIX --with-sysroot=$PREFIX
check_error make -j4
check_error make install-strip
echo "2/2 64-bit"
cd ..
check_error mkdir -p build64
cd build64
CC=gcc-${GCC_SUFFIX_VERSION} CXX=g++-${GCC_SUFFIX_VERSION} \
CPP=cpp-${GCC_SUFFIX_VERSION} LD=gcc-${GCC_SUFFIX_VERSION}
check_error ../configure --target=x86_64-w64-mingw32 --disable-werror \
--disable-multilib --prefix=$PREFIX --with-sysroot=$PREFIX \
--enable-64-bit-bfd
check_error make -j4
check_error make install-strip
check_error cd ../..
echo "Downloading mingw-w64"
check_error check_download "mingw-w64-v${MINGW_VERSION}.tar.bz2" \
curl -Lo mingw-w64-v${MINGW_VERSION}.tar.bz2 \
"http://freefr.dl.sourceforge.net/project/mingw-w64/mingw-w64/mingw-w64-release/mingw-w64-v${MINGW_VERSION}.tar.bz2"
check_error check_decompression "mingw-w64-v${MINGW_VERSION}" \
tar xjf mingw-w64-v${MINGW_VERSION}.tar.bz2
echo "Building mingw-headers"
echo "1/2 32-bit"
check_error cd mingw-w64-v${MINGW_VERSION}
check_error mkdir -p build-headers32
check_error cd build-headers32
check_error ../mingw-w64-headers/configure --host=i686-w64-mingw32 \
--prefix=$PREFIX/i686-w64-mingw32
check_error make -j4
check_error make install-strip
check_error cd $PREFIX/i686-w64-mingw32
check_error ln -s lib lib32
check_error cd $DIR/source/mingw-w64-v${MINGW_VERSION}
echo "2/2 64-bit"
check_error mkdir -p build-headers64
check_error cd build-headers64
check_error ../mingw-w64-headers/configure --host=x86_64-w64-mingw32 \
--prefix=$PREFIX/x86_64-w64-mingw32
check_error make -j4
check_error make install-strip
check_error cd $PREFIX/x86_64-w64-mingw32
check_error ln -s lib lib64
check_error cd $DIR/source/
echo "Downloading gcc"
check_error check_download "gcc-${GCC_VERSION}.tar.bz2" \
curl -LO ftp://gcc.gnu.org/pub/gcc/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.bz2
check_error check_decompression "gcc-${GCC_VERSION}" tar xjf gcc-${GCC_VERSION}.tar.bz2
echo "Building core gcc"
echo "1/2 32-bit"
check_error cd $PREFIX
check_error ln -s i686-w64-mingw32 mingw
check_error cd $DIR/source/gcc-${GCC_VERSION}
check_error mkdir -p build32
check_error cd build32
CC=gcc-${GCC_SUFFIX_VERSION} CXX=g++-${GCC_SUFFIX_VERSION} \
CPP=cpp-${GCC_SUFFIX_VERSION} LD=gcc-${GCC_SUFFIX_VERSION} \
PATH=${PREFIX}/bin/:$PATH
check_error ../configure --target=i686-w64-mingw32 --disable-multilib \
--enable-languages=c,c++ \
--with-gmp=/usr/local \
--with-mpfr=/usr/local \
--with-mpc=/usr/local \
--with-cloog=/usr/local \
--with-isl=/usr/local \
--with-system-zlib --enable-version-specific-runtime-libs \
--enable-libstdcxx-time=yes --enable-stage1-checking \
--enable-checking=release --enable-lto --enable-threads=win32 \
--disable-sjlj-exceptions --prefix=$PREFIX --with-sysroot=$PREFIX
check_error make all-gcc -j4
check_error make install-gcc
echo "2/2 64-bit"
check_error cd $PREFIX
check_error rm mingw
check_error ln -s x86_64-w64-mingw32 mingw
check_error cd $DIR/source/gcc-${GCC_VERSION}
check_error mkdir -p build64
check_error cd build64
CC=gcc-${GCC_SUFFIX_VERSION} CXX=g++-${GCC_SUFFIX_VERSION} \
CPP=cpp-${GCC_SUFFIX_VERSION} LD=gcc-${GCC_SUFFIX_VERSION} \
PATH=${PREFIX}/bin/:$PATH
check_error ../configure --target=x86_64-w64-mingw32 --disable-multilib \
--enable-languages=c,c++ \
--with-gmp=/usr/local \
--with-mpfr=/usr/local \
--with-mpc=/usr/local \
--with-cloog=/usr/local \
--with-isl=/usr/local \
--with-system-zlib --enable-version-specific-runtime-libs \
--enable-libstdcxx-time=yes --enable-stage1-checking \
--enable-checking=release --enable-lto --enable-threads=win32 \
--prefix=$PREFIX --with-sysroot=$PREFIX
check_error make all-gcc -j4
check_error make install-gcc
echo "Building mingw runtime"
check_error cd $PREFIX
check_error rm mingw
check_error ln -s i686-w64-mingw32 mingw
check_error cd $DIR/source/mingw-w64-v${MINGW_VERSION}
check_error mkdir -p build-crt32
check_error cd build-crt32
echo "1/2 32-Bit"
check_error ../mingw-w64-crt/configure --host=i686-w64-mingw32 \
--prefix=$PREFIX/i686-w64-mingw32 --with-sysroot=$PREFIX
check_error make
check_error make install-strip
echo "2/2 64-Bit"
check_error cd $PREFIX
check_error rm mingw
check_error ln -s x86_64-w64-mingw32 mingw
check_error cd $DIR/source/mingw-w64-v${MINGW_VERSION}
check_error mkdir -p build-crt64
check_error cd build-crt64
check_error ../mingw-w64-crt/configure --host=x86_64-w64-mingw32 \
--prefix=$PREFIX/x86_64-w64-mingw32 --with-sysroot=$PREFIX
check_error make
check_error make install-strip
echo "Building all gcc"
echo "1/2 32-Bit"
check_error cd $PREFIX
check_error rm mingw
check_error ln -s i686-w64-mingw32 mingw
check_error cd $DIR/source/gcc-${GCC_VERSION}/build32
check_error make
check_error make install-strip
echo "2/2 64-Bit"
check_error cd $PREFIX
check_error rm mingw
check_error ln -s x86_64-w64-mingw32 mingw
check_error cd $DIR/source/gcc-${GCC_VERSION}/build64
check_error make
check_error make install-strip
echo "Linking libgcc"
check_error cd $PREFIX/i686-w64-mingw32/lib
check_error ln -s ../../lib/gcc/i686-w64-mingw32/lib/libgcc_s.a ./
check_error cd $PREFIX/x86_64-w64-mingw32/lib
check_error ln -s ../../lib/gcc/x86_64-w64-mingw32/lib/libgcc_s.a ./
echo "Building winpthreads"
check_error cd $DIR/source/mingw-w64-v${MINGW_VERSION}/mingw-w64-libraries/winpthreads
echo "1/2 32-Bit"
check_error mkdir -p build32
check_error cd build32
check_error ../configure --host=i686-w64-mingw32 \
--prefix=$PREFIX/i686-w64-mingw32
check_error make
check_error make install-strip
check_error cd ..
echo "2/2 64-Bit"
check_error mkdir -p build64
check_error cd build64
check_error ../configure --host=x86_64-w64-mingw32 \
--prefix=$PREFIX/x86_64-w64-mingw32
check_error make
check_error make install-strip
echo "Cleaning up"
check_error cd $DIR
check_error rm -rf source
echo "Done"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment