#!/bin/bash set -e binutils_ver=2.35.1 gcc_ver=10.2.0 mpc_ver=1.2.1 mpfr_ver=4.1.0 gmp_ver=6.2.1 isl_ver=0.18 scons_local_ver=4.1.0 sevenz_ver=1900 # GNU Make 4.3 cannot be cross compiled make_ver=4.2.1 binutils_file=binutils-${binutils_ver}.tar.xz binutils_url=https://ftp.gnu.org/gnu/binutils/${binutils_file} gcc_file=gcc-${gcc_ver}.tar.xz gcc_url=https://ftp.gnu.org/gnu/gcc/gcc-${gcc_ver}/${gcc_file} mpc_file=mpc-${mpc_ver}.tar.gz mpc_url=https://ftp.gnu.org/gnu/mpc/${mpc_file} mpfr_file=mpfr-${mpfr_ver}.tar.xz mpfr_url=https://ftp.gnu.org/gnu/mpfr/${mpfr_file} gmp_file=gmp-${gmp_ver}.tar.xz gmp_url=https://ftp.gnu.org/gnu/gmp/${gmp_file} isl_file=isl-${isl_ver}.tar.bz2 isl_url=https://gcc.gnu.org/pub/gcc/infrastructure/${isl_file} scons_local_file=scons-local-${scons_local_ver}.zip scons_local_url=https://sourceforge.net/projects/scons/files/${scons_local_file} make_file=make-${make_ver}.tar.gz make_url=http://ftp.gnu.org/gnu/make/${make_file} case $1 in arm-godot-linux-gnueabihf) ;; i686-godot-linux-gnu) ;; x86_64-godot-linux-gnu) ;; *) echo "usage: $0 " echo "tuple can be one of : arm-godot-linux-gnueabihf, i686-godot-linux-gnu, x86_64-godot-linux-gnu" exit 1 ;; esac target_arch=$1 godot_toolchain_dir="$(pwd)/godot-toolchains" base_dir="$(pwd)/windows-build" target_dir="${base_dir}/${target_arch}_sdk-buildroot" function unpack_linux_sdk() { mkdir -p "${base_dir}" tar xf "${godot_toolchain_dir}/${target_arch}_sdk-buildroot.tar.bz2" -C "${base_dir}" rm "${target_dir}/bin/"{gcc,g++,cpp,ar,ranlib,gcc-ar,gcc-ranlib} } function pack_windows_sdk() { pushd "${target_dir}/bin" cp ${base_dir}/../pkg-config.bat . unzip "${base_dir}/download/${scons_local_file}" popd pushd "${target_dir}" for link in $(find -type l); do echo "mklink \"${link}\" \"$(readlink ${link})\"" >> fix-sdk.bat rm "${link}" done echo "mklink \"bin/gcc.exe\" \"${target_arch}-gcc.exe\"" >> fix-sdk.bat echo "mklink \"bin/g++.exe\" \"${target_arch}-g++.exe\"" >> fix-sdk.bat echo "mklink \"bin/ar.exe\" \"${target_arch}-ar.exe\"" >> fix-sdk.bat echo "mklink \"bin/ranlib.exe\" \"${target_arch}-ranlib.exe\"" >> fix-sdk.bat echo "mklink \"bin/gcc-ar.exe\" \"${target_arch}-gcc-ar.exe\"" >> fix-sdk.bat echo "mklink \"bin/gcc-ranlib.exe\" \"${target_arch}-gcc-ranlib.exe\"" >> fix-sdk.bat echo "mklink \"bin/lto-wrapper.exe\" \"../libexec/gcc/${target_arch}/${gcc_ver}/lto-wrapper.exe\"" >> fix-sdk.bat popd pushd ${base_dir} cat ../installer.nsis | sed -e "s/TARGET_ARCH/${target_arch}/g" > installer.nsis makensis installer.nsis mv "Godot-SDK-${target_arch}.exe" ../godot-toolchains popd } function download() { mkdir -p "${base_dir}/download" for component in make scons_local binutils gcc mpc mpfr gmp isl; do component_file=${component}_file component_url=${component}_url if [ ! -e "${base_dir}/download/${!component_file}" ]; then curl -L ${!component_url} --output "${base_dir}/download/${!component_file}" fi done } function unpack() { mkdir -p "${base_dir}/src" if [ ! -e "${base_dir}/src/gcc" ]; then mkdir -p "${base_dir}/src/gcc" pushd "${base_dir}/src/gcc" tar --strip-components=1 -xf "${base_dir}/download/${gcc_file}" for component in mpc mpfr gmp isl; do component_file=${component}_file mkdir ${component} pushd $component tar --strip-components=1 -xf "${base_dir}/download/${!component_file}" popd done popd fi if [ ! -e "${base_dir}/src/binutils" ]; then mkdir -p "${base_dir}/src/binutils" pushd "${base_dir}/src/binutils" tar --strip-components=1 -xf "${base_dir}/download/${binutils_file}" popd fi if [ ! -e "${base_dir}/src/make" ]; then mkdir -p "${base_dir}/src/make" pushd "${base_dir}/src/make" tar --strip-components=1 -xf "${base_dir}/download/${make_file}" popd fi } function build_gcc() { mkdir -p "${base_dir}/build" rm -rf "${base_dir}/build/gcc" mkdir -p "${base_dir}/build/gcc" pushd "${base_dir}/build/gcc" flags="$(${target_dir}/bin/${target_arch}-gcc -v 2>&1 | grep Configured\ with:)" skip="prefix sysconfdir with-sysroot with-gmp with-mpc with-mpfr with-pkgversion with-bugurl with-isl with-build-time-tools" newflags="--prefix=${target_dir} --sysconfdir=${target_dir}/etc --enable-static --host=x86_64-w64-mingw32 --build=x86_64-linux-gnu --with-sysroot=${target_dir}/${target_arch}/sysroot --with-static-standard-libraries" for flag in ${flags}; do keep=1 if ! echo ${flag} | grep -qE '^--'; then keep=0 fi for s in ${skip}; do if echo ${flag} | grep -qE "^--${s}"; then keep=0 break fi done if [ ${keep} -eq 1 ]; then newflags="${newflags} ${flag}" fi done "${base_dir}/src/gcc/configure" ${newflags} LDFLAGS="-lssp" make -j make install-strip popd } function build_binutils() { mkdir -p "${base_dir}/build" rm -rf "${base_dir}/build/binutils" mkdir -p "${base_dir}/build/binutils" pushd "${base_dir}/build/binutils" "${base_dir}/src/binutils/configure" --with-static-standard-libraries --prefix=${target_dir} --with-sysroot=${target_dir}/${target_arch}/sysroot --enable-lto --host=x86_64-w64-mingw32 --build=x86_64-linux-gnu --target=${target_arch} LDFLAGS="-lssp" make -j make install-strip popd } function build_make() { mkdir -p "${base_dir}/build" rm -rf "${base_dir}/build/make" mkdir -p "${base_dir}/build/make" pushd "${base_dir}/build/make" "${base_dir}/src/make/configure" --prefix=${target_dir} --host=x86_64-w64-mingw32 --build=x86_64-linux-gnu LDFLAGS="-lssp" make -j make install-strip popd } function cleanup_sdk() { rm -f "${target_dir}/relocate-sdk.sh" for directory in $(find ${target_dir} -name *.exe -printf %h\\n | sort -u); do cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libssp-0.dll ${directory} cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libwinpthread-1.dll ${directory} done while read -r file; do rm -f $(echo $file | sed -e 's/\.exe$//') done < <(find ${target_dir} -name *.exe) while read -r file; do rm -f $(echo $file | sed -e 's/\.dll$/.so/') done < <(find ${target_dir} -name *.dll) find ${target_dir}/bin -type l -delete find ${target_dir}/bin -name 'python*' -delete # Filename case issues, kind of breaks the SDK for some uses but probably OK rm -rf "${target_dir}/${target_arch}/sysroot/usr/include/linux/netfilter" rm -rf "${target_dir}/${target_arch}/sysroot/usr/include/linux/netfilter_ipv4" rm -rf "${target_dir}/${target_arch}/sysroot/usr/include/linux/netfilter_ipv6" rm -rf ${target_dir}/lib/python* } export PATH=${target_dir}/bin:${PATH} export HOSTCC=${target_arch}-gcc export HOSTCXX=${target_arch}-g++ rm -rf "${target_dir}" download unpack unpack_linux_sdk build_make build_binutils build_gcc cleanup_sdk pack_windows_sdk