#!/bin/sh # # Script for acquiring and building macOS dependencies for 0 A.D. # # The script checks whether a source tarball exists for each # dependency, if not it will download the correct version from # the project's website, then it removes previous build files, # extracts the tarball, configures and builds the lib. The script # should die on any errors to ease troubleshooting. # # make install is used to copy the compiled libs to each specific # directory and also the config tools (e.g. sdl-config). Because # of this, OS X developers must run this script at least once, # to configure the correct lib directories. It must be run again # if the libraries are moved. # # Building against an SDK is an option, though not required, # as not all build environments contain the Developer SDKs # (Xcode does, but the Command Line Tools package does not) # # -------------------------------------------------------------- # Library versions for ease of updating: ZLIB_VERSION="zlib-1.2.11" CURL_VERSION="curl-7.71.0" ICONV_VERSION="libiconv-1.16" XML2_VERSION="libxml2-2.9.10" SDL2_VERSION="SDL2-2.24.0" # NOTE: remember to also update LIB_URL below when changing version BOOST_VERSION="boost_1_81_0" # NOTE: remember to also update LIB_URL below when changing version WXWIDGETS_VERSION="wxWidgets-3.1.4" # libpng was included as part of X11 but that's removed from Mountain Lion # (also the Snow Leopard version was ancient 1.2) PNG_VERSION="libpng-1.6.36" FREETYPE_VERSION="freetype-2.10.4" OGG_VERSION="libogg-1.3.5" VORBIS_VERSION="libvorbis-1.3.7" # gloox requires GnuTLS, GnuTLS requires Nettle and GMP GMP_VERSION="gmp-6.2.1" NETTLE_VERSION="nettle-3.9" # NOTE: remember to also update LIB_URL below when changing version GLOOX_VERSION="gloox-1.0.24" GNUTLS_VERSION="gnutls-3.8.3" # OS X only includes part of ICU, and only the dylib # NOTE: remember to also update LIB_URL below when changing version ICU_VERSION="icu4c-69_1" ENET_VERSION="enet-1.3.17" MINIUPNPC_VERSION="miniupnpc-2.2.2" SODIUM_VERSION="libsodium-1.0.18" FMT_VERSION="7.1.3" MOLTENVK_VERSION="1.2.2" # -------------------------------------------------------------- # Bundled with the game: # * SpiderMonkey # * NVTT # * FCollada # -------------------------------------------------------------- # -------------------------------------------------------------- # Provided by OS X: # * OpenAL # * OpenGL # -------------------------------------------------------------- export CC="${CC:="clang"}" CXX="${CXX:="clang++"}" export MIN_OSX_VERSION="${MIN_OSX_VERSION:="10.12"}" export ARCH="${ARCH:=""}" # The various libs offer inconsistent configure options, some allow # setting sysroot and OS X-specific options, others don't. Adding to # the confusion, Apple moved /Developer/SDKs into the Xcode app bundle # so the path can't be guessed by clever build tools (like Boost.Build). # Sometimes configure gets it wrong anyway, especially on cross compiles. # This is why we prefer using (OBJ)CFLAGS, (OBJ)CXXFLAGS, and LDFLAGS. # Check if SYSROOT is set and not empty if [ -n "$SYSROOT" ]; then C_FLAGS="-isysroot $SYSROOT" LDFLAGS="$LDFLAGS -Wl,-syslibroot,$SYSROOT" fi # Check if MIN_OSX_VERSION is set and not empty if [ -n "$MIN_OSX_VERSION" ]; then C_FLAGS="$C_FLAGS -mmacosx-version-min=$MIN_OSX_VERSION" # clang and llvm-gcc look at mmacosx-version-min to determine link target # and CRT version, and use it to set the macosx_version_min linker flag LDFLAGS="$LDFLAGS -mmacosx-version-min=$MIN_OSX_VERSION" fi CFLAGS="$CFLAGS $C_FLAGS -fvisibility=hidden" CXXFLAGS="$CXXFLAGS $C_FLAGS -stdlib=libc++ -std=c++17" OBJCFLAGS="$OBJCFLAGS $C_FLAGS" OBJCXXFLAGS="$OBJCXXFLAGS $C_FLAGS" # Force x86_64 architecture on MacOS for now. # NB: annoyingly, this is rather unstandardised. Some libs expect -arch, others different things. # Further: wxWidgets uses its own system and actually fails to compile with arch arguments. ARCHLESS_CFLAGS=$CFLAGS ARCHLESS_CXXFLAGS=$CXXFLAGS ARCHLESS_LDFLAGS="$LDFLAGS -stdlib=libc++" # If ARCH isn't set, select either x86_64 or arm64 if [ -z "${ARCH}" ]; then ARCH=$(uname -m) fi if [ "$ARCH" = "arm64" ]; then # Some libs want this passed to configure for cross compilation. HOST_PLATFORM="--host=aarch64-apple-darwin" else CXXFLAGS="$CXXFLAGS -msse4.1" # Some libs want this passed to configure for cross compilation. HOST_PLATFORM="--host=x86_64-apple-darwin" fi CFLAGS="$CFLAGS -arch $ARCH" CXXFLAGS="$CXXFLAGS -arch $ARCH" LDFLAGS="$LDFLAGS -arch $ARCH" # CMake doesn't seem to pick up on architecture with CFLAGS only CMAKE_FLAGS="-DCMAKE_OSX_ARCHITECTURES=$ARCH -DCMAKE_OSX_DEPLOYMENT_TARGET=$MIN_OSX_VERSION" JOBS=${JOBS:="-j2"} set -e die() { echo ERROR: "$*" exit 1 } # $1 base url for download # $2 target file name download_lib() { if [ ! -e "$2" ]; then echo "Downloading $2" curl -fLo "$2" "$1$2" || die "Download of $1$2 failed" fi } already_built() { echo "Skipping - already built (use --force-rebuild to override)" } # Check that we're actually on macOS if [ "$(uname -s)" != "Darwin" ]; then die "This script is intended for macOS only" fi # Parse command-line options: force_rebuild=false for i in "$@"; do case $i in --force-rebuild) force_rebuild=true ;; -j*) JOBS=$i ;; esac done cd "$(dirname "$0")" # Now in libraries/ (where we assume this script resides) mkdir -p macos cd macos # Create a location to create copies of dependencies' *.pc files, so they can be found by pkg-config PC_PATH="$(pwd)/pkgconfig/" if [ $force_rebuild = "true" ]; then rm -rf "$PC_PATH" fi mkdir -p "$PC_PATH" # -------------------------------------------------------------- echo "Building zlib..." ZLIB_DIR="$(pwd)/zlib" ( LIB_VERSION="${ZLIB_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY=$LIB_VERSION LIB_URL="https://zlib.net/fossils/" mkdir -p zlib cd zlib if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # patch zlib's configure script to use our CFLAGS and LDFLAGS patch -Np0 -i ../../../macos-patches/zlib_flags.diff # hand written configure script, need to set CFLAGS and LDFLAGS in env CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" \ ./configure \ --prefix="$ZLIB_DIR" \ --static make "${JOBS}" make install ) || die "zlib build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed building zlib" # -------------------------------------------------------------- echo "Building libcurl..." ( LIB_VERSION="${CURL_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.bz2" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://curl.haxx.se/download/" mkdir -p libcurl cd libcurl if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY ./configure \ CFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ --prefix="$INSTALL_DIR" \ --enable-ipv6 \ --with-darwinssl \ --without-gssapi \ --without-libmetalink \ --without-libpsl \ --without-librtmp \ --without-libssh2 \ --without-nghttp2 \ --without-nss \ --without-polarssl \ --without-ssl \ --without-gnutls \ --without-brotli \ --without-cyassl \ --without-winssl \ --without-mbedtls \ --without-wolfssl \ --without-spnego \ --disable-ares \ --disable-ldap \ --disable-ldaps \ --without-libidn2 \ --with-zlib="${ZLIB_DIR}" \ --enable-shared=no make "${JOBS}" make install ) || die "libcurl build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build curl" # -------------------------------------------------------------- echo "Building libiconv..." ICONV_DIR="$(pwd)/iconv" ( LIB_VERSION="${ICONV_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://ftp.gnu.org/pub/gnu/libiconv/" mkdir -p iconv cd iconv if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY ./configure \ CFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ --prefix="$ICONV_DIR" \ --without-libiconv-prefix \ --without-libintl-prefix \ --disable-nls \ --enable-shared=no make "${JOBS}" make install ) || die "libiconv build failed" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build iconv" # -------------------------------------------------------------- echo "Building libxml2..." ( LIB_VERSION="${XML2_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="ftp://xmlsoft.org/libxml2/" mkdir -p libxml2 cd libxml2 if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY ./configure \ CFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ --prefix="$INSTALL_DIR" \ --without-lzma \ --without-python \ --with-iconv="${ICONV_DIR}" \ --with-zlib="${ZLIB_DIR}" \ --enable-shared=no make "${JOBS}" make install ) || die "libxml2 build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build libxml2" # -------------------------------------------------------------- echo "Building SDL2..." ( LIB_VERSION="${SDL2_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY=$LIB_VERSION LIB_URL="https://libsdl.org/release/" mkdir -p sdl2 cd sdl2 if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # We don't want SDL2 to pull in system iconv, force it to detect ours with flags. # Don't use X11 - we don't need it and Mountain Lion removed it ./configure \ CPPFLAGS="-I${ICONV_DIR}/include" \ CFLAGS="$CFLAGS" \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS -L${ICONV_DIR}/lib" \ --prefix="$INSTALL_DIR" \ --disable-video-x11 \ --without-x \ --enable-video-cocoa \ --enable-shared=no make "$JOBS" make install ) || die "SDL2 build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build SDL2" # -------------------------------------------------------------- echo "Building Boost..." ( LIB_VERSION="${BOOST_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.bz2" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/" mkdir -p boost cd boost if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY include lib tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # Can't use macosx-version, see above comment. ./bootstrap.sh \ --with-libraries=filesystem,system \ --prefix="$INSTALL_DIR" ./b2 \ cflags="$CFLAGS" \ toolset=clang \ cxxflags="$CXXFLAGS" \ linkflags="$LDFLAGS" "${JOBS}" \ -d2 \ --layout=system \ --debug-configuration \ link=static \ threading=multi \ variant=release \ install ) || die "Boost build failed" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build boost" # -------------------------------------------------------------- # TODO: This build takes ages, anything we can exclude? echo "Building wxWidgets..." ( LIB_VERSION="${WXWIDGETS_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.bz2" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://github.com/wxWidgets/wxWidgets/releases/download/v3.1.4/" mkdir -p wxwidgets cd wxwidgets if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( mkdir -p $LIB_DIRECTORY/build-release cd $LIB_DIRECTORY/build-release CONF_OPTS=" --prefix=$INSTALL_DIR --disable-shared --enable-unicode --with-cocoa --with-opengl --with-libiconv-prefix=${ICONV_DIR} --enable-universal-binary=${ARCH} --with-expat=builtin --with-libpng=builtin --without-libtiff --without-sdl --without-x --disable-stc --disable-webview --disable-webkit --disable-webviewwebkit --disable-webviewie --without-libjpeg" # wxWidgets configure now defaults to targeting 10.5, if not specified, # but that conflicts with our flags if [ -n "$MIN_OSX_VERSION" ]; then CONF_OPTS="$CONF_OPTS --with-macosx-version-min=$MIN_OSX_VERSION" fi # shellcheck disable=SC2086 ../configure \ CFLAGS="$ARCHLESS_CFLAGS" \ CXXFLAGS="$ARCHLESS_CXXFLAGS" \ CPPFLAGS="-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=1" \ LDFLAGS="$ARCHLESS_LDFLAGS" $CONF_OPTS make "${JOBS}" make install ) || die "wxWidgets build failed" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build wxWidgets" # -------------------------------------------------------------- echo "Building libpng..." ( LIB_VERSION="${PNG_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://download.sourceforge.net/libpng/" mkdir -p libpng cd libpng if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # libpng has no flags for zlib but the 10.12 version is too old, so link our own. ./configure \ CFLAGS="$CFLAGS" \ CPPFLAGS=" -I $ZLIB_DIR/include " \ LDFLAGS="$LDFLAGS -L$ZLIB_DIR/lib" \ --prefix="$INSTALL_DIR" \ --enable-shared=no make "${JOBS}" make install ) || die "libpng build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build libpng" # -------------------------------------------------------------- echo "Building freetype..." ( LIB_VERSION="${FREETYPE_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="https://download.savannah.gnu.org/releases/freetype/" mkdir -p freetype cd freetype if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY ./configure \ CFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ --prefix="$INSTALL_DIR" \ "$HOST_PLATFORM" \ --enable-shared=no \ --with-harfbuzz=no \ --with-bzip2=no \ --with-brotli=no make "${JOBS}" make install ) || die "freetype build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build freetype" # -------------------------------------------------------------- # Dependency of vorbis echo "Building libogg..." OGG_DIR="$(pwd)/libogg" ( LIB_VERSION="${OGG_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://downloads.xiph.org/releases/ogg/" mkdir -p libogg cd libogg if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY include lib share tar -xf $LIB_ARCHIVE # shellcheck disable=SC2086 cmake -B libogg \ -S $LIB_DIRECTORY \ -G "Unix Makefiles" \ -DCMAKE_INSTALL_PREFIX="$OGG_DIR" \ -DBUILD_SHARED_LIBS=OFF \ -DINSTALL_DOCS=OFF \ -DCMAKE_C_FLAGS="$CFLAGS" \ $CMAKE_FLAGS cmake --build libogg "${JOBS}" --target install cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build libogg" # -------------------------------------------------------------- echo "Building libvorbis..." ( LIB_VERSION="${VORBIS_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://downloads.xiph.org/releases/vorbis/" mkdir -p vorbis cd vorbis if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY include lib share tar -xf $LIB_ARCHIVE # shellcheck disable=SC2086 cmake -B libvorbis \ -S $LIB_DIRECTORY \ -G "Unix Makefiles" \ -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ -DCMAKE_PREFIX_PATH="$OGG_DIR" \ -DBUILD_SHARED_LIBS=OFF \ -DINSTALL_DOCS=OFF \ -DCMAKE_C_FLAGS="$CFLAGS" \ $CMAKE_FLAGS cmake --build libvorbis "${JOBS}" --target install cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build libvorbis" # -------------------------------------------------------------- echo "Building GMP..." GMP_DIR="$(pwd)/gmp" ( LIB_VERSION="${GMP_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.bz2" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="https://gmplib.org/download/gmp/" mkdir -p gmp cd gmp if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # NOTE: enable-fat in this case allows building and running on different CPUS. # Otherwise CPU-specific instructions will be used with no fallback for older CPUs. ./configure \ CFLAGS="$CFLAGS" \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS" \ "$HOST_PLATFORM" \ --prefix="$INSTALL_DIR" \ --enable-fat \ --disable-shared \ --with-pic make "${JOBS}" make install ) || die "GMP build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build GMP" # -------------------------------------------------------------- echo "Building Nettle..." # Also builds hogweed NETTLE_DIR="$(pwd)/nettle" ( LIB_VERSION="${NETTLE_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="https://ftp.gnu.org/gnu/nettle/" mkdir -p nettle cd nettle if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # NOTE: enable-fat in this case allows building and running on different CPUS. # Otherwise CPU-specific instructions will be used with no fallback for older CPUs. ./configure \ CFLAGS="$CFLAGS" \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS" \ --with-include-path="${GMP_DIR}/include" \ --with-lib-path="${GMP_DIR}/lib" \ --prefix="$INSTALL_DIR" \ --enable-fat \ --disable-shared \ --disable-documentation \ --disable-openssl \ --disable-assembler make "${JOBS}" make install ) || die "Nettle build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build nettle" # -------------------------------------------------------------- echo "Building GnuTLS..." GNUTLS_DIR="$(pwd)/gnutls" ( LIB_VERSION="${GNUTLS_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.xz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="https://www.gnupg.org/ftp/gcrypt/gnutls/v3.8/" mkdir -p gnutls cd gnutls if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # Patch GNUTLS for a linking issue with isdigit # Patch by Ross Nicholson: https://gitlab.com/gnutls/gnutls/-/issues/1033#note_379529145 patch -Np1 -i ../../../macos-patches/03-undo-libtasn1-cisdigit.patch ./configure \ CFLAGS="$CFLAGS" \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS" \ LIBS="-L${GMP_DIR}/lib -lgmp" \ NETTLE_CFLAGS="-I${NETTLE_DIR}/include" \ NETTLE_LIBS="-L${NETTLE_DIR}/lib -lnettle" \ HOGWEED_CFLAGS="-I${NETTLE_DIR}/include" \ HOGWEED_LIBS="-L${NETTLE_DIR}/lib -lhogweed" \ GMP_CFLAGS="-I${GMP_DIR}/include" \ GMP_LIBS="-L${GMP_DIR}/lib -lgmp" \ "$HOST_PLATFORM" \ --prefix="$INSTALL_DIR" \ --enable-shared=no \ --without-idn \ --with-included-unistring \ --with-included-libtasn1 \ --without-p11-kit \ --without-brotli \ --without-zstd \ --without-tpm2 \ --disable-libdane \ --disable-tests \ --disable-doc \ --disable-tools \ --disable-nls make "${JOBS}" LDFLAGS= install ) || die "GnuTLS build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build GnuTLS" # -------------------------------------------------------------- echo "Building gloox..." ( LIB_VERSION="${GLOOX_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.bz2" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://camaya.net/download/" mkdir -p gloox cd gloox if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY # TODO: pulls in libresolv dependency from /usr/lib ./configure \ CFLAGS="$CFLAGS" \ CXXFLAGS="$CXXFLAGS" \ LDFLAGS="$LDFLAGS" \ "$HOST_PLATFORM" \ --prefix="$INSTALL_DIR" \ GNUTLS_CFLAGS="-I${GNUTLS_DIR}/include" \ GNUTLS_LIBS="-L${GNUTLS_DIR}/lib -lgnutls" \ --enable-shared=no \ --with-zlib="${ZLIB_DIR}" \ --without-libidn \ --with-gnutls="yes" \ --without-openssl \ --without-tests \ --without-examples \ --disable-getaddrinfo make "${JOBS}" make install ) || die "gloox build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build gloox" # -------------------------------------------------------------- echo "Building ICU..." ( LIB_VERSION="${ICU_VERSION}" LIB_ARCHIVE="$LIB_VERSION-src.tgz" LIB_DIRECTORY="icu" LIB_URL="https://github.com/unicode-org/icu/releases/download/release-69-1/" mkdir -p icu cd icu if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib sbin share tar -xf $LIB_ARCHIVE ( mkdir -p $LIB_DIRECTORY/source/build cd $LIB_DIRECTORY/source/build CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" \ ../runConfigureICU MacOSX \ "$HOST_PLATFORM" \ --prefix="$INSTALL_DIR" \ --disable-shared \ --enable-static \ --disable-samples \ --enable-extras \ --enable-icuio \ --enable-tools make "${JOBS}" make install ) || die "ICU build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build ICU" # -------------------------------------------------------------- echo "Building ENet..." ( LIB_VERSION="${ENET_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://enet.bespin.org/download/" mkdir -p enet cd enet if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib sbin share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY ./configure \ CFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ --prefix="${INSTALL_DIR}" \ --enable-shared=no make clean make "${JOBS}" make install ) || die "ENet build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build ENet" # -------------------------------------------------------------- echo "Building MiniUPnPc..." ( LIB_VERSION="${MINIUPNPC_VERSION}" LIB_ARCHIVE="$LIB_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="http://miniupnp.tuxfamily.org/files/download.php?file=" mkdir -p miniupnpc cd miniupnpc if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat <.already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib "$LIB_URL" $LIB_ARCHIVE rm -rf $LIB_DIRECTORY bin include lib share tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY make clean make CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" "${JOBS}" make INSTALLPREFIX="$INSTALL_DIR" install ) || die "MiniUPnPc build failed" # TODO: how can we not build the dylibs? rm -f lib/*.dylib cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build MiniUPnPc" # -------------------------------------------------------------- echo "Building libsodium..." ( LIB_VERSION="${SODIUM_VERSION}" LIB_ARCHIVE="$SODIUM_VERSION.tar.gz" LIB_DIRECTORY="$LIB_VERSION" LIB_URL="https://download.libsodium.org/libsodium/releases/" mkdir -p libsodium cd libsodium if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$LIB_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY include lib tar -xf $LIB_ARCHIVE ( cd $LIB_DIRECTORY ./configure CFLAGS="$CFLAGS" \ LDFLAGS="$LDFLAGS" \ --prefix="${INSTALL_DIR}" \ --enable-shared=no make clean make CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" "${JOBS}" make check make INSTALLPREFIX="$INSTALL_DIR" install ) || die "libsodium build failed" cp -f lib/pkgconfig/* "$PC_PATH" echo "$LIB_VERSION" >.already-built else already_built fi ) || die "Failed to build libsodium" # -------------------------------------------------------------- echo "Building fmt..." ( LIB_DIRECTORY="fmt-$FMT_VERSION" LIB_ARCHIVE="$FMT_VERSION.tar.gz" LIB_URL="https://github.com/fmtlib/fmt/archive/" mkdir -p fmt cd fmt if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$FMT_VERSION" ]; then INSTALL_DIR="$(pwd)" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf $LIB_DIRECTORY include lib tar -xf $LIB_ARCHIVE # It appears that older versions of Clang require constexpr statements to have a user-set constructor. patch -Np1 -i ../../../macos-patches/fmt_constexpr.diff # shellcheck disable=SC2086 cmake -B libfmt \ -S $LIB_DIRECTORY \ -DFMT_TEST=False \ -DFMT_DOC=False \ -DCMAKE_C_FLAGS="$CFLAGS" \ -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ $CMAKE_FLAGS cmake --build libfmt "${JOBS}" --target install cp -f lib/pkgconfig/* "$PC_PATH" echo "$FMT_VERSION" >.already-built else already_built fi ) || die "Failed to build fmt" # -------------------------------------------------------------- echo "Building Molten VK..." ( LIB_DIRECTORY="MoltenVK-$MOLTENVK_VERSION" LIB_ARCHIVE="MoltenVK-$MOLTENVK_VERSION.tar.gz" LIB_URL="https://releases.wildfiregames.com/libs/" mkdir -p "molten-vk" cd "molten-vk" if [ $force_rebuild = "true" ] || [ ! -e .already-built ] || [ "$(cat .already-built)" != "$MOLTENVK_VERSION" ] || [ ! -e ../../../binaries/system/libMoltenVK.dylib ]; then INSTALL_DIR="../../../binaries/system/" rm -f .already-built download_lib $LIB_URL $LIB_ARCHIVE rm -rf "$LIB_DIRECTORY" tar -xf $LIB_ARCHIVE # The CI cannot build MoltenVK so we provide prebuild binaries instead. # Use mv instead of copy to preserve binary signature integrity. See: # https://developer.apple.com/forums/thread/130313?answerId=410541022#410541022 mv $LIB_DIRECTORY/dylib/libMoltenVK.dylib $INSTALL_DIR echo "$MOLTENVK_VERSION" >.already-built else already_built fi ) || die "Failed to build MoltenVK" # -------------------------------------------------------------------- # The following libraries are shared on different OSes and may # be customized, so we build and install them from bundled sources # (served over SVN or other sources) # -------------------------------------------------------------------- export ARCH CXXFLAGS CFLAGS LDFLAGS CMAKE_FLAGS JOBS # -------------------------------------------------------------- echo "Building cxxtest..." ./../source/cxxtest-4.4/build.sh || die "cxxtest build failed" # -------------------------------------------------------------- echo "Building FCollada..." ./../source/fcollada/build.sh || die "FCollada build failed" # -------------------------------------------------------------- echo "Building nvtt..." ./../source/nvtt/build.sh || die "NVTT build failed" # -------------------------------------------------------------- echo "Building Spidermonkey..." ./../source/spidermonkey/build.sh || die "SpiderMonkey build failed"