#!/bin/bash # Script for building ThirdParty modules for linux. # You must run UpdateDeps.sh to download and patch the sources before running # this script. SCRIPT_DIR=$(cd "$(dirname "$BASH_SOURCE")" ; pwd) TOP_DIR=$(cd "$SCRIPT_DIR/../../.." ; pwd) cd "${TOP_DIR}" mkdir -p Binaries/Linux/ set -e MAKE_ARGS=-j4 ARCHES=("amd64 x86_64-unknown-linux-gnu" "arm64 aarch64-unknown-linux-gnueabi") ConvertArchFormat() { if [ -z $TARGET_ARCH ]; then TARGET_ARCH="amd64" fi for arch in "${ARCHES[@]}"; do arch_split=($arch) if [ "${arch_split[0]}" == "$TARGET_ARCH" ]; then TARGET_ARCH=${arch_split[1]} echo "Target arch set to: $TARGET_ARCH" return fi done echo "Target arch not found" exit } ConvertArchFormat export TARGET_ARCH SDL_DIR=SDL-gui-backend # Open files for edit using p4 command line. # Does nothing if the file is already writable (which is case for external # github developers). P4Open() { for file in $@; do # If the file does not exist do nothing if [ ! -e $file ]; then return fi # If the file is already writable do nothing if [ -w $file ]; then return fi # If the file is already writable do nothing if ! which p4 > /dev/null; then echo "File is not writable and 'p4' command not found." exit 1 fi set +x p4 open "$file" set -x done } BuildZ() { echo "building zlib" set -x cd Source/ThirdParty/zlib/zlib-1.2.5/build tar xf zlib-1.2.5.tar.gz cd zlib-1.2.5 CFLAGS=-fPIC ./configure make $MAKE_ARGS local LIB_DIR=../../Lib/Linux/$TARGET_ARCH P4Open $LIB_DIR/libz.a P4Open $LIB_DIR/libz_fPIC.a mkdir -p $LIB_DIR cp libz.a $LIB_DIR/libz_fPIC.a set +x } BuildJemalloc() { echo "building jemalloc" set -x cd Source/ThirdParty/jemalloc/build tar xf jemalloc-3.6.0.tar.bz2 cd jemalloc-3.6.0 ./configure --with-mangling --with-jemalloc-prefix=je_ make $MAKE_ARGS local LIB_DIR=../../lib/Linux/$TARGET_ARCH local INC_DIR=../../include/Linux/$TARGET_ARCH P4Open $LIB_DIR/libjemalloc.a P4Open $LIB_DIR/libjemalloc_pic.a mkdir -p $LIB_DIR cp lib/libjemalloc.a $LIB_DIR cp lib/libjemalloc_pic.a $LIB_DIR mkdir -p $INC_DIR P4Open $INC_DIR/jemalloc_defs.h P4Open $INC_DIR/jemalloc.h cp -rp include/jemalloc/* $INC_DIR set +x } BuildOpus() { echo "building libOpus" set -x cd Source/ThirdParty/libOpus/opus-1.1/ P4Open configure chmod +x configure ./configure --with-pic make $MAKE_ARGS local LIB_DIR=Linux/$TARGET_ARCH mkdir -p $LIB_DIR P4Open $LIB_DIR/libopus_fPIC.a cp .libs/libopus.a $LIB_DIR/libopus_fPIC.a set +x } BuildOgg() { echo "building Ogg" set -x cd Source/ThirdParty/Ogg/libogg-1.2.2/ P4Open configure chmod +x configure ./configure --with-pic make $MAKE_ARGS local LIB_DIR=lib/Linux/$TARGET_ARCH P4Open $LIB_DIR/libogg.a P4Open $LIB_DIR/libogg_fPIC.a mkdir -p $LIB_DIR cp src/.libs/libogg.a $LIB_DIR cp $LIB_DIR/libogg.a $LIB_DIR/libogg_fPIC.a set +x } BuildVorbis() { echo "building Vorbis" set -x cd Source/ThirdParty/Vorbis/libvorbis-1.3.2/ P4Open configure chmod +x configure OGG_LIBS=../../Ogg/libogg-1.2.2/lib/Linux \ OGG_CFLAGS=-I../../../Ogg/libogg-1.2.2/include \ ./configure --with-pic --disable-oggtest make $MAKE_ARGS local LIB_DIR=lib/Linux/$TARGET_ARCH P4Open $LIB_DIR/libvorbis.a $LIB_DIR/libvorbisfile.a $LIB_DIR/libvorbis_fPIC.a $LIB_DIR/libvorbisfile_fPIC.a P4Open $LIB_DIR/libvorbisenc.a $LIB_DIR/libvorbisenc_fPIC.a mkdir -p $LIB_DIR cp lib/.libs/libvorbis*.a $LIB_DIR/ cp $LIB_DIR/libvorbis.a libvorbis_fPIC.a cp $LIB_DIR/libvorbisfile.a libvorbisfile_fPIC.a cp $LIB_DIR/libvorbisenc.a libvorbisenc_fPIC.a set +x cd - } BuildHLSLCC() { echo "building hlslcc" set -x cd Source/ThirdParty/hlslcc # not building anymore P4Open hlslcc/bin/Linux/hlslcc_64 P4Open hlslcc/lib/Linux/$TARGET_ARCH/libhlslcc.a cd hlslcc/projects/Linux set +e CLANG_TO_USE=`which clang` set -e if [ ! -f "$CLANG_TO_USE" ]; then echo "Please install clang package and/or update alternatives appropriately so it is available as \"clang\"" exit 1 fi set +e CLANGXX_TO_USE=`which clang++` set -e if [ ! -f "$CLANGXX_TO_USE" ]; then echo "Please install clang++ package and/or update alternatives appropriately so it is available as \"clang++\"" exit 1 fi make $MAKE_ARGS CC=$CLANG_TO_USE CXX=$CLANGXX_TO_USE clean make $MAKE_ARGS CC=$CLANG_TO_USE CXX=$CLANGXX_TO_USE set +x } BuildMcpp() { echo "building MCPP" set -x cd Source/ThirdParty/MCPP/mcpp-2.7.2 P4Open configure chmod +x configure ./configure --enable-shared --enable-shared --enable-mcpplib make $MAKE_ARGS local LIB_DIR=lib/Linux/$TARGET_ARCH P4Open $LIB_DIR/libmcpp.a P4Open $LIB_DIR/libmcpp.so P4Open ${TOP_DIR}/Binaries/Linux/libmcpp.so.0 mkdir -p $LIB_DIR cp --remove-destination ./src/.libs/libmcpp.a $LIB_DIR/ cp --remove-destination ./src/.libs/libmcpp.so $LIB_DIR/ cp --remove-destination ./src/.libs/libmcpp.so ${TOP_DIR}/Binaries/Linux/libmcpp.so.0 set +x } BuildFreeType() { echo "building freetype" set -x cd Source/ThirdParty/FreeType2/FreeType2-2.4.12/src pwd make $MAKE_ARGS -f ../Builds/Linux/makefile $* local LIB_DIR=../Lib/Linux/$TARGET_ARCH P4Open $LIB_DIR/libfreetype2412.a P4Open $LIB_DIR/libfreetype2412_fPIC.a cp --remove-destination libfreetype2412.a $LIB_DIR/libfreetype2412.a cp $LIB_DIR/libfreetype2412.a $LIB_DIR/libfreetype2412_fPIC.a set +x } BuildICU() { echo "building libICU" set -x cd Source/ThirdParty/ICU/icu4c-53_1/source P4Open configure chmod +x configure CPPFLAGS=-fPIC ./configure --enable-static pwd make $MAKE_ARGS $* local LIB_DIR=../Linux/$TARGET_ARCH mkdir -p $LIB_DIR mkdir -p ${TOP_DIR}/Binaries/ThirdParty/ICU/icu4c-53_1/Linux/$TARGET_ARCH/ P4Open $LIB_DIR/libicudata.a $LIB_DIR/libicudatad.a $LIB_DIR/libicui18n.a $LIB_DIR/libicui18nd.a P4Open $LIB_DIR/libicuio.a $LIB_DIR/libicuiod.a $LIB_DIR/libicule.a $LIB_DIR/libiculed.a P4Open $LIB_DIR/libiculx.a $LIB_DIR/libiculxd.a $LIB_DIR/libicutu.a $LIB_DIR/libicutud.a P4Open $LIB_DIR/libicuuc.a $LIB_DIR/libicuucd.a cp --remove-destination lib/*.a $LIB_DIR cp -P --remove-destination lib/*.so* ${TOP_DIR}/Binaries/ThirdParty/ICU/icu4c-53_1/Linux/$TARGET_ARCH/ set +x } BuildForsythTriOO() { echo "building ForsythTriOO" set -x cd Source/ThirdParty/ForsythTriOO rm -rf Build/Linux mkdir -p Build/Linux mkdir -p Lib/Linux/$TARGET_ARCH cd Build/Linux cmake -DCMAKE_BUILD_TYPE=Debug ../../ make cmake -DCMAKE_BUILD_TYPE=Release ../../ make P4Open ../../Lib/Linux/$TARGET_ARCH/libForsythTriOptimizer* cp --remove-destination libForsythTriOptimizer* ../../Lib/Linux/$TARGET_ARCH/ set +x } BuildnvTriStrip() { echo "building nvTriStrip" set -x cd Source/ThirdParty/nvTriStrip/nvTriStrip-1.0.0 rm -rf Build/Linux mkdir -p Build/Linux mkdir -p Lib/Linux/$TARGET_ARCH cd Build/Linux cmake -DCMAKE_BUILD_TYPE=Debug ../../ make cmake -DCMAKE_BUILD_TYPE=Release ../../ make P4Open ../../Lib/Linux/$TARGET_ARCH/libnvtristrip* cp --remove-destination libnvtristrip* ../../Lib/Linux/$TARGET_ARCH/ set +x } BuildnvTextureTools() { echo "building nvTextureTools" set -x cd Source/ThirdParty/nvTextureTools/nvTextureTools-2.0.8 mkdir -p lib/Linux/$TARGET_ARCH cd src rm -rf build P4Open configure chmod +x ./configure CXXFLAGS=-fPIC ./configure --release make local LIB_DIR=../lib/Linux/$TARGET_ARCH P4Open $LIB_DIR/libnvcore.so cp --remove-destination build/src/nvcore/libnvcore.so $LIB_DIR/ P4Open $LIB_DIR/libnvimage.so cp --remove-destination build/src/nvimage/libnvimage.so $LIB_DIR/ P4Open $LIB_DIR/libnvmath.so cp --remove-destination build/src/nvmath/libnvmath.so $LIB_DIR/ P4Open $LIB_DIR/libnvtt.so cp --remove-destination build/src/nvtt/libnvtt.so $LIB_DIR/ P4Open $LIB_DIR/libsquish.so cp --remove-destination build/src/nvtt/squish/libsquish.a $LIB_DIR/ cp --remove-destination $LIB_DIR/*.so ${TOP_DIR}/Binaries/Linux/ set +x } BuildSDL2() { echo "building SDL2" set -x cd Source/ThirdParty/SDL2/ for lib in $SDL_DIR/lib/Linux/$TARGET_ARCH/* do P4Open $lib done ./build.sh set +x } Buildcoremod() { echo "building coremod" set -x cd Source/ThirdParty/coremod/coremod-4.2.6 pwd autoconf CFLAGS=-fPIC ./configure --enable-static make $MAKE_ARGS local LIB_DIR=lib/Linux/$TARGET_ARCH mkdir -p $LIB_DIR P4Open $LIB_DIR/libcoremodLinux.a cp lib/libxmp-coremod.a $LIB_DIR/libcoremodLinux.a set +x } BuildGoogleTest() { echo "building GoogleTest" set -x cd Source/ThirdParty/GoogleTest/ for lib in lib/Linux/$TARGET_ARCH/* do P4Open $lib done cd build/Linux sh build-linux-all.sh set +x } BuildToolchain() { echo "building Toolchain" set -x cd Build/BatchFiles/Linux/Toolchain sh BuildCrossToolchain.sh set +x } BuildLLVMCompilerRt() { echo "building LLVM-compiler-rt" set -x cd Build/BatchFiles/Linux/Toolchain sh BuildLLVM-compiler-rt.sh set +x } FixICU() { echo "setting symlinks for ICU libraries (possibly temporary)" set -x cd Binaries/ThirdParty/ICU/icu4c-53_1/Linux/x86_64-unknown-linux-gnu pwd ln -sf libicudata.so libicudata.so.53 ln -sf libicudata.so libicudata.53.1.so ln -sf libicui18n.so libicui18n.so.53 ln -sf libicui18n.so libicui18n.53.1.so ln -sf libicuio.so libicuio.so.53 ln -sf libicuio.so libicuio.53.1.so ln -sf libicule.so libicule.so.53 ln -sf libicule.so libicule.53.1.so ln -sf libiculx.so libiculx.so.53 ln -sf libiculx.so libiculx.53.1.so ln -sf libicutu.so libicutu.so.53 ln -sf libicutu.so libicutu.53.1.so ln -sf libicuuc.so libicuuc.so.53 ln -sf libicuuc.so libicuuc.53.1.so set +x } BuildStrophe() { echo "building libstrophe" set -x cd Source/ThirdParty/libstrophe/libstrophe-0.9.1/BuildForUE/Linux bash BuildForLinux.sh set +x } Run() { cd ${TOP_DIR} echo "==> $1" if [[ $VERBOSE -eq 1 ]]; then $1 else $1 >> ${SCRIPT_DIR}/BuildThirdParty.log 2>&1 fi } Success() { if [ -z $1 ]; then echo "********** SUCCESS ****************" else echo "********** SUCCESS $1 ****************" fi } build_all() { Run BuildJemalloc Run BuildZ Run BuildOpus Run BuildOgg Run BuildVorbis Run BuildHLSLCC Run BuildMcpp Run BuildFreeType Run BuildForsythTriOO Run BuildnvTriStrip Run BuildnvTextureTools Run BuildSDL2 Run Buildcoremod Run FixICU Run BuildStrophe } print_help() { echo "-a|--all Rebuild all ThirdParty libs" echo "-v|--verbose Print full output, otherwise output is logged to BuildThirdParty.log" echo "-b|--build BUILD_ME|--build=BUILD_ME Rebuild a specific library" print_valid_build_opts echo "-h|--help Print this help and exit" } print_valid_build_opts() { echo " Valid build choices are" echo " Jemalloc" echo " Z" echo " Opus" echo " Ogg" echo " Vorbis" echo " HLSLCC" echo " Mcpp" echo " FreeType" echo " ForsythTriOO" echo " nvTriStrip" echo " nvTextureTools" echo " SDL2" echo " coremod" echo " Toolchain" echo " ICU" echo " GoogleTest" echo " LLVMCompilerRt" echo " Strophe" } BuildList=() # Parse command line parameters while :; do case $1 in -h|--help) print_help exit ;; -v|--verbose) VERBOSE=1 shift continue ;; -a|--all) ALL=1 shift continue ;; -b|--build) # Add to the list of packages to build if [ "$2" ]; then BuildList+=("$2") BUILD_LIST=1 shift 2 continue else echo 'ERROR: Must specify non empty "--build=BUILD" argument.' >&2 print_valid_build_opts exit 1 fi ;; --build=?*) # Add to the list of packages to build BuildList+=("${1#*=}") BUILD_LIST=1 shift continue ;; --build=) echo 'ERROR: Must specify non empty "--build=BUILD" argument.' >&2 exit 1 ;; --) shift break ;; -?*) printf "WARN: Unknown Option (ignored): %s\n' "$1" >&2" ;; *) break esac shift done echo "Building ThirdParty libraries" echo echo "If you don't see SUCCESS message in the end, then building did not finish properly." echo "In that case, take a look into ${SCRIPT_DIR}/BuildThirdParty.log for details." echo rm -f ${SCRIPT_DIR}/BuildThirdParty.log # if -b --build or --build=?* is used, build the list # instead of the default or all if [[ ${#BuildList[@]} -ne 0 && $ALL -eq 0 ]]; then for var in "${BuildList[@]}" do if [[ "${var}" -ne "ICU" ]]; then Run Fix"${var}" Success "${var}" else Run Build"${var}" Success "${var}" fi done exit elif [[ ${#BuildList[@]} -ne 0 ]] && [[ $ALL -eq 1 ]]; then echo "ERROR: Can not build all and individual packages at the same time" exit fi if [[ $ALL -eq 1 ]]; then build_all else # we should not need to build hlslcc locally because it is now using the same bundled STL #Run BuildHLSLCC echo "No third party libs needed to be built locally" fi echo Success