#!/bin/bash
set -e
VER_BINUTILS="2.29.1"
DIR_BINUTILS="binutils-$VER_BINUTILS"
ARH_BINUTILS="$DIR_BINUTILS.tar.xz"
URL_BINUTILS="https://ftp.gnu.org/gnu/binutils/$ARH_BINUTILS"
VER_GCC="7.2.0"
DIR_GCC="gcc-$VER_GCC"
ARH_GCC="$DIR_GCC.tar.xz"
URL_GCC="https://ftp.gnu.org/gnu/gcc/gcc-$VER_GCC/$ARH_GCC"
VER_MINGW="5.0.3"
DIR_MINGW="mingw-w64-v$VER_MINGW"
ARH_MINGW="$DIR_MINGW.tar.bz2"
URL_MINGW="https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/$ARH_MINGW"
VER_ICONV="1.15"
DIR_ICONV="libiconv-$VER_ICONV"
ARH_ICONV="$DIR_ICONV.tar.gz"
URL_ICONV="https://ftp.gnu.org/pub/gnu/libiconv/$ARH_ICONV"
VER_GETTEXT="0.19.7"
DIR_GETTEXT="gettext-$VER_GETTEXT"
ARH_GETTEXT="$DIR_GETTEXT.tar.gz"
URL_GETTEXT="https://ftp.gnu.org/pub/gnu/gettext/$ARH_GETTEXT"
THREADS=`nproc`
INITIAL_PATH="$PATH"
COMMAND="$0"
if [ "$1" == "host_install" ]; then
PATH="/usr/local/$2/sys-root/bin:$PATH" make install
exit
fi
download() {
mkdir -p "install-mingw/download"
cd "install-mingw/download"
if [ ! -f "done" ]; then
echo && echo "download" && echo
wget -c --no-cookies --max-redirect 40 "$URL_BINUTILS"
wget -c --no-cookies --max-redirect 40 "$URL_GCC"
wget -c --no-cookies --max-redirect 40 "$URL_MINGW" || curl -L "$URL_MINGW" -o "$ARH_MINGW"
wget -c --no-cookies --max-redirect 40 "$URL_ICONV"
wget -c --no-cookies --max-redirect 40 "$URL_GETTEXT"
tar -xf "../download/$ARH_BINUTILS"
tar -xf "../download/$ARH_GCC"
tar -xf "../download/$ARH_MINGW"
tar -xf "../download/$ARH_ICONV"
tar -xf "../download/$ARH_GETTEXT"
touch "done"
fi
cd ../..
}
install_binutils() {
local ARCH="$1"
mkdir -p "install-mingw/build/binutils-$ARCH"
cd "install-mingw/build/binutils-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install binutils $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_BINUTILS/configure" \
--target="$ARCH" \
--disable-multilib \
--with-sysroot="/usr/local/$ARCH/sys-root" \
--prefix="/usr/local/$ARCH/sys-root"
touch "configure.done"
fi
make -j$THREADS || make || make
sudo make install
touch "done"
fi
cd ../../..
}
install_headers() {
local ARCH="$1"
mkdir -p "install-mingw/build/headers-$ARCH"
cd "install-mingw/build/headers-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install headers $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_MINGW/mingw-w64-headers/configure" \
--host="$ARCH" \
--prefix="/usr/local/$ARCH/sys-root"
touch "configure.done"
fi
make -j$THREADS || make || make
sudo make install
pushd "/usr/local/$ARCH/sys-root"
sudo ln -s . mingw
popd
touch "done"
fi
cd ../../..
}
install_gcc() {
local ARCH="$1"
mkdir -p "install-mingw/build/gcc-$ARCH"
cd "install-mingw/build/gcc-$ARCH"
if [ ! -f "gcc.done" ]; then
echo && echo "install gcc $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_GCC/configure" \
--target="$ARCH" \
--disable-multilib \
--enable-shared \
--enable-threads=posix \
--with-sysroot="/usr/local/$ARCH/sys-root" \
--prefix="/usr/local/$ARCH/sys-root"
touch "configure.done"
fi
make -j$THREADS all-gcc || make || make
sudo make install-gcc
touch "gcc.done"
fi
cd ../../..
}
install_crt() {
local ARCH="$1"
export PATH="/usr/local/$ARCH/sys-root/bin:$INITIAL_PATH"
mkdir -p "install-mingw/build/crt-$ARCH"
cd "install-mingw/build/crt-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install crt $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_MINGW/mingw-w64-crt/configure" \
--host="$ARCH" \
--with-sysroot="/usr/local/$ARCH/sys-root" \
--prefix="/usr/local/$ARCH/sys-root"
touch "configure.done"
fi
make -j$THREADS || make || make
sudo "../../../$0" host_install "$ARCH"
touch "done"
fi
cd ../../..
}
finish_gcc() {
local ARCH="$1"
export PATH="/usr/local/$ARCH/sys-root/bin:$INITIAL_PATH"
mkdir -p "install-mingw/build/gcc-$ARCH"
cd "install-mingw/build/gcc-$ARCH"
if [ ! -f "done" ]; then
echo && echo "finish gcc $ARCH" && echo
make -j$THREADS || make || make
sudo "../../../$0" host_install "$ARCH"
touch "done"
fi
cd ../../..
}
install_library() {
local ARCH="$1"
local NAME="$2"
export PATH="/usr/local/$ARCH/sys-root/bin:$INITIAL_PATH"
mkdir -p "install-mingw/build/mingw-$NAME-$ARCH"
cd "install-mingw/build/mingw-$NAME-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install library $NAME $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_MINGW/mingw-w64-libraries/$NAME/configure" \
--host="$ARCH" \
--with-sysroot="/usr/local/$ARCH/sys-root" \
--prefix="/usr/local/$ARCH/sys-root" \
${@:3}
touch "configure.done"
fi
make -j$THREADS || make || make
sudo "../../../$0" host_install "$ARCH"
touch "done"
fi
cd ../../..
}
install_tool() {
local ARCH="$1"
local NAME="$2"
export PATH="/usr/local/$ARCH/sys-root/bin:$INITIAL_PATH"
mkdir -p "install-mingw/build/mingw-$NAME-$ARCH"
cd "install-mingw/build/mingw-$NAME-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install tool $NAME $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_MINGW/mingw-w64-tools/$NAME/configure" \
--target="$ARCH" \
--prefix="/usr/local/$ARCH/sys-root" \
${@:3}
touch "configure.done"
fi
make -j$THREADS || make || make
sudo "../../../$0" host_install "$ARCH"
touch "done"
fi
cd ../../..
}
install_iconv() {
local ARCH="$1"
export PATH="/usr/local/$ARCH/sys-root/bin:$INITIAL_PATH"
mkdir -p "install-mingw/build/iconv-$ARCH"
cd "install-mingw/build/iconv-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install iconv $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_ICONV/configure" \
--host="$ARCH" \
--enable-static \
--enable-shared \
--with-sysroot="/usr/local/$ARCH/sys-root" \
--prefix="/usr/local/$ARCH/sys-root"
touch "configure.done"
fi
make -j$THREADS || make || make
sudo "../../../$0" host_install "$ARCH"
touch "done"
fi
cd ../../..
}
install_gettext() {
local ARCH="$1"
export PATH="/usr/local/$ARCH/sys-root/bin:$INITIAL_PATH"
mkdir -p "install-mingw/build/gettext-$ARCH"
cd "install-mingw/build/gettext-$ARCH"
if [ ! -f "done" ]; then
echo && echo "install gettext $ARCH" && echo
if [ ! -f "configure.done" ]; then
"../../download/$DIR_GETTEXT/configure" \
--host="$ARCH" \
--disable-java \
--disable-native-java \
--disable-csharp \
--enable-static \
--enable-shared \
--enable-threads=win32 \
--without-emacs \
--disable-openmp \
--with-sysroot="/usr/local/$ARCH/sys-root" \
--prefix="/usr/local/$ARCH/sys-root"
touch "configure.done"
fi
make -j$THREADS || make || make
sudo "../../../$0" host_install "$ARCH"
touch "done"
fi
cd ../../..
}
install_license() {
local NAME="$1"
local DIR_NAME="$2"
cd "install-mingw/download/$DIR_NAME"
if [ ! -f "../../build/$NAME.license.done" ]; then
echo && echo "install license $NAME" && echo
local TARGET="../../build/$NAME.license"
echo > "$TARGET"
for FILE in README COPYING* MAINTAINERS AUTHORS; do
if [ -f "$FILE" ]; then
echo "" >> "$TARGET"
echo "-------------------------------------" >> "$TARGET"
echo " File: $FILE" >> "$TARGET"
echo "-------------------------------------" >> "$TARGET"
echo "" >> "$TARGET"
cat "$FILE" >> "$TARGET"
fi
done
sudo mkdir -p "/usr/local/share/doc/$NAME"
sudo cp "$TARGET" "/usr/local/share/doc/$NAME/copyright"
touch "../../build/$NAME.license.done"
fi
cd ../../..
}
install() {
local ARCH="$1"
install_binutils "$ARCH"
install_headers "$ARCH"
install_gcc "$ARCH"
install_crt "$ARCH"
install_library "$ARCH" "winpthreads"
finish_gcc "$ARCH"
install_library "$ARCH" "libmangle"
install_library "$ARCH" "winstorecompat"
install_tool "$ARCH" "gendef"
install_tool "$ARCH" "genidl"
install_tool "$ARCH" "genlib"
install_tool "$ARCH" "genpeimg"
install_tool "$ARCH" "widl"
install_iconv "$ARCH"
install_gettext "$ARCH"
install_license gcc "$DIR_GCC"
install_license g++ "$DIR_GCC"
install_license gfortran "$DIR_GCC"
install_license cc "$DIR_GCC"
install_license c++ "$DIR_GCC"
install_license gfortran "$DIR_GCC"
install_license mingw-w64 "$DIR_MINGW"
install_license iconv "$DIR_ICONV"
install_license gettext "$DIR_GETTEXT"
}
clean() {
echo && echo "clean" && echo
rm -r install-mingw
}
download
install x86_64-w64-mingw32
install i686-w64-mingw32
clean
echo && echo "done" && echo