#!/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 TARGET_ARCH=x86_64-unknown-linux-gnu #TARGET_ARCH=arm-unknown-linux-gnueabihf export TARGET_ARCH SDL_DIR=SDL-gui-backend SDL_BUILD_DIR=build-$SDL_DIR # 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 make $MAKE_ARGS clean make $MAKE_ARGS 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 } BuildLND() { echo "building LinuxNativeDialogs" set -x cd Source/ThirdParty/LinuxNativeDialogs/UELinuxNativeDialogs rm -rf build mkdir build cd build cmake .. make $MAKE_ARGS local LIB_DIR=../lib/Linux/$TARGET_ARCH/ mv *.so $LIB_DIR cp -P --remove-destination $LIB_DIR/*.so ${TOP_DIR}/Binaries/ThirdParty/LinuxNativeDialogs/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/ rm -rf $SDL_BUILD_DIR mkdir -p $SDL_BUILD_DIR cd $SDL_BUILD_DIR cmake ../$SDL_DIR make ${MAKE_ARGS} P4Open ../$SDL_DIR/lib/Linux/x86_64-unknown-linux-gnu/libSDL2.a P4Open ../$SDL_DIR/lib/Linux/x86_64-unknown-linux-gnu/libSDL2_fPIC.a cp --remove-destination libSDL2.a ../$SDL_DIR/lib/Linux/x86_64-unknown-linux-gnu/libSDL2.a cp --remove-destination libSDL2_fPIC.a ../$SDL_DIR/lib/Linux/x86_64-unknown-linux-gnu/libSDL2_fPIC.a 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 } 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 } 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 BuildLND Run BuildForsythTriOO Run BuildnvTriStrip Run BuildnvTextureTools Run BuildSDL2 Run Buildcoremod Run FixICU } 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 " LND" echo " ForsythTriOO" echo " nvTriStrip" echo " nvTextureTools" echo " SDL2" echo " coremod" echo " ICU" } 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 # detect the OS and only build on non-Ubuntu BUILD_LND=true if [ -e /etc/os-release ]; then source /etc/os-release if [[ "$ID" == "ubuntu" ]] || [[ "$ID_LIKE" == "ubuntu" ]]; then # assuming reasonably new version. FIXME: should check BUILD_LND=false fi fi if [ "$BUILD_LND" = true ]; then echo "You run some non-Ubuntu Linux distro. We have to build LinuxNativeDialogs for your OS." Run BuildLND else echo "You run Ubuntu or its fork. All dependencies have been already prebuilt." fi fi echo Success