#!/usr/bin/env bash set -e # All LLVM-mingw targets you want to build for TARGETS=( aarch64-w64-mingw32 armv7-w64-mingw32 i686-w64-mingw32 x86_64-w64-mingw32 ) if [[ "${1}" == "--noinstall" ]]; then export NOINSTALL=1 shift fi # Detect build system, preferring CMake detect_build_system() { if [[ -f meson.build ]]; then echo "meson" elif [[ -f CMakeLists.txt ]]; then echo "cmake" elif [[ -f configure ]]; then echo "autotools" else echo "unknown" fi } # Configure environment for a given target setup_env() { export TARGET="${1}" export CC="${TARGET}-clang" export CXX="${TARGET}-clang++" export RC="${TARGET}-windres" export AR="${TARGET}-ar" export RANLIB="${TARGET}-ranlib" export STRIP="${TARGET}-strip" export OBJCOPY="${TARGET}-objcopy" export OBJDUMP="${TARGET}-objdump" export PKG_CONFIG="/usr/bin/pkgconf" export PKG_CONFIG_LIBDIR="${TOOLCHAIN_PREFIX}/${TARGET}/lib/pkgconfig:${TOOLCHAIN_PREFIX}/${TARGET}/share/pkgconfig" export PKG_CONFIG_SYSROOT_DIR="${TOOLCHAIN_PREFIX}/${TARGET}" export RCFLAGS="--target=${TARGET} -D_WIN32=1 -I/opt/llvm-mingw/${TARGET}/include" export CFLAGS="--target=${TARGET}" case "$TARGET" in i686-w64-mingw32) export CFLAGS="${CFLAGS} -march=pentium4" export CXXFLAGS="${CFLAGS}" ;; armv7-w64-mingw32) export CFLAGS="${CFLAGS} -mfpu=neon" export CXXFLAGS="${CFLAGS}" ;; x86_64-w64-mingw32) export CFLAGS="${CFLAGS} -march=x86-64 -mtune=znver4" export CXXFLAGS="${CFLAGS}" ;; aarch64-w64-mingw32) export CXXFLAGS="${CFLAGS}" ;; *) unset CFLAGS unset CXXFLAGS ;; esac } # Build using Autotools build_autotools() { mkdir -p build-$TARGET pushd build-$TARGET ../configure \ --host="$TARGET" \ --build="$(../config.guess)" \ --prefix="${TOOLCHAIN_PREFIX}/${TARGET}" \ CC="${CC}" CXX="${CXX}" RC="$RC" \ "${@}" || exit 1 make -j$(nproc) || exit 1 if [ -z ${NOINSTALL} ]; then make install || exit 1 fi popd } # Build using CMake build_cmake() { mkdir -p build-$TARGET pushd build-$TARGET cmake .. \ -DCMAKE_SYSTEM_NAME=Windows \ -DCMAKE_C_COMPILER="${CC}" \ -DCMAKE_CXX_COMPILER="${CXX}" \ -DCMAKE_RC_COMPILER="${RC}" \ -DCMAKE_INSTALL_PREFIX="${TOOLCHAIN_PREFIX}/${TARGET}" \ -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_PREFIX}/${TARGET}/llvm-mingw.cmake" \ -DCMAKE_BUILD_TYPE=Release "${@}" || exit 1 cmake --build . --config Release -- -j$(nproc) || exit 1 if [ -z ${NOINSTALL} ]; then cmake --install . || exit 1 fi popd } # Meson build_meson() { mkdir -p build-$TARGET pushd build-$TARGET meson setup .. \ --cross-file <(cat <