#!/usr/bin/env bash
# ##### BEGIN GPL LICENSE BLOCK #####
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation,
#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####

# A shell script installing/building all needed dependencies to build Blender, for some Linux distributions.

# ----------------------------------------------------------------------------
# Debugging Helpers
#
# Use for developing this script (keep first).

# Useful for debugging this script:
USE_DEBUG_TRAP=${USE_DEBUG_TRAP:-0}
USE_DEBUG_LOG=${USE_DEBUG_LOG:-0}

# Print the line that exits.
if [ $USE_DEBUG_TRAP -ne 0 ]; then
  err_report() {
    echo "Error on line $1"
    exit 1
  }
  trap 'err_report $LINENO' ERR
fi

# Noisy, show every line that runs with it's line number.
if [ $USE_DEBUG_LOG -ne 0 ]; then
  PS4='\e[0;33m$(printf %4d ${LINENO}):\e\033[0m '
  set -x
fi

# ----------------------------------------------------------------------------
# Args and Help Handling

# Parse command line!
ARGS=$( \
getopt \
-o s:i:t:h \
--long source:,install:,tmp:,info:,threads:,help,show-deps,no-sudo,no-build,no-confirm,\
with-all,with-opencollada,with-jack,with-pulseaudio,with-embree,with-oidn,with-nanovdb,\
ver-ocio:,ver-oiio:,ver-llvm:,ver-osl:,ver-osd:,ver-openvdb:,ver-xr-openxr:,\
force-all,force-python,force-boost,force-tbb,\
force-ocio,force-openexr,force-oiio,force-llvm,force-osl,force-osd,force-openvdb,\
force-ffmpeg,force-opencollada,force-alembic,force-embree,force-oidn,force-usd,\
force-xr-openxr,\
build-all,build-python,build-boost,build-tbb,\
build-ocio,build-openexr,build-oiio,build-llvm,build-osl,build-osd,build-openvdb,\
build-ffmpeg,build-opencollada,build-alembic,build-embree,build-oidn,build-usd,\
build-xr-openxr,\
skip-python,skip-boost,skip-tbb,\
skip-ocio,skip-openexr,skip-oiio,skip-llvm,skip-osl,skip-osd,skip-openvdb,\
skip-ffmpeg,skip-opencollada,skip-alembic,skip-embree,skip-oidn,skip-usd,\
skip-xr-openxr \
-- "$@" \
)

COMMANDLINE=$@

DISTRO=""
RPM=""
SRC="$HOME/src/blender-deps"
INST="/opt/lib"
TMP="/tmp"
CWD=$PWD
INFO_PATH=$CWD
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

# Do not install some optional, potentially conflicting libs by default...
WITH_ALL=false

# Do not yet enable opencollada or embree, use --with-opencollada/--with-embree (or --with-all) option to try it.
WITH_OPENCOLLADA=false
WITH_EMBREE=false
WITH_OIDN=false

THREADS=$(nproc)

COMMON_INFO="\"Source code of dependencies needed to be compiled will be downloaded and extracted into '\$SRC'.
Built libs of dependencies needed to be compiled will be installed into '\$INST'.
Please edit \\\$SRC and/or \\\$INST variables at the beginning of this script,
or use --source/--install options, if you want to use other paths!

Number of threads for building: \$THREADS (automatically detected, use --threads=<nbr> to override it).
Full install: \$WITH_ALL (use --with-all option to enable it).
Building OpenCOLLADA: \$WITH_OPENCOLLADA (use --with-opencollada option to enable it).
Building Embree: \$WITH_EMBREE (use --with-embree option to enable it).
Building OpenImageDenoise: \$WITH_OIDN (use --with-oidn option to enable it).

Example:
Full install without OpenCOLLADA: --with-all --skip-opencollada

Use --help to show all available options!\""

ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
    -h, --help
        Show this message and exit.

    --show-deps
        Show main dependencies of Blender (including officially supported versions) and exit.

    -s <path>, --source=<path>
        Use a specific path where to store downloaded libraries sources (defaults to '\$SRC').

    -i <path>, --install=<path>
        Use a specific path where to install built libraries (defaults to '\$INST').

    --tmp=<path>
        Use a specific temp path (defaults to '\$TMP').

    --info=<path>
        Use a specific info path (to store BUILD_NOTES.txt, defaults to '\$INFO_PATH').

    -t n, --threads=n
        Use a specific number of threads when building the libraries (auto-detected as '\$THREADS').

    --no-sudo
        Disable use of sudo (this script won't be able to do much though, will just print needed packages...).

    --no-build
        Do not build (compile) anything, dependencies not installable with the package manager will remain missing.

    --no-confirm
        Disable any interaction with user (suitable for automated run).

    --with-all
        By default, a number of optional and not-so-often needed libraries are not installed.
        This option will try to install them, at the cost of potential conflicts (depending on
        how your package system is set…).
        Note this option also implies all other (more specific) --with-foo options below.

    --with-opencollada
        Build and install the OpenCOLLADA libraries.

    --with-embree
        Build and install the Embree libraries.

    --with-oidn
        Build and install the OpenImageDenoise libraries.

    --with-nanovdb
        Build and install the NanoVDB branch of OpenVDB (instead of official release of OpenVDB).

    --with-jack
        Install the jack libraries.

    --with-pulseaudio
        Install the pulseaudio libraries.

    --ver-ocio=<ver>
        Force version of OCIO library.

    --ver-oiio=<ver>
        Force version of OIIO library.

    --ver-llvm=<ver>
        Force version of LLVM library.

    --ver-osl=<ver>
        Force version of OSL library.

    --ver-osd=<ver>
        Force version of OSD library.

    --ver-openvdb=<ver>
        Force version of OpenVDB library.

    --ver-xr-openxr=<ver>
        Force version of OpenXR-SDK.

    Note about the --ver-foo options:
        It may not always work as expected (some libs are actually checked out from a git rev...), yet it might help
        to fix some build issues (like LLVM mismatch with the version used by your graphic system).

    --build-all
        Force the build of all possible libraries.

    --build-python
        Force the build of Python.

    --build-boost
        Force the build of Boost.

    --build-tbb
        Force the build of TBB.

    --build-ocio
        Force the build of OpenColorIO.

    --build-openexr
        Force the build of OpenEXR.

    --build-oiio
        Force the build of OpenImageIO.

    --build-llvm
        Force the build of LLVM.

    --build-osl
        Force the build of OpenShadingLanguage.

    --build-osd
        Force the build of OpenSubdiv.

    --build-openvdb
        Force the build of OpenVDB.

    --build-alembic
        Force the build of Alembic.

    --build-opencollada
        Force the build of OpenCOLLADA.

    --build-embree
        Force the build of Embree.

    --build-oidn
        Force the build of OpenImageDenoise.

    --build-ffmpeg
        Force the build of FFMpeg.

    --build-usd
        Force the build of Universal Scene Description.

    --build-xr-openxr
        Force the build of OpenXR-SDK.

    Note about the --build-foo options:
        * They force the script to prefer building dependencies rather than using available packages.
          This may make things simpler and allow working around some distribution bugs, but on the other hand it will
          use much more space on your hard drive.
        * Please be careful with the Blender building options if you have both 'official' dev packages and
          install_deps' built ones on your system, by default CMake will prefer official packages, which may lead to
          linking issues. Please ensure your CMake configuration always uses all correct library paths.
        * If the “force-built” library is a dependency of others, it will force the build
          of those libraries as well (e.g. --build-boost also implies --build-oiio and --build-osl...).

    --force-all
        Force the rebuild of all built libraries.

    --force-python
        Force the rebuild of Python.

    --force-boost
        Force the rebuild of Boost.

    --force-tbb
        Force the rebuild of TBB.

    --force-ocio
        Force the rebuild of OpenColorIO.

    --force-openexr
        Force the rebuild of OpenEXR.

    --force-oiio
        Force the rebuild of OpenImageIO.

    --force-llvm
        Force the rebuild of LLVM.

    --force-osl
        Force the rebuild of OpenShadingLanguage.

    --force-osd
        Force the rebuild of OpenSubdiv.

    --force-openvdb
        Force the rebuild of OpenVDB.

    --force-alembic
        Force the rebuild of Alembic.

    --force-opencollada
        Force the rebuild of OpenCOLLADA.

    --force-embree
        Force the rebuild of Embree.

    --force-oidn
        Force the rebuild of OpenImageDenoise.

    --force-ffmpeg
        Force the rebuild of FFMpeg.

    --force-usd
        Force the rebuild of Universal Scene Description.

    --force-xr-openxr
        Force the rebuild of OpenXR-SDK.

    Note about the --force-foo options:
        * They obviously only have an effect if those libraries are built by this script
          (i.e. if there is no available and satisfactory package)!
        * If the “force-rebuilt” library is a dependency of others, it will force the rebuild
          of those libraries too (e.g. --force-boost will also rebuild oiio and osl...).

    --skip-python
        Unconditionally skip Python installation/building.

    --skip-boost
        Unconditionally skip Boost installation/building.

    --skip-tbb
        Unconditionally skip TBB installation/building.

    --skip-ocio
        Unconditionally skip OpenColorIO installation/building.

    --skip-openexr
        Unconditionally skip OpenEXR installation/building.

    --skip-oiio
        Unconditionally skip OpenImageIO installation/building.

    --skip-llvm
        Unconditionally skip LLVM installation/building.

    --skip-osl
        Unconditionally skip OpenShadingLanguage installation/building.

    --skip-osd
        Unconditionally skip OpenSubdiv installation/building.

    --skip-openvdb
        Unconditionally skip OpenVDB installation/building.

    --skip-alembic
        Unconditionally skip Alembic installation/building.

    --skip-opencollada
        Unconditionally skip OpenCOLLADA installation/building.

    --skip-Embree
        Unconditionally skip Embree installation/building.

    --skip-oidn
        Unconditionally skip OpenImageDenoise installation/building.

    --skip-ffmpeg
        Unconditionally skip FFMpeg installation/building.

    --skip-usd
        Unconditionally skip Universal Scene Description installation/building.

    --skip-xr-openxr
        Unconditionally skip OpenXR-SDK installation/building.\""

# ----------------------------------------------------------------------------
# Main Vars

DO_SHOW_DEPS=false

SUDO="sudo"

NO_BUILD=false
NO_CONFIRM=false
USE_CXX11=true

# Note about versions: Min is inclusive, Max is exclusive (i.e. XXX_VERSION_MIN <= ACTUAL_VERSION < XXX_VERSION_MAX)
# XXX_VERSION is officially supported/used version in official builds.
# XXX_VERSION_SHORT is used for various things, like preferred version (when distribution provides several of them),
#                   and to name shortcuts to built libraries' installation directories...

CLANG_FORMAT_VERSION_MIN="6.0"
CLANG_FORMAT_VERSION_MAX="10.0"

PYTHON_VERSION="3.9.2"
PYTHON_VERSION_SHORT="3.9"
PYTHON_VERSION_MIN="3.7"
PYTHON_VERSION_MAX="3.11"
PYTHON_VERSION_INSTALLED=$PYTHON_VERSION_SHORT
PYTHON_FORCE_BUILD=false
PYTHON_FORCE_REBUILD=false
PYTHON_SKIP=false

# Additional Python modules.
PYTHON_IDNA_VERSION="2.9"
PYTHON_IDNA_VERSION_MIN="2.0"
PYTHON_IDNA_VERSION_MAX="3.0"
PYTHON_IDNA_NAME="idna"

PYTHON_CHARDET_VERSION="3.0.4"
PYTHON_CHARDET_VERSION_MIN="3.0"
PYTHON_CHARDET_VERSION_MAX="5.0"
PYTHON_CHARDET_NAME="chardet"

PYTHON_URLLIB3_VERSION="1.25.9"
PYTHON_URLLIB3_VERSION_MIN="1.0"
PYTHON_URLLIB3_VERSION_MAX="2.0"
PYTHON_URLLIB3_NAME="urllib3"

PYTHON_CERTIFI_VERSION="2020.4.5.2"
PYTHON_CERTIFI_VERSION_MIN="2020.0"
PYTHON_CERTIFI_VERSION_MAX="2021.0"
PYTHON_CERTIFI_NAME="certifi"

PYTHON_REQUESTS_VERSION="2.23.0"
PYTHON_REQUESTS_VERSION_MIN="2.0"
PYTHON_REQUESTS_VERSION_MAX="3.0"
PYTHON_REQUESTS_NAME="requests"

PYTHON_NUMPY_VERSION="1.19.5"
PYTHON_NUMPY_VERSION_MIN="1.14"
PYTHON_NUMPY_VERSION_MAX="2.0"
PYTHON_NUMPY_NAME="numpy"

# As package-ready parameters (only used with distro packages).
PYTHON_MODULES_PACKAGES=(
  "$PYTHON_IDNA_NAME $PYTHON_IDNA_VERSION_MIN $PYTHON_IDNA_VERSION_MAX"
  "$PYTHON_CHARDET_NAME $PYTHON_CHARDET_VERSION_MIN $PYTHON_CHARDET_VERSION_MAX"
  "$PYTHON_URLLIB3_NAME $PYTHON_URLLIB3_VERSION_MIN $PYTHON_URLLIB3_VERSION_MAX"
  "$PYTHON_CERTIFI_NAME $PYTHON_CERTIFI_VERSION_MIN $PYTHON_CERTIFI_VERSION_MAX"
  "$PYTHON_REQUESTS_NAME $PYTHON_REQUESTS_VERSION_MIN $PYTHON_REQUESTS_VERSION_MAX"
  "$PYTHON_NUMPY_NAME $PYTHON_NUMPY_VERSION_MIN $PYTHON_NUMPY_VERSION_MAX"
)

# As pip-ready parameters (only used when building python).
PYTHON_MODULES_PIP=(
  "$PYTHON_IDNA_NAME==$PYTHON_IDNA_VERSION"
  "$PYTHON_CHARDET_NAME==$PYTHON_CHARDET_VERSION"
  "$PYTHON_URLLIB3_NAME==$PYTHON_URLLIB3_VERSION"
  "$PYTHON_CERTIFI_NAME==$PYTHON_CERTIFI_VERSION"
  "$PYTHON_REQUESTS_NAME==$PYTHON_REQUESTS_VERSION"
  "$PYTHON_NUMPY_NAME==$PYTHON_NUMPY_VERSION"
)


BOOST_VERSION="1.73.0"
BOOST_VERSION_SHORT="1.73"
BOOST_VERSION_MIN="1.49"
BOOST_VERSION_MAX="2.0"
BOOST_FORCE_BUILD=false
BOOST_FORCE_REBUILD=false
BOOST_SKIP=false

TBB_VERSION="2020"
TBB_VERSION_SHORT="2020"
TBB_VERSION_UPDATE="_U2"  # Used for source packages...
TBB_VERSION_MIN="2018"
TBB_VERSION_MAX="2022"
TBB_FORCE_BUILD=false
TBB_FORCE_REBUILD=false
TBB_SKIP=false

OCIO_VERSION="2.0.0"
OCIO_VERSION_SHORT="2.0"
OCIO_VERSION_MIN="2.0"
OCIO_VERSION_MAX="3.0"
OCIO_FORCE_BUILD=false
OCIO_FORCE_REBUILD=false
OCIO_SKIP=false

OPENEXR_VERSION="2.5.5"
OPENEXR_VERSION_SHORT="2.5"
OPENEXR_VERSION_MIN="2.4"
OPENEXR_VERSION_MAX="3.0"
OPENEXR_FORCE_BUILD=false
OPENEXR_FORCE_REBUILD=false
OPENEXR_SKIP=false
_with_built_openexr=false

OIIO_VERSION="2.1.15.0"
OIIO_VERSION_SHORT="2.1"
OIIO_VERSION_MIN="2.1.12"
OIIO_VERSION_MAX="2.2.10"
OIIO_FORCE_BUILD=false
OIIO_FORCE_REBUILD=false
OIIO_SKIP=false

LLVM_VERSION="9.0.1"
LLVM_VERSION_SHORT="9.0"
LLVM_VERSION_MIN="6.0"
LLVM_VERSION_MAX="12.0"
LLVM_VERSION_FOUND=""
LLVM_FORCE_BUILD=false
LLVM_FORCE_REBUILD=false
LLVM_SKIP=false

# OSL needs to be compiled for now!
OSL_VERSION="1.11.10.0"
OSL_VERSION_SHORT="1.11"
OSL_VERSION_MIN="1.11"
OSL_VERSION_MAX="2.0"
OSL_FORCE_BUILD=false
OSL_FORCE_REBUILD=false
OSL_SKIP=false

# OpenSubdiv needs to be compiled for now
OSD_VERSION="3.4.3"
OSD_VERSION_SHORT="3.4"
OSD_VERSION_MIN="3.4"
OSD_VERSION_MAX="4.0"
OSD_FORCE_BUILD=false
OSD_FORCE_REBUILD=false
OSD_SKIP=false

# OpenVDB needs to be compiled for now
OPENVDB_BLOSC_VERSION="1.5.0"

OPENVDB_VERSION="8.0.1"
OPENVDB_VERSION_SHORT="8.0"
OPENVDB_VERSION_MIN="8.0"
OPENVDB_VERSION_MAX="8.1"
OPENVDB_FORCE_BUILD=false
OPENVDB_FORCE_REBUILD=false
OPENVDB_SKIP=false

# Alembic needs to be compiled for now
ALEMBIC_VERSION="1.7.16"
ALEMBIC_VERSION_SHORT="1.7"
ALEMBIC_VERSION_MIN="1.7"
ALEMBIC_VERSION_MAX="2.0"
ALEMBIC_FORCE_BUILD=false
ALEMBIC_FORCE_REBUILD=false
ALEMBIC_SKIP=false

USD_VERSION="21.02"
USD_VERSION_SHORT="21.02"
USD_VERSION_MIN="20.05"
USD_VERSION_MAX="22.00"
USD_FORCE_BUILD=false
USD_FORCE_REBUILD=false
USD_SKIP=false

OPENCOLLADA_VERSION="1.6.68"
OPENCOLLADA_VERSION_SHORT="1.6"
OPENCOLLADA_VERSION_MIN="1.6.68"
OPENCOLLADA_VERSION_MAX="1.7"
OPENCOLLADA_FORCE_BUILD=false
OPENCOLLADA_FORCE_REBUILD=false
OPENCOLLADA_SKIP=false

EMBREE_VERSION="3.10.0"
EMBREE_VERSION_SHORT="3.10"
EMBREE_VERSION_MIN="3.10"
EMBREE_VERSION_MAX="4.0"
EMBREE_FORCE_BUILD=false
EMBREE_FORCE_REBUILD=false
EMBREE_SKIP=false

OIDN_VERSION="1.3.0"
OIDN_VERSION_SHORT="1.3"
OIDN_VERSION_MIN="1.3.0"
OIDN_VERSION_MAX="1.4"
OIDN_FORCE_BUILD=false
OIDN_FORCE_REBUILD=false
OIDN_SKIP=false

ISPC_VERSION="1.14.1"

FFMPEG_VERSION="4.2.3"
FFMPEG_VERSION_SHORT="4.2"
FFMPEG_VERSION_MIN="3.0"
FFMPEG_VERSION_MAX="5.0"
FFMPEG_FORCE_BUILD=false
FFMPEG_FORCE_REBUILD=false
FFMPEG_SKIP=false
_ffmpeg_list_sep=";"

XR_OPENXR_VERSION="1.0.14"
XR_OPENXR_VERSION_SHORT="1.0"
XR_OPENXR_VERSION_MIN="1.0.8"
XR_OPENXR_VERSION_MAX="2.0"
XR_OPENXR_FORCE_BUILD=false
XR_OPENXR_FORCE_REBUILD=false
XR_OPENXR_SKIP=false

# FFMPEG optional libs.
VORBIS_USE=false
VORBIS_DEV=""
OGG_USE=false
OGG_DEV=""
THEORA_USE=false
THEORA_DEV=""
XVID_USE=false
XVID_DEV=""
X264_USE=false
X264_DEV=""
X264_VERSION_MIN=0.118
VPX_USE=false
VPX_VERSION_MIN=0.9.7
VPX_DEV=""
OPUS_USE=false
OPUS_VERSION_MIN=1.1.1
OPUS_DEV=""
MP3LAME_USE=false
MP3LAME_DEV=""
OPENJPEG_USE=false
OPENJPEG_DEV=""

# Whether to use system GLEW or not (OpenSubDiv needs recent glew to work).
NO_SYSTEM_GLEW=false

# Switch to english language, else some things (like check_package_DEB()) won't work!
LANG_BACK=$LANG
LANG=""
export LANG

# ----------------------------------------------------------------------------
# Generic Helpers

BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)

_echo() {
  if [ "X$1" = "X-n" ]; then
     shift; printf "%s" "$@"
  else
     printf "%s\n" "$@"
  fi
}

ERROR() {
  _echo "${BRIGHT}${RED}ERROR! ${NORMAL}${RED}$@${NORMAL}"
}

WARNING() {
  _echo "${BRIGHT}${YELLOW}WARNING! ${NORMAL}${YELLOW}$@${NORMAL}"
}

INFO() {
  _echo "${GREEN}$@${NORMAL}"
}

PRINT() {
  _echo "$@"
}

# ----------------------------------------------------------------------------
# Args Handling

# Finish parsing the commandline args.
eval set -- "$ARGS"
while true; do
  case $1 in
    -s|--source)
      SRC="$2"; shift; shift; continue
    ;;
    -i|--install)
      INST="$2"; shift; shift; continue
    ;;
    --tmp)
      TMP="$2"; shift; shift; continue
    ;;
    --info)
      INFO_PATH="$2"; shift; shift; continue
    ;;
    -t|--threads)
      THREADS="$2"; shift; shift; continue
    ;;
    -h|--help)
      PRINT ""
      PRINT "USAGE:"
      PRINT ""
      PRINT "`eval _echo "$COMMON_INFO"`"
      PRINT ""
      PRINT "`eval _echo "$ARGUMENTS_INFO"`"
      PRINT ""
      exit 0
    ;;
    --show-deps)
      # We have to defer...
      DO_SHOW_DEPS=true; shift; continue
    ;;
    --no-sudo)
      PRINT ""
      WARNING "--no-sudo enabled, this script might not be able to do much..."
      PRINT ""
      SUDO=""; shift; continue
    ;;
    --no-build)
      PRINT ""
      WARNING "--no-build enabled, this script will not be able to install all dependencies..."
      PRINT ""
      NO_BUILD=true; shift; continue
    ;;
    --no-confirm)
      NO_CONFIRM=true; shift; continue
    ;;
    --with-all)
      WITH_ALL=true; shift; continue
    ;;
    --with-opencollada)
      WITH_OPENCOLLADA=true; shift; continue
    ;;
    --with-embree)
      WITH_EMBREE=true; shift; continue
    ;;
    --with-oidn)
      WITH_OIDN=true; shift; continue
    ;;
    --with-nanovdb)
      WITH_NANOVDB=true;
      shift; continue
    ;;
    --with-jack)
      WITH_JACK=true; shift; continue;
    ;;
    --with-pulseaudio)
      WITH_PULSEAUDIO=true; shift; continue;
    ;;
    --ver-ocio)
      OCIO_VERSION="$2"
      OCIO_VERSION_MIN=$OCIO_VERSION
      OCIO_VERSION_SHORT=$OCIO_VERSION
      shift; shift; continue
    ;;
    --ver-oiio)
      OIIO_VERSION="$2"
      OIIO_VERSION_MIN=$OIIO_VERSION
      OIIO_VERSION_SHORT=$OIIO_VERSION
      shift; shift; continue
    ;;
    --ver-llvm)
      LLVM_VERSION="$2"
      LLVM_VERSION_MIN=$LLVM_VERSION
      LLVM_VERSION_SHORT=$LLVM_VERSION
      shift; shift; continue
    ;;
    --ver-osl)
      OSL_VERSION="$2"
      OSL_VERSION_MIN=$OSL_VERSION
      OSL_VERSION_SHORT=$OSL_VERSION
      shift; shift; continue
    ;;
    --ver-osd)
      OSD_VERSION="$2"
      OSD_VERSION_MIN=$OSD_VERSION
      OSD_VERSION_SHORT=$OSD_VERSION
      shift; shift; continue
    ;;
    --ver-openvdb)
      OPENVDB_VERSION="$2"
      OPENVDB_VERSION_MIN=$OPENVDB_VERSION
      OPENVDB_VERSION_SHORT=$OPENVDB_VERSION
      shift; shift; continue
    ;;
    --ver-xr-openxr)
      XR_OPENXR_VERSION="$2"
      XR_OPENXR_VERSION_MIN=$XR_OPENXR_VERSION
      XR_OPENXR_VERSION_SHORT=$XR_OPENXR_VERSION
      shift; shift; continue
    ;;
    --build-all)
      PYTHON_FORCE_BUILD=true
      BOOST_FORCE_BUILD=true
      TBB_FORCE_BUILD=true
      OCIO_FORCE_BUILD=true
      OPENEXR_FORCE_BUILD=true
      OIIO_FORCE_BUILD=true
      LLVM_FORCE_BUILD=true
      OSL_FORCE_BUILD=true
      OSD_FORCE_BUILD=true
      OPENVDB_FORCE_BUILD=true
      OPENCOLLADA_FORCE_BUILD=true
      EMBREE_FORCE_BUILD=true
      OIDN_FORCE_BUILD=true
      FFMPEG_FORCE_BUILD=true
      ALEMBIC_FORCE_BUILD=true
      USD_FORCE_BUILD=true
      XR_OPENXR_FORCE_BUILD=true
      shift; continue
    ;;
    --build-python)
      PYTHON_FORCE_BUILD=true
      shift; continue
    ;;
    --build-boost)
      BOOST_FORCE_BUILD=true; shift; continue
    ;;
    --build-tbb)
      TBB_FORCE_BUILD=true; shift; continue
    ;;
    --build-ocio)
      OCIO_FORCE_BUILD=true; shift; continue
    ;;
    --build-openexr)
      OPENEXR_FORCE_BUILD=true; shift; continue
    ;;
    --build-oiio)
      OIIO_FORCE_BUILD=true; shift; continue
    ;;
    --build-llvm)
      LLVM_FORCE_BUILD=true; shift; continue
    ;;
    --build-osl)
      OSL_FORCE_BUILD=true; shift; continue
    ;;
    --build-osd)
      OSD_FORCE_BUILD=true; shift; continue
    ;;
    --build-openvdb)
      OPENVDB_FORCE_BUILD=true; shift; continue
    ;;
    --build-opencollada)
      OPENCOLLADA_FORCE_BUILD=true; shift; continue
    ;;
    --build-embree)
      EMBREE_FORCE_BUILD=true; shift; continue
    ;;
    --build-oidn)
      OIDN_FORCE_BUILD=true; shift; continue
    ;;
    --build-ffmpeg)
      FFMPEG_FORCE_BUILD=true; shift; continue
    ;;
    --build-alembic)
      ALEMBIC_FORCE_BUILD=true; shift; continue
    ;;
    --build-usd)
      USD_FORCE_BUILD=true; shift; continue
    ;;
    --build-xr-openxr)
      XR_OPENXR_FORCE_BUILD=true; shift; continue
    ;;
    --force-all)
      PYTHON_FORCE_REBUILD=true
      BOOST_FORCE_REBUILD=true
      TBB_FORCE_REBUILD=true
      OCIO_FORCE_REBUILD=true
      OPENEXR_FORCE_REBUILD=true
      OIIO_FORCE_REBUILD=true
      LLVM_FORCE_REBUILD=true
      OSL_FORCE_REBUILD=true
      OSD_FORCE_REBUILD=true
      OPENVDB_FORCE_REBUILD=true
      OPENCOLLADA_FORCE_REBUILD=true
      EMBREE_FORCE_REBUILD=true
      OIDN_FORCE_REBUILD=true
      FFMPEG_FORCE_REBUILD=true
      ALEMBIC_FORCE_REBUILD=true
      USD_FORCE_REBUILD=true
      XR_OPENXR_FORCE_REBUILD=true
      shift; continue
    ;;
    --force-python)
      PYTHON_FORCE_REBUILD=true
      shift; continue
    ;;
    --force-boost)
      BOOST_FORCE_REBUILD=true; shift; continue
    ;;
    --force-tbb)
      TBB_FORCE_REBUILD=true; shift; continue
    ;;
    --force-ocio)
      OCIO_FORCE_REBUILD=true; shift; continue
    ;;
    --force-openexr)
      OPENEXR_FORCE_REBUILD=true; shift; continue
    ;;
    --force-oiio)
      OIIO_FORCE_REBUILD=true; shift; continue
    ;;
    --force-llvm)
      LLVM_FORCE_REBUILD=true; shift; continue
    ;;
    --force-osl)
      OSL_FORCE_REBUILD=true; shift; continue
    ;;
    --force-osd)
      OSD_FORCE_REBUILD=true; shift; continue
    ;;
    --force-openvdb)
      OPENVDB_FORCE_REBUILD=true; shift; continue
    ;;
    --force-opencollada)
      OPENCOLLADA_FORCE_REBUILD=true; shift; continue
    ;;
    --force-embree)
      EMBREE_FORCE_REBUILD=true; shift; continue
    ;;
    --force-oidn)
      OIDN_FORCE_REBUILD=true; shift; continue
    ;;
    --force-ffmpeg)
      FFMPEG_FORCE_REBUILD=true; shift; continue
    ;;
    --force-alembic)
      ALEMBIC_FORCE_REBUILD=true; shift; continue
    ;;
    --force-usd)
      USD_FORCE_REBUILD=true; shift; continue
    ;;
    --force-xr-openxr)
      XR_OPENXR_FORCE_REBUILD=true; shift; continue
    ;;
    --skip-python)
      PYTHON_SKIP=true; shift; continue
    ;;
    --skip-boost)
      BOOST_SKIP=true; shift; continue
    ;;
    --skip-tbb)
      TBB_SKIP=true; shift; continue
    ;;
    --skip-ocio)
      OCIO_SKIP=true; shift; continue
    ;;
    --skip-openexr)
      OPENEXR_SKIP=true; shift; continue
    ;;
    --skip-oiio)
      OIIO_SKIP=true; shift; continue
    ;;
    --skip-llvm)
      LLVM_SKIP=true; shift; continue
    ;;
    --skip-osl)
      OSL_SKIP=true; shift; continue
    ;;
    --skip-osd)
      OSD_SKIP=true; shift; continue
    ;;
    --skip-openvdb)
      OPENVDB_SKIP=true; shift; continue
    ;;
    --skip-opencollada)
      OPENCOLLADA_SKIP=true; shift; continue
    ;;
    --skip-embree)
      EMBREE_SKIP=true; shift; continue
    ;;
    --skip-oidn)
      OIDN_SKIP=true; shift; continue
    ;;
    --skip-ffmpeg)
      FFMPEG_SKIP=true; shift; continue
    ;;
    --skip-alembic)
      ALEMBIC_SKIP=true; shift; continue
    ;;
    --skip-usd)
      USD_SKIP=true; shift; continue
    ;;
    --skip-xr-openxr)
      XR_OPENXR_SKIP=true; shift; continue
    ;;
    --)
      # no more arguments to parse
      break
    ;;
    *)
      PRINT ""
      ERROR "Wrong parameter '$1'; Usage:"
      PRINT ""
      PRINT "`eval _echo "$COMMON_INFO"`"
      PRINT ""
      exit 1
    ;;
  esac
done

if [ "$WITH_ALL" = true -a "$OPENCOLLADA_SKIP" = false ]; then
  WITH_OPENCOLLADA=true
fi
if [ "$WITH_ALL" = true -a "$EMBREE_SKIP" = false ]; then
  WITH_EMBREE=true
fi
if [ "$WITH_ALL" = true -a "$OIDN_SKIP" = false ]; then
  WITH_OIDN=true
fi
if [ "$WITH_ALL" = true ]; then
  WITH_JACK=true
  WITH_NANOVDB=true
  WITH_PULSEAUDIO=true
fi

if [ "$WITH_NANOVDB" = true ]; then
  OPENVDB_FORCE_BUILD=true
fi


WARNING "****WARNING****"
PRINT "If you are experiencing issues building Blender, _*TRY A FRESH, CLEAN BUILD FIRST*_!"
PRINT "The same goes for install_deps itself, if you encounter issues, please first erase everything in $SRC and $INST"
PRINT "(provided obviously you did not add anything yourself in those dirs!), and run install_deps.sh again!"
PRINT "Often, changes in the libs built by this script, or in your distro package, cannot be handled simply, so..."
PRINT ""
PRINT "You may also try to use the '--build-foo' options to bypass your distribution's packages"
PRINT "for some troublesome/buggy libraries..."
PRINT ""
PRINT ""
PRINT "Ran with:"
PRINT "    install_deps.sh $COMMANDLINE"
PRINT ""
PRINT ""


# This has to be done here, because user might force some versions...
PYTHON_SOURCE=( "https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tgz" )

_boost_version_nodots=`echo "$BOOST_VERSION" | sed -r 's/\./_/g'`
BOOST_SOURCE=( "https://dl.bintray.com/boostorg/release/$BOOST_VERSION/source/boost_$_boost_version_nodots.tar.bz2" )
BOOST_BUILD_MODULES="--with-system --with-filesystem --with-thread --with-regex --with-locale --with-date_time --with-wave --with-iostreams --with-python --with-program_options --with-serialization --with-atomic"

TBB_SOURCE=( "https://github.com/oneapi-src/oneTBB/archive/$TBB_VERSION$TBB_VERSION_UPDATE.tar.gz" )
TBB_SOURCE_CMAKE=( "https://raw.githubusercontent.com/wjakob/tbb/master/CMakeLists.txt" )

OCIO_USE_REPO=false
OCIO_SOURCE=( "https://github.com/AcademySoftwareFoundation/OpenColorIO/archive/v$OCIO_VERSION.tar.gz")
#~ OCIO_SOURCE_REPO=( "https://github.com/imageworks/OpenColorIO.git" )
#~ OCIO_SOURCE_REPO_UID="6de971097c7f552300f669ed69ca0b6cf5a70843"

OPENEXR_USE_REPO=false
OPENEXR_SOURCE=( "https://github.com/AcademySoftwareFoundation/openexr/archive/v$OPENEXR_VERSION.tar.gz" )
OPENEXR_SOURCE_REPO=( "https://github.com/AcademySoftwareFoundation/openexr.git" )
OPENEXR_SOURCE_REPO_UID="0ac2ea34c8f3134148a5df4052e40f155b76f6fb"
#~ OPENEXR_SOURCE=( "https://github.com/openexr/openexr/archive/$OPENEXR_SOURCE_REPO_UID.tar.gz" )

OIIO_USE_REPO=false
OIIO_SOURCE=( "https://github.com/OpenImageIO/oiio/archive/Release-$OIIO_VERSION.tar.gz" )
#~ OIIO_SOURCE_REPO=( "https://github.com/OpenImageIO/oiio.git" )
#~ OIIO_SOURCE_REPO_UID="c9e67275a0b248ead96152f6d2221cc0c0f278a4"

_LLVM_SOURCE_ROOT="https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VERSION"
LLVM_SOURCE=( "$_LLVM_SOURCE_ROOT/llvm-$LLVM_VERSION.src.tar.xz" )
LLVM_CLANG_SOURCE=( "$_LLVM_SOURCE_ROOT/clang-$LLVM_VERSION.src.tar.xz" "$_LLVM_SOURCE_ROOT/cfe-$LLVM_VERSION.src.tar.xz" )

OSL_USE_REPO=false
OSL_SOURCE=( "https://github.com/imageworks/OpenShadingLanguage/archive/Release-$OSL_VERSION.tar.gz" )
#~ OSL_SOURCE_REPO=( "https://github.com/imageworks/OpenShadingLanguage.git" )
#~ OSL_SOURCE_REPO_BRANCH="master"
#~ OSL_SOURCE_REPO_UID="85179714e1bc69cd25ecb6bb711c1a156685d395"
#~ OSL_SOURCE=( "https://github.com/Nazg-Gul/OpenShadingLanguage/archive/Release-1.5.11.tar.gz" )
#~ OSL_SOURCE_REPO=( "https://github.com/mont29/OpenShadingLanguage.git" )
#~ OSL_SOURCE_REPO_UID="85179714e1bc69cd25ecb6bb711c1a156685d395"
#~ OSL_SOURCE_REPO=( "https://github.com/Nazg-Gul/OpenShadingLanguage.git" )
#~ OSL_SOURCE_REPO_UID="7d40ff5fe8e47b030042afb92d0e955f5aa96f48"
#~ OSL_SOURCE_REPO_BRANCH="blender-fixes"

OSD_USE_REPO=false
# Script foo to make the version string compliant with the archive name:
# ${Varname//SearchForThisChar/ReplaceWithThisChar}
OSD_SOURCE=( "https://github.com/PixarAnimationStudios/OpenSubdiv/archive/v${OSD_VERSION//./_}.tar.gz" )
#~ OSD_SOURCE_REPO=( "https://github.com/PixarAnimationStudios/OpenSubdiv.git" )
#~ OSD_SOURCE_REPO_UID="404659fffa659da075d1c9416e4fc939139a84ee"
#~ OSD_SOURCE_REPO_BRANCH="dev"

OPENVDB_USE_REPO=false
OPENVDB_BLOSC_SOURCE=( "https://github.com/Blosc/c-blosc/archive/v${OPENVDB_BLOSC_VERSION}.tar.gz" )
OPENVDB_SOURCE=( "https://github.com/AcademySoftwareFoundation/openvdb/archive/v${OPENVDB_VERSION}.tar.gz" )
#~ OPENVDB_SOURCE_REPO=( "https://github.com/AcademySoftwareFoundation/openvdb.git" )
#~ OPENVDB_SOURCE_REPO_UID="404659fffa659da075d1c9416e4fc939139a84ee"
#~ OPENVDB_SOURCE_REPO_BRANCH="dev"

NANOVDB_USE_REPO=false
NANOVDB_SOURCE_REPO_UID="e62f7a0bf1e27397223c61ddeaaf57edf111b77f"
NANOVDB_SOURCE=( "https://github.com/AcademySoftwareFoundation/openvdb/archive/${NANOVDB_SOURCE_REPO_UID}.tar.gz" )

ALEMBIC_USE_REPO=false
ALEMBIC_SOURCE=( "https://github.com/alembic/alembic/archive/${ALEMBIC_VERSION}.tar.gz" )
# ALEMBIC_SOURCE_REPO=( "https://github.com/alembic/alembic.git" )
# ALEMBIC_SOURCE_REPO_UID="e6c90d4faa32c4550adeaaf3f556dad4b73a92bb"
# ALEMBIC_SOURCE_REPO_BRANCH="master"

USD_SOURCE=( "https://github.com/PixarAnimationStudios/USD/archive/v${USD_VERSION}.tar.gz" )

OPENCOLLADA_USE_REPO=false
OPENCOLLADA_SOURCE=( "https://github.com/KhronosGroup/OpenCOLLADA/archive/v${OPENCOLLADA_VERSION}.tar.gz" )
#~ OPENCOLLADA_SOURCE_REPO=( "https://github.com/KhronosGroup/OpenCOLLADA.git" )
#~ OPENCOLLADA_REPO_UID="e937c3897b86fc0da53cde97257f5156"
#~ OPENCOLLADA_REPO_BRANCH="master"

EMBREE_USE_REPO=false
EMBREE_SOURCE=( "https://github.com/embree/embree/archive/v${EMBREE_VERSION}.tar.gz" )
#~ EMBREE_SOURCE_REPO=( "https://github.com/embree/embree.git" )
#~ EMBREE_REPO_UID="4a12bfed63c90e85b6eab98b8cdd8dd2a3ba5809"
#~ EMBREE_REPO_BRANCH="master"

OIDN_USE_REPO=false
OIDN_SOURCE=( "https://github.com/OpenImageDenoise/oidn/releases/download/v${OIDN_VERSION}/oidn-${OIDN_VERSION}.src.tar.gz" )
#~ OIDN_SOURCE_REPO=( "https://github.com/OpenImageDenoise/oidn.git" )
#~ OIDN_REPO_UID="dabfd9c80101edae9d25a710160d12d6d963c591"
#~ OIDN_REPO_BRANCH="master"

ISPC_BINARY=( "https://github.com/ispc/ispc/releases/download/v${ISPC_VERSION}/ispc-v${ISPC_VERSION}-linux.tar.gz" )

FFMPEG_SOURCE=( "http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" )

XR_OPENXR_USE_REPO=false
XR_OPENXR_SOURCE=("https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_VERSION}.tar.gz")
#~ XR_OPENXR_SOURCE_REPO=("https://github.com/KhronosGroup/OpenXR-SDK.git")
#~ XR_OPENXR_REPO_UID="5900c51562769b03bea699dc0352cae56acb6419d"
#~ XR_OPENXR_REPO_BRANCH="master"

# C++11 is required now
CXXFLAGS_BACK=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -std=c++11"
export CXXFLAGS

# ----------------------------------------------------------------------------
# Show Dependencies

# Need those to be after we defined versions...
DEPS_COMMON_INFO="\"COMMON DEPENDENCIES:

Those libraries should be available as packages in all recent distributions (optional ones are [between brackets]):

    * Basics of dev environment (cmake, gcc, svn , git, ...).
    * libjpeg, libpng, libtiff, [openjpeg2], [libopenal].
    * libx11, libxcursor, libxi, libxrandr, libxinerama (and other libx... as needed).
    * libsqlite3, libbz2, libssl, libfftw3, libxml2, libtinyxml, yasm, libyaml-cpp.
    * libsdl2, libglew, libpugixml, libpotrace, [libgmp], [libglewmx], fontconfig, [libharu/libhpdf].\""

DEPS_SPECIFIC_INFO="\"BUILDABLE DEPENDENCIES:

The following libraries will probably not all be available as packages in your distribution
(install_deps will by default try to install packages, and fall back to building missing ones).
You can force install_deps to build those with '--build-all' or relevant 'build-foo' options, see '--help' message.
You may also want to build them yourself (optional ones are [between brackets]):

    * Python $PYTHON_VERSION (from $PYTHON_SOURCE).
    ** [IDNA $PYTHON_IDNA_VERSION] (use pip).
    ** [Chardet $PYTHON_CHARDET_VERSION] (use pip).
    ** [Urllib3 $PYTHON_URLLIB3_VERSION] (use pip).
    ** [Certifi $PYTHON_CERTIFI_VERSION] (use pip).
    ** [Requests $PYTHON_REQUESTS_VERSION] (use pip).
    ** [NumPy $PYTHON_NUMPY_VERSION] (use pip).
    * Boost $BOOST_VERSION (from $BOOST_SOURCE, modules: $BOOST_BUILD_MODULES).
    * TBB $TBB_VERSION (from $TBB_SOURCE).
    * [FFMpeg $FFMPEG_VERSION (needs libvorbis, libogg, libtheora, libx264, libmp3lame, libxvidcore, libvpx, ...)] (from $FFMPEG_SOURCE).
    * [OpenColorIO $OCIO_VERSION] (from $OCIO_SOURCE).
    * ILMBase $OPENEXR_VERSION (from $OPENEXR_SOURCE).
    * OpenEXR $OPENEXR_VERSION (from $OPENEXR_SOURCE).
    * OpenImageIO $OIIO_VERSION (from $OIIO_SOURCE).
    * [LLVM $LLVM_VERSION (with clang)] (from $LLVM_SOURCE, and $LLVM_CLANG_SOURCE).
    * [OpenShadingLanguage $OSL_VERSION] (from $OSL_SOURCE_REPO, branch $OSL_SOURCE_REPO_BRANCH, commit $OSL_SOURCE_REPO_UID).
    * [OpenSubDiv $OSD_VERSION] (from $OSD_SOURCE_REPO, branch $OSD_SOURCE_REPO_BRANCH, commit $OSD_SOURCE_REPO_UID).
    * [OpenVDB $OPENVDB_VERSION] (from $OPENVDB_SOURCE), [Blosc $OPENVDB_BLOSC_VERSION] (from $OPENVDB_BLOSC_SOURCE).
    * [OpenCollada $OPENCOLLADA_VERSION] (from $OPENCOLLADA_SOURCE).
    * [Embree $EMBREE_VERSION] (from $EMBREE_SOURCE).
    * [OpenImageDenoise $OIDN_VERSION] (from $OIDN_SOURCE).
    * [Alembic $ALEMBIC_VERSION] (from $ALEMBIC_SOURCE).
    * [Universal Scene Description $USD_VERSION] (from $USD_SOURCE).
    * [OpenXR-SDK $XR_OPENXR_VERSION] (from $XR_OPENXR_SOURCE).\""

if [ "$DO_SHOW_DEPS" = true ]; then
  PRINT ""
  PRINT "Blender dependencies (libraries needed to build it):"
  PRINT ""
  PRINT "`eval _echo "$DEPS_COMMON_INFO"`"
  PRINT ""
  PRINT "`eval _echo "$DEPS_SPECIFIC_INFO"`"
  PRINT ""
  exit 0
fi

# ----------------------------------------------------------------------------
# Generic Helpers

# Check return code of wget for success...
download() {
  declare -a sources=("${!1}")
  sources_count=${#sources[@]}
  error=1

  for (( i=0; $i < $sources_count; i++ ))
  do
    wget -c ${sources[$i]} -O $2
    if [ $? -eq 0 ]; then
      error=0
      break
    fi
  done

  if [ $error -eq 1 ]; then
    ERROR "wget could not find ${sources[@]}, or could not write it to $2, exiting"
    exit 1
  fi
}

version_sanitize() {
  # Remove suffix such as '1.3_RC2', keeping only '1.3'.
  # Needed for numeric comparisons.
  local val=$(sed -r 's/^([^_]+).*/\1/' <<< "$1")
  # Remove trailing punctuation such as '1.0.', keeping only '1.0'.
  val=$(sed -r 's/[[:punct:]]*$//g' <<< "$val")
  echo $val
}

# Return 0 if $1 = $2 (i.e. 1.01.0 = 1.1, but 1.1.1 != 1.1), else 1.
# $1 and $2 should be version numbers made of numbers only.
version_eq() {
  local VER_1=$(version_sanitize "$1")
  local VER_2=$(version_sanitize "$2")
  local IFS='.'

  # Split both version numbers into their numeric elements.
  arr1=( $VER_1 )
  arr2=( $VER_2 )

  ret=1

  count1=${#arr1[@]}
  count2=${#arr2[@]}
  if [ $count2 -ge $count1 ]; then
    _t=$count1
    count1=$count2
    count2=$_t
    arr1=( $VER_2 )
    arr2=( $VER_1 )
  fi

  ret=0
  for (( i=0; $i < $count2; i++ ))
  do
    if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then
      ret=1
      break
    fi
  done

  for (( i=$count2; $i < $count1; i++ ))
  do
    if [ $(( 10#${arr1[$i]} )) -ne 0 ]; then
      ret=1
      break
    fi
  done

  return $ret
}

# Return 0 if $1 >= $2, else 1.
# $1 and $2 should be version numbers made of numbers only.
version_ge() {
  version_eq $1 $2
  if [ $? -eq 1 -a $(_echo "$1" "$2" | sort --version-sort | head --lines=1) = "$1" ]; then
    return 1
  else
    return 0
  fi
}

# Return 0 if $3 > $1 >= $2, else 1.
# $1 and $2 should be version numbers made of numbers only.
version_ge_lt() {
  version_ge $1 $3
  if [ $? -eq 0 ]; then
    return 1
  else
    version_ge $1 $2
    return $?
  fi
}

# Return 0 if $1 is into $2 (e.g. 3.3.2 is into 3.3, but not 3.3.0 or 3.3.5), else 1.
# $1 and $2 should be version numbers made of numbers only.
# $1 should be at least as long as $2!
version_match() {
  local VER_1=$(version_sanitize "$1")
  local VER_2=$(version_sanitize "$2")
  local IFS='.'

  # Split both version numbers into their numeric elements.
  arr1=( $VER_1 )
  arr2=( $VER_2 )

  ret=1

  count1=${#arr1[@]}
  count2=${#arr2[@]}
  if [ $count1 -ge $count2 ]; then
    ret=0
    for (( i=0; $i < $count2; i++ ))
    do
      if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then
        ret=1
        break
      fi
    done
  fi

  return $ret
}

# ----------------------------------------------------------------------------
# Generic compile helpers

prepare_inst() {
  INFO "Ensuring $INST exists and is writable by us"
  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, might be impossible to create install dir..."
  fi

  if [ ! -d  $INST ]; then
    # Try to create normal user directory first to possibly avoid excessive
    # system operations
    mkdir -p $INST || $SUDO mkdir -p $INST
  fi

  if [ ! -w $INST ]; then
    $SUDO chown $USER $INST
    $SUDO chmod 775 $INST
  fi
}

# Check whether the current package needs to be recompiled, based on a dummy file containing a magic number in its name...
magic_compile_check() {
  if [ -f $INST/.$1-magiccheck-$2-$USE_CXX11 ]; then
    return 0
  else
    return 1
  fi
}

magic_compile_set() {
  rm -f $INST/.$1-magiccheck-*
  touch $INST/.$1-magiccheck-$2-$USE_CXX11
}

# Note: should clean nicely in $INST, but not in $SRC, when we switch to a new version of a lib...
_clean() {
  if [ $_inst_shortcut ]; then
    rm -rf `readlink -f $_inst_shortcut`
    rm -rf $_inst_shortcut
  fi
  # Only remove $_src dir when not using git repo (avoids to re-clone the whole repo every time!!!).
  if [ $_git == false ]; then
    rm -rf $_src
  fi
  rm -rf $_inst
}

_create_inst_shortcut() {
  if [ $_inst_shortcut ]; then
    rm -f $_inst_shortcut
    ln -s $_inst $_inst_shortcut
  fi
}

# ldconfig
run_ldconfig() {
  _lib_path="$INST/$1/lib"
  _lib64_path="$INST/$1/lib64"
  _ldconf_path="/etc/ld.so.conf.d/$1.conf"
  PRINT ""
  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to run ldconfig for $1, you'll have to do it yourself..."
  else
    INFO "Running ldconfig for $1..."
    $SUDO sh -c "/bin/echo -e \"$_lib_path\n$_lib64_path\" > $_ldconf_path"
    $SUDO /sbin/ldconfig  # XXX OpenSuse does not include sbin in command path with sudo!!!
  fi
  PRINT ""
}

# ----------------------------------------------------------------------------
# Build Python

_init_python() {
  _src=$SRC/Python-$PYTHON_VERSION
  _git=false
  _inst=$INST/python-$PYTHON_VERSION
  _inst_shortcut=$INST/python-$PYTHON_VERSION_SHORT
}

_update_deps_python() {
  if [ "$1" = true ]; then
    BOOST_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    BOOST_FORCE_REBUILD=true
  fi
}

clean_Python() {
  _init_python
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_python false true
  fi
  _clean
}

compile_Python() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, Python will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  py_magic=3
  _init_python

  # Force having own builds for the dependencies.
  _update_deps_python true false

  # Clean install if needed!
  magic_compile_check python-$PYTHON_VERSION $py_magic
  if [ $? -eq 1 -o "$PYTHON_FORCE_REBUILD" = true ]; then
    clean_Python
  fi

  if [ ! -d $_inst ]; then
    INFO "Building Python-$PYTHON_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_python true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      download PYTHON_SOURCE[@] $_src.tgz

      INFO "Unpacking Python-$PYTHON_VERSION"
      tar -C $SRC -xf $_src.tgz
    fi

    cd $_src

    ./configure --prefix=$_inst --libdir=$_inst/lib --enable-ipv6 \
        --enable-loadable-sqlite-extensions --with-dbmliborder=bdb \
        --with-computed-gotos --with-pymalloc --enable-shared

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "Python--$PYTHON_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set python-$PYTHON_VERSION $py_magic

    PYTHON_VERSION_INSTALLED=$PYTHON_VERSION_SHORT

    cd $CWD
    INFO "Done compiling Python-$PYTHON_VERSION!"
  else
    INFO "Own Python-$PYTHON_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-python option."
  fi

  run_ldconfig "python-$PYTHON_VERSION_SHORT"

  # Extra step: install required modules with pip.
  _python="$_inst/bin/python3"
  $_python -m pip install --upgrade pip
  for module in "${PYTHON_MODULES_PIP[@]}"
  do
    PRINT ""
    $_python -m pip install $module --no-binary :all:
  done
}

# ----------------------------------------------------------------------------
# Build Boost

_init_boost() {
  _src=$SRC/boost-$BOOST_VERSION
  _git=false
  _inst=$INST/boost-$BOOST_VERSION_SHORT
  _inst_shortcut=$INST/boost
}

_update_deps_boost() {
  if [ "$1" = true ]; then
    OIIO_FORCE_BUILD=true
    OSL_FORCE_BUILD=true
    OPENVDB_FORCE_BUILD=true
    ALEMBIC_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OIIO_FORCE_REBUILD=true
    OSL_FORCE_REBUILD=true
    OPENVDB_FORCE_REBUILD=true
    ALEMBIC_FORCE_REBUILD=true
  fi
}

clean_Boost() {
  _init_boost
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_boost false true
  fi
  _clean
}

compile_Boost() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, Boost will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  boost_magic=14

  _init_boost

  # Force having own builds for the dependencies.
  _update_deps_boost true false

  # Clean install if needed!
  magic_compile_check boost-$BOOST_VERSION $boost_magic
  if [ $? -eq 1 -o "$BOOST_FORCE_REBUILD" = true ]; then
    clean_Boost
  fi

  if [ ! -d $_inst ]; then
    INFO "Building Boost-$BOOST_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_boost true true

    prepare_inst

    if [ ! -d $_src ]; then
      INFO "Downloading Boost-$BOOST_VERSION"
      mkdir -p $SRC
      download BOOST_SOURCE[@] $_src.tar.bz2
      tar -C $SRC --transform "s,\w*,boost-$BOOST_VERSION,x" -xf $_src.tar.bz2
    fi

    cd $_src
    if [ ! -f $_src/b2 ]; then
      if [ -d $INST/python-$PYTHON_VERSION_INSTALLED ]; then
        ./bootstrap.sh --with-python-root="$INST/python-$PYTHON_VERSION_INSTALLED"
      else
        ./bootstrap.sh
      fi
    fi
    ./b2 -j$THREADS -a $BOOST_BUILD_MODULES \
         --prefix=$_inst --disable-icu boost.locale.icu=off install
    ./b2 --clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "Boost-$BOOST_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set boost-$BOOST_VERSION $boost_magic

    cd $CWD
    INFO "Done compiling Boost-$BOOST_VERSION!"
  else
    INFO "Own Boost-$BOOST_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-boost option."
  fi

  # Just always run it, much simpler this way!
  run_ldconfig "boost"
}

# ----------------------------------------------------------------------------
# Build TBB

_init_tbb() {
  _src=$SRC/TBB-$TBB_VERSION
  _git=false
  _inst=$INST/tbb-$TBB_VERSION_SHORT
  _inst_shortcut=$INST/tbb
}

_update_deps_tbb() {
  if [ "$1" = true ]; then
    OSD_FORCE_BUILD=true
    OPENVDB_FORCE_BUILD=true
    USD_FORCE_BUILD=true
    EMBREE_FORCE_BUILD=true
    OIDN_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OSD_FORCE_REBUILD=true
    OPENVDB_FORCE_REBUILD=true
    USD_FORCE_REBUILD=true
    EMBREE_FORCE_REBUILD=true
    OIDN_FORCE_REBUILD=true
  fi
}

clean_TBB() {
  _init_tbb
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_tbb false true
  fi
  _clean
}

compile_TBB() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, TBB will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  tbb_magic=0
  _init_tbb

  # Force having own builds for the dependencies.
  _update_deps_tbb true false

  # Clean install if needed!
  magic_compile_check tbb-$TBB_VERSION $tbb_magic
  if [ $? -eq 1 -o "$TBB_FORCE_REBUILD" = true ]; then
    clean_TBB
  fi

  if [ ! -d $_inst ]; then
    INFO "Building TBB-$TBB_VERSION$TBB_VERSION_UPDATE"

    # Force rebuilding the dependencies.
    _update_deps_tbb true true

    prepare_inst

    if [ ! -d $_src ]; then
      INFO "Downloading TBB-$TBB_VERSION$TBB_VERSION_UPDATE"
      mkdir -p $SRC

      download TBB_SOURCE[@] $_src.tar.gz
      INFO "Unpacking TBB-$TBB_VERSION$TBB_VERSION_UPDATE"
      tar -C $SRC --transform "s,(.*/?)oneTBB[^/]*(.*),\1TBB-$TBB_VERSION\2,x" \
          -xf $_src.tar.gz

      INFO

      # Super-hack: Add some cmake builder to tbb... since they don't even have an install target by default, sic.
      download TBB_SOURCE_CMAKE[@] $_src/CMakeLists.txt
      cp $_src/build/vs2013/version_string.ver $_src/build/version_string.ver.in
    fi

    cd $_src

    # Always refresh the whole build!
    if [ -d cmake_build ]; then
      rm -rf cmake_build
    fi
    mkdir cmake_build
    cd cmake_build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D TBB_BUILD_SHARED=ON"
    cmake_d="$cmake_d -D TBB_BUILD_STATIC=OFF"
    cmake_d="$cmake_d -D TBB_BUILD_TBBMALLOC=ON"
    cmake_d="$cmake_d -D TBB_BUILD_TBBMALLOC_PROXY=OFF"
    cmake_d="$cmake_d -D TBB_BUILD_TESTS=OFF"

    if file /bin/cp | grep -q '32-bit'; then
      cflags="-fPIC -m32 -march=i686"
    else
      cflags="-fPIC"
    fi

    cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ..

    make -j$THREADS && make install

    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "TBB-$TBB_VERSION$TBB_VERSION_UPDATE failed to compile, exiting"
      exit 1
    fi

    magic_compile_set tbb-$TBB_VERSION $tbb_magic

    cd $CWD
    INFO "Done compiling TBB-$TBB_VERSION$TBB_VERSION_UPDATE!"
  else
    INFO "Own TBB-$TBB_VERSION$TBB_VERSION_UPDATE is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-tbb option."
  fi

  run_ldconfig "tbb"
}

# ----------------------------------------------------------------------------
# Build OCIO

_init_ocio() {
  _src=$SRC/OpenColorIO-$OCIO_VERSION
  if [ "$OCIO_USE_REPO" = true ]; then
    _git=true
  else
    _git=false
  fi
  _inst=$INST/ocio-$OCIO_VERSION_SHORT
  _inst_shortcut=$INST/ocio
}

_update_deps_ocio() {
  :
}

clean_OCIO() {
  _init_ocio
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_ocio false true
  fi
  _clean
}

compile_OCIO() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenColorIO will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  ocio_magic=3
  _init_ocio

  # Force having own builds for the dependencies.
  _update_deps_ocio true false

  # Clean install if needed!
  magic_compile_check ocio-$OCIO_VERSION $ocio_magic
  if [ $? -eq 1 -o "$OCIO_FORCE_REBUILD" = true ]; then
    clean_OCIO
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenColorIO-$OCIO_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_ocio true true

    prepare_inst

    if [ ! -d $_src ]; then
      INFO "Downloading OpenColorIO-$OCIO_VERSION"
      mkdir -p $SRC

      if [ "$OCIO_USE_REPO" = true ]; then
        git clone ${OCIO_SOURCE_REPO[0]} $_src
      else
        download OCIO_SOURCE[@] $_src.tar.gz
        INFO "Unpacking OpenColorIO-$OCIO_VERSION"
        tar -C $SRC --transform "s,(.*/?)imageworks-OpenColorIO[^/]*(.*),\1OpenColorIO-$OCIO_VERSION\2,x" \
            -xf $_src.tar.gz
      fi

    fi

    cd $_src

    if [ "$OCIO_USE_REPO" = true ]; then
      # XXX For now, always update from latest repo...
      git pull origin master
      git checkout $OCIO_SOURCE_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D OCIO_BUILD_APPS=OFF"
    cmake_d="$cmake_d -D OCIO_BUILD_PYTHON=OFF"
    cmake_d="$cmake_d -D OCIO_BUILD_GPU_TESTS=OFF"

    if file /bin/cp | grep -q '32-bit'; then
      cflags="-fPIC -m32 -march=i686"
    else
      cflags="-fPIC"
    fi
    cflags="$cflags -Wno-error=unused-function -Wno-error=deprecated-declarations"

    cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ..

    make -j$THREADS && make install

    # Force linking against static libs
    #rm -f $_inst/lib/*.so*

    # Additional depencencies
    #cp ext/dist/lib/libtinyxml.a $_inst/lib
    #cp ext/dist/lib/libyaml-cpp.a $_inst/lib

    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenColorIO-$OCIO_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set ocio-$OCIO_VERSION $ocio_magic

    cd $CWD
    INFO "Done compiling OpenColorIO-$OCIO_VERSION!"
  else
    INFO "Own OpenColorIO-$OCIO_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-ocio option."
  fi

  run_ldconfig "ocio"
}

# ----------------------------------------------------------------------------
# Build OpenEXR (and ILMBase).

_init_openexr() {
  _src=$SRC/OpenEXR-$OPENEXR_VERSION
  _git=false
  _inst=$INST/openexr-$OPENEXR_VERSION_SHORT
  _inst_shortcut=$INST/openexr
}

_update_deps_openexr() {
  if [ "$1" = true ]; then
    OIIO_FORCE_BUILD=true
    ALEMBIC_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OIIO_FORCE_REBUILD=true
    ALEMBIC_FORCE_REBUILD=true
  fi
}

clean_OPENEXR() {
  _init_openexr
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_openexr false true
  fi
  _clean
}

compile_OPENEXR() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenEXR will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  openexr_magic=15
  _init_openexr

  # Force having own builds for the dependencies.
  _update_deps_openexr true false

  # Clean install if needed!
  magic_compile_check openexr-$OPENEXR_VERSION $openexr_magic
  if [ $? -eq 1 -o "$OPENEXR_FORCE_REBUILD" = true ]; then
    clean_OPENEXR
  fi

  PRINT ""

  if [ ! -d $_inst ]; then
    INFO "Building ILMBase-$OPENEXR_VERSION and OpenEXR-$OPENEXR_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_openexr true true

    prepare_inst

    if [ ! -d $_src ]; then
      INFO "Downloading OpenEXR-$OPENEXR_VERSION"
      mkdir -p $SRC

      if [ "$OPENEXR_USE_REPO" = true ]; then
        git clone ${OPENEXR_SOURCE_REPO[0]} $_src
      else
        download OPENEXR_SOURCE[@] $_src.tar.gz
        INFO "Unpacking OpenEXR-$OPENEXR_VERSION"
        tar -C $SRC --transform "s,(.*/?)openexr[^/]*(.*),\1OpenEXR-$OPENEXR_VERSION\2,x" -xf $_src.tar.gz
      fi

    fi

    cd $_src

    if [ "$OPENEXR_USE_REPO" = true ]; then
      # XXX For now, always update from latest repo...
      git pull origin master
      git checkout $OPENEXR_SOURCE_REPO_UID
      git reset --hard
      openexr_src_path="../OpenEXR"
    else
      openexr_src_path=".."
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D CMAKE_INSTALL_DOCDIR=/dev/null"  # Hack, there is no option to disable that currently...
    cmake_d="$cmake_d -D BUILD_SHARED_LIBS=ON"
    cmake_d="$cmake_d -D BUILD_TESTING=OFF"
    cmake_d="$cmake_d -D OPENEXR_BUILD_UTILS=OFF"
    cmake_d="$cmake_d -D PYILMBASE_ENABLE=OFF"
    cmake_d="$cmake_d -D OPENEXR_VIEWERS_ENABLE=OFF"

    if file /bin/cp | grep -q '32-bit'; then
      cflags="-fPIC -m32 -march=i686"
    else
      cflags="-fPIC"
    fi

    cmake $cmake_d -D CMAKE_BUILD_TYPE=Release -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" $openexr_src_path

    make -j$THREADS && make install

    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenEXR-$OPENEXR_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set openexr-$OPENEXR_VERSION $openexr_magic

    cd $CWD
    INFO "Done compiling OpenEXR-$OPENEXR_VERSION!"
  else
    INFO "Own OpenEXR-$OPENEXR_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-openexr option."
  fi

  _with_built_openexr=true

  # Just always run it, much simpler this way!
  run_ldconfig "openexr"
}

# ----------------------------------------------------------------------------
# Build OIIO

_init_oiio() {
  _src=$SRC/OpenImageIO-$OIIO_VERSION
  _git=true
  _inst=$INST/oiio-$OIIO_VERSION_SHORT
  _inst_shortcut=$INST/oiio
}

_update_deps_oiio() {
  if [ "$1" = true ]; then
    OSL_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OSL_FORCE_REBUILD=true
  fi
}

clean_OIIO() {
  _init_oiio
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_oiio false true
  fi
  _clean
}

compile_OIIO() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenImageIO will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  oiio_magic=17
  _init_oiio

  # Force having own builds for the dependencies.
  _update_deps_oiio true false

  # Clean install if needed!
  magic_compile_check oiio-$OIIO_VERSION $oiio_magic
  if [ $? -eq 1 -o "$OIIO_FORCE_REBUILD" = true ]; then
    clean_OIIO
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenImageIO-$OIIO_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_oiio true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC

      if [ "$OIIO_USE_REPO" = true ]; then
        git clone ${OIIO_SOURCE_REPO[0]} $_src
      else
        download OIIO_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking OpenImageIO-$OIIO_VERSION"
        tar -C $SRC --transform "s,(.*/?)oiio-Release-[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$OIIO_USE_REPO" = true ]; then
      # XXX For now, always update from latest repo...
      git pull origin master
      # Stick to same rev as windows' libs...
      git checkout $OIIO_SOURCE_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D STOP_ON_WARNING=OFF"
    cmake_d="$cmake_d -D LINKSTATIC=OFF"
    cmake_d="$cmake_d -D USE_SIMD=sse2"

    cmake_d="$cmake_d -D OPENEXR_VERSION=$OPENEXR_VERSION"

    if [ "$_with_built_openexr" = true ]; then
      cmake_d="$cmake_d -D ILMBASE_HOME=$INST/openexr"
      cmake_d="$cmake_d -D OPENEXR_HOME=$INST/openexr"
      INFO "ILMBASE_HOME=$INST/openexr"
    fi

    # ptex is only needed when nicholas bishop is ready
    cmake_d="$cmake_d -D USE_PTEX=OFF"

    # Optional tests and cmd tools
    cmake_d="$cmake_d -D USE_QT=OFF"
    cmake_d="$cmake_d -D USE_PYTHON=OFF"
    cmake_d="$cmake_d -D USE_FFMPEG=OFF"
    cmake_d="$cmake_d -D USE_OPENCV=OFF"
    cmake_d="$cmake_d -D BUILD_TESTING=OFF"
    cmake_d="$cmake_d -D OIIO_BUILD_TESTS=OFF"
    cmake_d="$cmake_d -D OIIO_BUILD_TOOLS=ON"
    cmake_d="$cmake_d -D TXT2MAN="
    #cmake_d="$cmake_d -D CMAKE_EXPORT_COMPILE_COMMANDS=ON"
    #cmake_d="$cmake_d -D CMAKE_VERBOSE_MAKEFILE=ON"

    if [ -d $INST/boost ]; then
      cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON -D Boost_NO_BOOST_CMAKE=ON"
    fi

    # Looks like we do not need ocio in oiio for now...
#    if [ -d $INST/ocio ]; then
#      cmake_d="$cmake_d -D OCIO_PATH=$INST/ocio"
#    fi

    if file /bin/cp | grep -q '32-bit'; then
      cflags="-fPIC -m32 -march=i686"
    else
      cflags="-fPIC"
    fi

    cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ..

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenImageIO-$OIIO_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set oiio-$OIIO_VERSION $oiio_magic

    cd $CWD
    INFO "Done compiling OpenImageIO-$OIIO_VERSION!"
  else
    INFO "Own OpenImageIO-$OIIO_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-oiio option."
  fi

  # Just always run it, much simpler this way!
  run_ldconfig "oiio"
}

# ----------------------------------------------------------------------------
# Build LLVM

_init_llvm() {
  _src=$SRC/LLVM-$LLVM_VERSION
  _src_clang=$SRC/CLANG-$LLVM_VERSION
  _git=false
  _inst=$INST/llvm-$LLVM_VERSION_SHORT
  _inst_shortcut=$INST/llvm
}

_update_deps_llvm() {
  if [ "$1" = true ]; then
    OSL_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OSL_FORCE_REBUILD=true
  fi
}

clean_LLVM() {
  _init_llvm
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_llvm false true
  fi
  _clean
}

compile_LLVM() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, LLVM will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  llvm_magic=3
  _init_llvm

  # Force having own builds for the dependencies.
  _update_deps_llvm true false

  # Clean install if needed!
  magic_compile_check llvm-$LLVM_VERSION $llvm_magic
  if [ $? -eq 1 -o "$LLVM_FORCE_REBUILD" = true ]; then
    clean_LLVM
  fi

  if [ ! -d $_inst ]; then
    INFO "Building LLVM-$LLVM_VERSION (CLANG included!)"

    # Force rebuilding the dependencies.
    _update_deps_llvm true true

    prepare_inst

    if [ ! -d $_src -o true ]; then
      mkdir -p $SRC
      download LLVM_SOURCE[@] "$_src.tar.xz"
      download LLVM_CLANG_SOURCE[@] "$_src_clang.tar.xz"

      INFO "Unpacking LLVM-$LLVM_VERSION"
      tar -C $SRC --transform "s,([^/]*/?)llvm-[^/]*(.*),\1LLVM-$LLVM_VERSION\2,x" \
          -xf $_src.tar.xz
      INFO "Unpacking CLANG-$LLVM_VERSION to $_src/tools/clang"
      # Stupid clang guys renamed 'clang' to 'cfe' for now handle both cases... :(
      tar -C $_src/tools \
          --transform "s,([^/]*/?)(clang|cfe)-[^/]*(.*),\1clang\3,x" \
          -xf $_src_clang.tar.xz

      cd $_src

      cd $CWD

    fi

    cd $_src

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D LLVM_ENABLE_FFI=ON"
    cmake_d="$cmake_d -D LLVM_TARGETS_TO_BUILD=X86"
    cmake_d="$cmake_d -D LLVM_ENABLE_TERMINFO=OFF"

    if [ -d $_FFI_INCLUDE_DIR ]; then
      cmake_d="$cmake_d -D FFI_INCLUDE_DIR=$_FFI_INCLUDE_DIR"
    fi

    cmake $cmake_d ..

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "LLVM-$LLVM_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set llvm-$LLVM_VERSION $llvm_magic

    cd $CWD
    INFO "Done compiling LLVM-$LLVM_VERSION (CLANG included)!"
  else
    INFO "Own LLVM-$LLVM_VERSION (CLANG included) is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-llvm option."
  fi
}

# ----------------------------------------------------------------------------
# Build OSL

_init_osl() {
  _src=$SRC/OpenShadingLanguage-$OSL_VERSION
  _git=true
  _inst=$INST/osl-$OSL_VERSION_SHORT
  _inst_shortcut=$INST/osl
}

_update_deps_osl() {
  :
}

clean_OSL() {
  _init_osl
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_osl false true
  fi
  _clean
}

compile_OSL() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenShadingLanguage will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  osl_magic=21
  _init_osl

  # Force having own builds for the dependencies.
  _update_deps_osl true false

  # Clean install if needed!
  magic_compile_check osl-$OSL_VERSION $osl_magic
  if [ $? -eq 1 -o "$OSL_FORCE_REBUILD" = true ]; then
    #~ rm -Rf $_src  # XXX Radical, but not easy to change remote repo fully automatically
    clean_OSL
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenShadingLanguage-$OSL_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_osl true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC

      if [ "$OSL_USE_REPO" = true ]; then
        git clone ${OSL_SOURCE_REPO[0]} $_src
      else
        download OSL_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking OpenShadingLanguage-$OSL_VERSION"
        tar -C $SRC --transform "s,(.*/?)OpenShadingLanguage-[^/]*(.*),\1OpenShadingLanguage-$OSL_VERSION\2,x" \
            -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$OSL_USE_REPO" = true ]; then
      git remote set-url origin ${OSL_SOURCE_REPO[0]}
      # XXX For now, always update from latest repo...
      git pull --no-edit -X theirs origin $OSL_SOURCE_REPO_BRANCH
      # Stick to same rev as windows' libs...
      git checkout $OSL_SOURCE_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D BUILD_TESTING=OFF"
    cmake_d="$cmake_d -D STOP_ON_WARNING=OFF"
    cmake_d="$cmake_d -D OSL_BUILD_PLUGINS=OFF"
    cmake_d="$cmake_d -D OSL_BUILD_TESTS=OFF"
    cmake_d="$cmake_d -D USE_SIMD=sse2"
    cmake_d="$cmake_d -D USE_LLVM_BITCODE=OFF"
    cmake_d="$cmake_d -D USE_PARTIO=OFF"
    cmake_d="$cmake_d -D OSL_BUILD_MATERIALX=OFF"
    cmake_d="$cmake_d -D USE_QT=OFF"
    cmake_d="$cmake_d -D USE_PYTHON=OFF"

    cmake_d="$cmake_d -D CMAKE_CXX_STANDARD=14"

    #~ cmake_d="$cmake_d -D ILMBASE_VERSION=$ILMBASE_VERSION"

    if [ "$_with_built_openexr" = true ]; then
      INFO "ILMBASE_HOME=$INST/openexr"
      cmake_d="$cmake_d -D OPENEXR_ROOT_DIR=$INST/openexr"
      cmake_d="$cmake_d -D ILMBASE_ROOT_DIR=$INST/openexr"
      # XXX Temp workaround... sigh, ILMBase really messed the things up by defining their custom names ON by default :(
    fi

    if [ -d $INST/boost ]; then
      cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON -D Boost_NO_BOOST_CMAKE=ON"
    fi

    if [ -d $INST/oiio ]; then
      cmake_d="$cmake_d -D OPENIMAGEIO_ROOT_DIR=$INST/oiio"
      # HACK! SIC!!!!
      # Quiet incredible, but if root dir is given, path to lib is found, but not path to include...
      cmake_d="$cmake_d -D OPENIMAGEIO_INCLUDE_DIR=$INST/oiio/include"
    fi

    if [ ! -z $LLVM_VERSION_FOUND ]; then
      cmake_d="$cmake_d -D LLVM_VERSION=$LLVM_VERSION_FOUND"
      if [ -d $INST/llvm ]; then
        cmake_d="$cmake_d -D LLVM_DIRECTORY=$INST/llvm"
        cmake_d="$cmake_d -D LLVM_STATIC=ON"
      fi
    fi

    #~ cmake_d="$cmake_d -D CMAKE_EXPORT_COMPILE_COMMANDS=ON"
    #~ cmake_d="$cmake_d -D CMAKE_VERBOSE_MAKEFILE=ON"

    cmake $cmake_d ..

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenShadingLanguage-$OSL_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set osl-$OSL_VERSION $osl_magic

    cd $CWD
    INFO "Done compiling OpenShadingLanguage-$OSL_VERSION!"
  else
    INFO "Own OpenShadingLanguage-$OSL_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-osl option."
  fi

  run_ldconfig "osl"
}

# ----------------------------------------------------------------------------
# Build OSD

_init_osd() {
  _src=$SRC/OpenSubdiv-$OSD_VERSION
  _git=true
  _inst=$INST/osd-$OSD_VERSION_SHORT
  _inst_shortcut=$INST/osd
}

_update_deps_osd() {
  :
}

clean_OSD() {
  _init_osd
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_osd false true
  fi
  _clean
}

compile_OSD() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenSubdiv will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  osd_magic=2
  _init_osd

  # Force having own builds for the dependencies.
  _update_deps_osd true false

  # Clean install if needed!
  magic_compile_check osd-$OSD_VERSION $osd_magic
  if [ $? -eq 1 -o "$OSD_FORCE_REBUILD" = true ]; then
    clean_OSD
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenSubdiv-$OSD_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_osd true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC

      if [ "$OSD_USE_REPO" = true ]; then
        git clone ${OSD_SOURCE_REPO[0]} $_src
      else
        download OSD_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking OpenSubdiv-$OSD_VERSION"
        tar -C $SRC --transform "s,(.*/?)OpenSubdiv-[^/]*(.*),\1OpenSubdiv-$OSD_VERSION\2,x" \
            -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$OSD_USE_REPO" = true ]; then
      git remote set-url origin ${OSD_SOURCE_REPO[0]}
      # XXX For now, always update from latest repo...
      git pull --no-edit -X theirs origin $OSD_SOURCE_REPO_BRANCH
      # Stick to same rev as windows' libs...
      git checkout $OSD_SOURCE_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    if [ -d $INST/tbb ]; then
      cmake_d="$cmake_d $cmake_d -D TBB_LOCATION=$INST/tbb"
    fi
    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    # ptex is only needed when nicholas bishop is ready
    cmake_d="$cmake_d -D NO_PTEX=1"
    cmake_d="$cmake_d -D NO_CLEW=1 -D NO_CUDA=1 -D NO_OPENCL=1"
    # maya plugin, docs, tutorials, regression tests and examples are not needed
    cmake_d="$cmake_d -D NO_MAYA=1 -D NO_DOC=1 -D NO_TUTORIALS=1 -D NO_REGRESSION=1 -DNO_EXAMPLES=1"

    cmake $cmake_d ..

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenSubdiv-$OSD_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set osd-$OSD_VERSION $osd_magic

    cd $CWD
    INFO "Done compiling OpenSubdiv-$OSD_VERSION!"
  else
    INFO "Own OpenSubdiv-$OSD_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-osd option."
  fi

  run_ldconfig "osd"
}

# ----------------------------------------------------------------------------
# Build Blosc

_init_blosc() {
  _src=$SRC/c-blosc-$OPENVDB_BLOSC_VERSION
  _git=false
  _inst=$INST/blosc-$OPENVDB_BLOSC_VERSION
  _inst_shortcut=$INST/blosc
}

_update_deps_blosc() {
  if [ "$1" = true ]; then
    OPENVDB_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OPENVDB_FORCE_REBUILD=true
  fi
}

clean_BLOSC() {
  _init_blosc
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_blosc false true
  fi
  _clean
}

compile_BLOSC() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, Blosc will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  blosc_magic=0
  _init_blosc

  # Force having own builds for the dependencies.
  _update_deps_blosc true false

  # Clean install if needed!
  magic_compile_check blosc-$OPENVDB_BLOSC_VERSION $blosc_magic
  if [ $? -eq 1 -o "$OPENVDB_FORCE_REBUILD" = true ]; then
    clean_BLOSC
    rm -rf $_inst
  fi

  if [ ! -d $_inst ]; then
    INFO "Building Blosc-$OPENVDB_BLOSC_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_blosc true true

    prepare_inst

    if [ ! -d $_src ]; then
      INFO "Downloading Blosc-$OPENVDB_BLOSC_VERSION"
      mkdir -p $SRC
      download OPENVDB_BLOSC_SOURCE[@] $_src.tar.gz

      INFO "Unpacking Blosc-$OPENVDB_BLOSC_VERSION"
      tar -C $SRC -xf $_src.tar.gz
    fi

    cd $_src
    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D BUILD_STATIC=OFF"
    cmake_d="$cmake_d -D BUILD_TESTS=OFF"
    cmake_d="$cmake_d -D BUILD_BENCHMARKS=OFF"
    INFO "$cmake_d"

    cmake $cmake_d ..

    make -j$THREADS && make install

    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "Blosc-$OPENVDB_BLOSC_VERSION failed to compile, exiting"
      exit 1
    fi
    cd $CWD
    INFO "Done compiling Blosc-$OPENVDB_BLOSC_VERSION!"
  else
    INFO "Own Blosc-$OPENVDB_BLOSC_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib (and openvdb), use the --force-openvdb option."
  fi

  magic_compile_set blosc-$OPENVDB_BLOSC_VERSION $blosc_magic

  run_ldconfig "blosc"
}

# ----------------------------------------------------------------------------
# Build OpenVDB

_init_nanovdb() {
  _src=$SRC/openvdb-$OPENVDB_VERSION/nanovdb
  _inst=$INST/nanovdb-$OPENVDB_VERSION_SHORT
  _inst_shortcut=$INST/nanovdb
}

_update_deps_nanovdb() {
  :
}

clean_nanovdb() {
  _init_nanovdb
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_nanovdb false true
  fi
  _git=true  # Mere trick to prevent clean from removing $_src...
  _clean
}

install_NanoVDB() {
  # To be changed each time we make edits that would modify the compiled results!
  nanovdb_magic=1
  _init_nanovdb

  # Force having own builds for the dependencies.
  _update_deps_nanovdb true false

  # Clean install if needed!
  magic_compile_check nanovdb-$OPENVDB_VERSION $nanovdb_magic
  if [ $? -eq 1 ]; then
    clean_nanovdb
  fi

  if [ ! -d $_inst ]; then
    INFO "Installing NanoVDB v$OPENVDB_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_nanovdb true true

    prepare_inst

    if [ ! -d $_src ]; then
      ERROR "NanoVDB not found in openvdb-$OPENVDB_VERSION ($_src), exiting"
      exit 1
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"

    # NanoVDB is header-only, so only need the install target
    cmake_d="$cmake_d -D NANOVDB_BUILD_UNITTESTS=OFF"
    cmake_d="$cmake_d -D NANOVDB_BUILD_EXAMPLES=OFF"
    cmake_d="$cmake_d -D NANOVDB_BUILD_BENCHMARK=OFF"
    cmake_d="$cmake_d -D NANOVDB_BUILD_DOCS=OFF"
    cmake_d="$cmake_d -D NANOVDB_BUILD_TOOLS=OFF"
    cmake_d="$cmake_d -D NANOVDB_CUDA_KEEP_PTX=OFF"

    # Do not need to include any of the dependencies because of this
    cmake_d="$cmake_d -D NANOVDB_USE_OPENVDB=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_OPENGL=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_OPENCL=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_CUDA=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_TBB=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_BLOSC=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_ZLIB=OFF"
    cmake_d="$cmake_d -D NANOVDB_USE_OPTIX=OFF"
    cmake_d="$cmake_d -D NANOVDB_ALLOW_FETCHCONTENT=OFF"

    cmake $cmake_d $_src

    make -j$THREADS install
    make clean

    #~ mkdir -p $_inst
    #~ cp -r $_src/include $_inst/include

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "NanoVDB-v$OPENVDB_VERSION failed to install, exiting"
      exit 1
    fi

    magic_compile_set nanovdb-$OPENVDB_VERSION $nanovdb_magic

    cd $CWD
    INFO "Done compiling NanoVDB-v$OPENVDB_VERSION!"
  else
    INFO "Own NanoVDB-v$OPENVDB_VERSION is up to date, nothing to do!"
  fi
}


_init_openvdb() {
  _src=$SRC/openvdb-$OPENVDB_VERSION
  _git=false
  _inst=$INST/openvdb-$OPENVDB_VERSION_SHORT
  _inst_shortcut=$INST/openvdb
  
  _openvdb_source=$OPENVDB_SOURCE
  if [ "$WITH_NANOVDB" = true ]; then
    _openvdb_source=$NANOVDB_SOURCE
  fi
}

_update_deps_openvdb() {
  :
}

clean_OPENVDB() {
  _init_openvdb
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_openvdb false true
  fi
  _clean
}

compile_OPENVDB() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenVDB will not be compiled!"
    return
  fi

  compile_BLOSC
  PRINT ""

  # To be changed each time we make edits that would modify the compiled result!
  openvdb_magic=2
  _init_openvdb

  # Force having own builds for the dependencies.
  _update_deps_openvdb true false

  # Clean install if needed!
  magic_compile_check openvdb-$OPENVDB_VERSION $openvdb_magic
  if [ $? -eq 1 -o "$OPENVDB_FORCE_REBUILD" = true ]; then
    clean_OPENVDB
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenVDB-$OPENVDB_VERSION (with NanoVDB: $WITH_NANOVDB)"

    # Force rebuilding the dependencies.
    _update_deps_openvdb true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      download _openvdb_source[@] "$_src.tar.gz"

      INFO "Unpacking OpenVDB-$OPENVDB_VERSION"
      if [ "$WITH_NANOVDB" = true ]; then
        tar -C $SRC --transform "s,(.*/?)openvdb-$NANOVDB_SOURCE_REPO_UID[^/]*(.*),\1openvdb-$OPENVDB_VERSION\2,x" \
            -xf $_src.tar.gz
      else
        tar -C $SRC -xf $_src.tar.gz
      fi
    fi

    cd $_src

    #~ if [ "$OPENVDB_USE_REPO" = true ]; then
      #~ git remote set-url origin ${OPENVDB_SOURCE_REPO[0]}
      #~ # XXX For now, always update from latest repo...
      #~ git pull --no-edit -X theirs origin $OPENVDB_SOURCE_REPO_BRANCH
      #~ # Stick to same rev as windows' libs...
      #~ git checkout $OPENVDB_SOURCE_REPO_UID
      #~ git reset --hard
    #~ fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D USE_STATIC_DEPENDENCIES=OFF"
    cmake_d="$cmake_d -D OPENVDB_BUILD_BINARIES=OFF"

    if [ -d $INST/boost ]; then
      cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost"
      cmake_d="$cmake_d -D Boost_USE_MULTITHREADED=ON"
      cmake_d="$cmake_d -D Boost_NO_SYSTEM_PATHS=ON"
      cmake_d="$cmake_d -D Boost_NO_BOOST_CMAKE=ON"
      cmake_d="$cmake_d -D Boost_NO_BOOST_CMAKE=ON"
    fi
    if [ -d $INST/tbb ]; then
      cmake_d="$cmake_d -D TBB_ROOT=$INST/tbb"
    fi

    if [ "$_with_built_openexr" = true ]; then
      cmake_d="$cmake_d -D IlmBase_ROOT=$INST/openexr"
      cmake_d="$cmake_d -D OpenEXR_ROOT=$INST/openexr"
    fi

    if [ -d $INST/blosc ]; then
      cmake_d="$cmake_d -D Blosc_ROOT=$INST/blosc"
    fi
  
    cmake $cmake_d ..

    make -j$THREADS install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenVDB-$OPENVDB_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set openvdb-$OPENVDB_VERSION $openvdb_magic

    cd $CWD
    INFO "Done compiling OpenVDB-$OPENVDB_VERSION!"
  else
    INFO "Own OpenVDB-$OPENVDB_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-openvdb option."
  fi

  run_ldconfig "openvdb"

  if [ "$WITH_NANOVDB" = true ]; then
    install_NanoVDB
  fi
}

# ----------------------------------------------------------------------------
# Build Alembic

_init_alembic() {
  _src=$SRC/alembic-$ALEMBIC_VERSION
  _git=false
  _inst=$INST/alembic-$ALEMBIC_VERSION_SHORT
  _inst_shortcut=$INST/alembic
}

_update_deps_alembic() {
  :
}

clean_ALEMBIC() {
  _init_alembic
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_alembic false true
  fi
  _clean
}

compile_ALEMBIC() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, Alembic will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  alembic_magic=2
  _init_alembic

  # Force having own builds for the dependencies.
  _update_deps_alembic true false

  # Clean install if needed!
  magic_compile_check alembic-$ALEMBIC_VERSION $alembic_magic
  if [ $? -eq 1 -o "$ALEMBIC_FORCE_REBUILD" = true ]; then
    clean_ALEMBIC
  fi

  if [ ! -d $_inst ]; then
    INFO "Building Alembic-$ALEMBIC_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_alembic true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      download ALEMBIC_SOURCE[@] "$_src.tar.gz"

      INFO "Unpacking Alembic-$ALEMBIC_VERSION"
      tar -C $SRC -xf $_src.tar.gz
    fi

    cd $_src

    cmake_d="-D CMAKE_INSTALL_PREFIX=$_inst"

    if [ -d $INST/boost ]; then
      if [ -d $INST/boost ]; then
        cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost"
      fi
      cmake_d="$cmake_d -D USE_STATIC_BOOST=ON"
    else
      cmake_d="$cmake_d -D USE_STATIC_BOOST=OFF"
    fi

    if [ "$_with_built_openexr" = true ]; then
      cmake_d="$cmake_d -D ILMBASE_ROOT=$INST/openexr"
      cmake_d="$cmake_d -D USE_ARNOLD=OFF"
      cmake_d="$cmake_d -D USE_BINARIES=OFF"
      cmake_d="$cmake_d -D USE_EXAMPLES=OFF"
      cmake_d="$cmake_d -D USE_HDF5=OFF"
      cmake_d="$cmake_d -D USE_MAYA=OFF"
      cmake_d="$cmake_d -D USE_PRMAN=OFF"
      cmake_d="$cmake_d -D USE_PYALEMBIC=OFF"
      cmake_d="$cmake_d -D USE_STATIC_HDF5=OFF"
      cmake_d="$cmake_d -D ALEMBIC_ILMBASE_LINK_STATIC=OFF"
      cmake_d="$cmake_d -D ALEMBIC_SHARED_LIBS=OFF"
      INFO "ILMBASE_ROOT=$INST/openexr"
    fi

    cmake $cmake_d ./
    make -j$THREADS install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "Alembic-$ALEMBIC_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set alembic-$ALEMBIC_VERSION $alembic_magic

    cd $CWD
    INFO "Done compiling Alembic-$ALEMBIC_VERSION!"
  else
    INFO "Own Alembic-$ALEMBIC_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-alembic option."
  fi

  run_ldconfig "alembic"
}

#### Build USD ####
_init_usd() {
  _src=$SRC/USD-$USD_VERSION
  _git=false
  _inst=$INST/usd-$USD_VERSION_SHORT
  _inst_shortcut=$INST/usd
}

_update_deps_usd() {
  :
}

clean_USD() {
  _init_usd
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_usd false true
  fi
  _clean
}

compile_USD() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, USD will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  usd_magic=1
  _init_usd

  # Force having own builds for the dependencies.
  _update_deps_usd true false

  # Clean install if needed!
  magic_compile_check usd-$USD_VERSION $usd_magic
  if [ $? -eq 1 -o "$USD_FORCE_REBUILD" = true ]; then
    clean_USD
  fi

  if [ ! -d $_inst ]; then
    INFO "Building USD-$USD_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_usd true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      download USD_SOURCE[@] "$_src.tar.gz"

      INFO "Unpacking USD-$USD_VERSION"
      tar -C $SRC -xf $_src.tar.gz
      patch -d $_src -p1 < $SCRIPT_DIR/patches/usd.diff
    fi

    cd $_src

    cmake_d="-D CMAKE_INSTALL_PREFIX=$_inst"
    # For the reasoning behind these options, please see usd.cmake.
    if [ -d $INST/boost ]; then
      cmake_d="$cmake_d $cmake_d -D BOOST_ROOT=$INST/boost"
    fi

    if [ -d $INST/tbb ]; then
      cmake_d="$cmake_d $cmake_d -D TBB_ROOT_DIR=$INST/tbb"
    fi
    cmake_d="$cmake_d -DPXR_SET_INTERNAL_NAMESPACE=usdBlender"
    cmake_d="$cmake_d -DPXR_ENABLE_PYTHON_SUPPORT=OFF"
    cmake_d="$cmake_d -DPXR_BUILD_IMAGING=OFF"
    cmake_d="$cmake_d -DPXR_BUILD_TESTS=OFF"
    cmake_d="$cmake_d -DBUILD_SHARED_LIBS=ON"
    cmake_d="$cmake_d -DPXR_BUILD_MONOLITHIC=ON"
    cmake_d="$cmake_d -DPXR_BUILD_USD_TOOLS=OFF"
    cmake_d="$cmake_d -DCMAKE_DEBUG_POSTFIX=_d"

    cmake $cmake_d ./
    make -j$THREADS install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "USD-$USD_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set usd-$USD_VERSION $usd_magic

    cd $CWD
    INFO "Done compiling USD-$USD_VERSION!"
  else
    INFO "Own USD-$USD_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-usd option."
  fi

  run_ldconfig "usd"
}

# ----------------------------------------------------------------------------
# Build OpenCOLLADA
_init_opencollada() {
  _src=$SRC/OpenCOLLADA-$OPENCOLLADA_VERSION
  _git=true
  _inst=$INST/opencollada-$OPENCOLLADA_VERSION_SHORT
  _inst_shortcut=$INST/opencollada
}

_update_deps_collada() {
  :
}

clean_OpenCOLLADA() {
  _init_opencollada
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_collada false true
  fi
  _clean
}

compile_OpenCOLLADA() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenCOLLADA will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled results!
  opencollada_magic=9
  _init_opencollada

  # Force having own builds for the dependencies.
  _update_deps_opencollada true false

  # Clean install if needed!
  magic_compile_check opencollada-$OPENCOLLADA_VERSION $opencollada_magic
  if [ $? -eq 1 -o "$OPENCOLLADA_FORCE_REBUILD" = true ]; then
    clean_OpenCOLLADA
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenCOLLADA-$OPENCOLLADA_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_collada true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      if [ "$OPENCOLLADA_USE_REPO" = true ]; then
        git clone $OPENCOLLADA_SOURCE_REPO $_src
      else
        download OPENCOLLADA_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking OpenCOLLADA-$OPENCOLLADA_VERSION"
        tar -C $SRC -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$OPENCOLLADA_USE_REPO" = true ]; then
      git pull origin $OPENCOLLADA_REPO_BRANCH

      # Stick to same rev as windows' libs...
      git checkout $OPENCOLLADA_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D USE_EXPAT=OFF"
    cmake_d="$cmake_d -D USE_LIBXML=ON"
    # XXX Does not work!
#    cmake_d="$cmake_d -D USE_STATIC=OFF"
    cmake_d="$cmake_d -D USE_STATIC=ON"

    cmake $cmake_d ../

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenCOLLADA-$OPENCOLLADA_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set opencollada-$OPENCOLLADA_VERSION $opencollada_magic

    cd $CWD
    INFO "Done compiling OpenCOLLADA-$OPENCOLLADA_VERSION!"
  else
    INFO "Own OpenCOLLADA-$OPENCOLLADA_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-opencollada option."
  fi
}

# ----------------------------------------------------------------------------
# Build Embree

_init_embree() {
  _src=$SRC/embree-$EMBREE_VERSION
  _git=true
  _inst=$INST/embree-$EMBREE_VERSION_SHORT
  _inst_shortcut=$INST/embree
}

_update_deps_embree() {
  :
}

clean_Embree() {
  _init_embree
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_embree false true
  fi
  _clean
}

compile_Embree() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, Embree will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled results!
  embree_magic=10
  _init_embree

  # Force having own builds for the dependencies.
  _update_deps_embree true false

  # Clean install if needed!
  magic_compile_check embree-$EMBREE_VERSION $embree_magic
  if [ $? -eq 1 -o "$EMBREE_FORCE_REBUILD" = true ]; then
    clean_Embree
  fi

  if [ ! -d $_inst ]; then
    INFO "Building Embree-$EMBREE_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_embree true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      if [ "EMBREE_USE_REPO" = true ]; then
        git clone $EMBREE_SOURCE_REPO $_src
      else
        download EMBREE_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking Embree-$EMBREE_VERSION"
        tar -C $SRC -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$EMBREE_USE_REPO" = true ]; then
      git pull origin $EMBREE_REPO_BRANCH

      # Stick to same rev as windows' libs...
      git checkout $EMBREE_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D EMBREE_ISPC_SUPPORT=OFF"
    cmake_d="$cmake_d -D EMBREE_TUTORIALS=OFF"
    cmake_d="$cmake_d -D EMBREE_STATIC_LIB=ON"
    cmake_d="$cmake_d -D EMBREE_RAY_MASK=ON"
    cmake_d="$cmake_d -D EMBREE_FILTER_FUNCTION=ON"
    cmake_d="$cmake_d -D EMBREE_BACKFACE_CULLING=OFF"
    cmake_d="$cmake_d -D EMBREE_MAX_ISA=AVX2"

    cmake_d="$cmake_d -D EMBREE_TASKING_SYSTEM=TBB"
    if [ -d $INST/tbb ]; then
      make_d="$make_d EMBREE_TBB_ROOT=$INST/tbb"
    fi

    cmake $cmake_d ../

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "Embree-$EMBREE_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set embree-$EMBREE_VERSION $embree_magic

    cd $CWD
    INFO "Done compiling Embree-$EMBREE_VERSION!"
  else
    INFO "Own Embree-$EMBREE_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-embree option."
  fi
}

# ----------------------------------------------------------------------------
# Build OpenImageDenoise

_init_ispc() {
  _src=$SRC/ispc-v$ISPC_VERSION
  _inst=$INST/ispc-v$ISPC_VERSION
  _inst_shortcut=$INST/ispc
}

_update_deps_ispc() {
  if [ "$1" = true ]; then
    OIDN_FORCE_BUILD=true
  fi
  if [ "$2" = true ]; then
    OIDN_FORCE_REBUILD=true
  fi
}

clean_ispc() {
  _init_ispc
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_ispc false true
  fi
  _clean
}

install_ISPC() {
  # To be changed each time we make edits that would modify the compiled results!
  ispc_magic=0
  _init_ispc

  # Force having own builds for the dependencies.
  _update_deps_ispc true false

  # Clean install if needed!
  magic_compile_check ispc-$ISPC_VERSION $ispc_magic
  if [ $? -eq 1 ]; then
    clean_ispc
  fi

  if [ ! -d $_inst ]; then
    INFO "Installing Implicit SPMD Program Compiler v$ISPC_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_ispc true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      download ISPC_BINARY[@] "$_src.tar.gz"
      INFO "Unpacking ISPC-v$ISPC_VERSION"
      tar -C $SRC --transform "s,(.*/?)ispc-v$ISPC_VERSION-linux[^/]*(.*),\1ispc-v$ISPC_VERSION\2,x" \
          -xf $_src.tar.gz
    fi

    mkdir -p $_inst
    cp -r $_src/bin $_inst/bin

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "ISPC-v$ISPC_VERSION failed to install, exiting"
      exit 1
    fi

    magic_compile_set ispc-$ISPC_VERSION $ispc_magic

    cd $CWD
    INFO "Done compiling ISPC-v$ISPC_VERSION!"
  else
    INFO "Own ISPC-v$ISPC_VERSION is up to date, nothing to do!"
  fi

  _ispc_path_bin=$_inst/bin
  run_ldconfig "ispc"
}


_init_oidn() {
  _src=$SRC/oidn-$OIDN_VERSION
  _git=true
  _inst=$INST/oidn-$OIDN_VERSION_SHORT
  _inst_shortcut=$INST/oidn
}

_update_deps_oidn() {
  :
}

clean_oidn() {
  _init_oidn
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_oidn false true
  fi
  _clean
}

compile_OIDN() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenImageDenoise will not be compiled!"
    return
  fi

  # Latest OIDN requires ISPC compiler tool...
  install_ISPC

  # To be changed each time we make edits that would modify the compiled results!
  oidn_magic=9
  _init_oidn

  # Force having own builds for the dependencies.
  _update_deps_oidn true false

  # Clean install if needed!
  magic_compile_check oidn-$OIDN_VERSION $oidn_magic
  if [ $? -eq 1 -o "$OIDN_FORCE_REBUILD" = true ]; then
    clean_oidn
  fi

  if [ ! -d $_inst ]; then
    INFO "Building OpenImageDenoise-$OIDN_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_oidn true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC
      if [ "OIDN_USE_REPO" = true ]; then
        git clone $OIDN_SOURCE_REPO $_src
      else
        download OIDN_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking OpenImageDenoise-$OIDN_VERSION"
        tar -C $SRC -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$OIDN_USE_REPO" = true ]; then
      git pull origin $OIDN_REPO_BRANCH

      # Stick to same rev as windows' libs...
      git checkout $OIDN_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D WITH_EXAMPLE=OFF"
    cmake_d="$cmake_d -D WITH_TEST=OFF"
    cmake_d="$cmake_d -D OIDN_STATIC_LIB=ON"
    cmake_d="$cmake_d -D ISPC_DIR_HINT=$_ispc_path_bin"

    if [ -d $INST/tbb ]; then
      make_d="$make_d TBB_ROOT=$INST/tbb"
    fi

    cmake $cmake_d ../

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "OpenImageDenoise-$OIDN_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set oidn-$OIDN_VERSION $oidn_magic

    cd $CWD
    INFO "Done compiling OpenImageDenoise-$OIDN_VERSION!"
  else
    INFO "Own OpenImageDenoise-$OIDN_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-oidn option."
  fi

  run_ldconfig "oidn"
}

# ----------------------------------------------------------------------------
# Build FFMPEG

_init_ffmpeg() {
  _src=$SRC/ffmpeg-$FFMPEG_VERSION
  _inst=$INST/ffmpeg-$FFMPEG_VERSION_SHORT
  _inst_shortcut=$INST/ffmpeg
}

_update_deps_ffmpeg() {
  :
}

clean_FFmpeg() {
  _init_ffmpeg
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_ffmpeg false true
  fi
  _clean
}

compile_FFmpeg() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, ffmpeg will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  ffmpeg_magic=5
  _init_ffmpeg

  # Force having own builds for the dependencies.
  _update_deps_ffmpeg true false

  # Clean install if needed!
  magic_compile_check ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
  if [ $? -eq 1 -o "$FFMPEG_FORCE_REBUILD" = true ]; then
    clean_FFmpeg
  fi

  if [ ! -d $_inst ]; then
    INFO "Building ffmpeg-$FFMPEG_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_ffmpeg true true

    prepare_inst

    if [ ! -d $_src ]; then
      INFO "Downloading ffmpeg-$FFMPEG_VERSION"
      mkdir -p $SRC
      download FFMPEG_SOURCE[@] "$_src.tar.bz2"

      INFO "Unpacking ffmpeg-$FFMPEG_VERSION"
      tar -C $SRC -xf $_src.tar.bz2
    fi

    cd $_src

    extra=""

    if [ "$VORBIS_USE" = true ]; then
      extra="$extra --enable-libvorbis"
    fi

    if [ "$THEORA_USE" = true ]; then
      extra="$extra --enable-libtheora"
    fi

    if [ "$XVID_USE" = true ]; then
      extra="$extra --enable-libxvid"
    fi

    if [ "$X264_USE" = true ]; then
      extra="$extra --enable-libx264"
    fi

    if [ "$VPX_USE" = true ]; then
      extra="$extra --enable-libvpx"
    fi

    if [ "$OPUS_USE" = true ]; then
      extra="$extra --enable-libopus"
    fi

    if [ "$MP3LAME_USE" = true ]; then
      extra="$extra --enable-libmp3lame"
    fi

    if [ "$OPENJPEG_USE" = true ]; then
      extra="$extra --enable-libopenjpeg"
    fi

    ./configure --cc="gcc -Wl,--as-needed" \
        --extra-ldflags="-pthread -static-libgcc" \
        --prefix=$_inst --enable-static \
        --disable-ffplay --disable-doc \
        --enable-gray \
        --enable-avfilter --disable-vdpau \
        --disable-bzlib --disable-libgsm --disable-libspeex \
        --enable-pthreads --enable-zlib --enable-stripping --enable-runtime-cpudetect \
        --disable-vaapi --disable-nonfree --enable-gpl \
        --disable-postproc --disable-librtmp --disable-libopencore-amrnb \
        --disable-libopencore-amrwb --disable-libdc1394 --disable-version3 --disable-outdev=sdl \
        --disable-libxcb \
        --disable-outdev=xv --disable-indev=sndio --disable-outdev=sndio \
        --disable-outdev=alsa --disable-indev=sdl --disable-indev=alsa --disable-indev=jack \
        --disable-indev=lavfi $extra

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "FFmpeg-$FFMPEG_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set ffmpeg-$FFMPEG_VERSION $ffmpeg_magic

    cd $CWD
    INFO "Done compiling ffmpeg-$FFMPEG_VERSION!"
  else
    INFO "Own ffmpeg-$FFMPEG_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-ffmpeg option."
  fi
}

# ----------------------------------------------------------------------------
# Build OpenXR SDK

_init_xr_openxr_sdk() {
  _src=$SRC/XR-OpenXR-SDK-$XR_OPENXR_VERSION
  _git=true
  _inst=$INST/xr-openxr-sdk-$XR_OPENXR_VERSION_SHORT
  _inst_shortcut=$INST/xr-openxr-sdk
}

_update_deps_xr_openxr_sdk() {
  :
}

clean_XR_OpenXR_SDK() {
  _init_xr_openxr_sdk
  if [ -d $_inst ]; then
    # Force rebuilding the dependencies if needed.
    _update_deps_xr_openxr_sdk false true
  fi
  _clean
}

compile_XR_OpenXR_SDK() {
  if [ "$NO_BUILD" = true ]; then
    WARNING "--no-build enabled, OpenXR will not be compiled!"
    return
  fi

  # To be changed each time we make edits that would modify the compiled result!
  xr_openxr_magic=2
  _init_xr_openxr_sdk

  # Force having own builds for the dependencies.
  _update_deps_xr_openxr_sdk true false

  # Clean install if needed!
  magic_compile_check xr-openxr-$XR_OPENXR_VERSION $xr_openxr_magic
  if [ $? -eq 1 -o "$XR_OPENXR_FORCE_REBUILD" = true ]; then
    clean_XR_OpenXR_SDK
  fi

  if [ ! -d $_inst ]; then
    INFO "Building XR-OpenXR-SDK-$XR_OPENXR_VERSION"

    # Force rebuilding the dependencies.
    _update_deps_xr_openxr_sdk true true

    prepare_inst

    if [ ! -d $_src ]; then
      mkdir -p $SRC

      if [ "$XR_OPENXR_USE_REPO" = true ]; then
        git clone $XR_OPENXR_SOURCE_REPO $_src
      else
        download XR_OPENXR_SOURCE[@] "$_src.tar.gz"
        INFO "Unpacking XR-OpenXR-SDK-$XR_OPENXR_VERSION"
        tar -C $SRC --transform "s,(.*/?)OpenXR-SDK-[^/]*(.*),\1XR-OpenXR-SDK-$XR_OPENXR_VERSION\2,x" \
            -xf $_src.tar.gz
      fi
    fi

    cd $_src

    if [ "$XR_OPENXR_USE_REPO" = true ]; then
      git pull origin $XR_OPENXR_REPO_BRANCH

      # Stick to same rev as windows' libs...
      git checkout $XR_OPENXR_REPO_UID
      git reset --hard
    fi

    # Always refresh the whole build!
    if [ -d build ]; then
      rm -rf build
    fi
    mkdir build
    cd build

    # Keep flags in sync with XR_OPENXR_SDK_EXTRA_ARGS in xr_openxr.cmake!
    cmake_d="-D CMAKE_BUILD_TYPE=Release"
    cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
    cmake_d="$cmake_d -D BUILD_FORCE_GENERATION=OFF"
    cmake_d="$cmake_d -D BUILD_LOADER=ON"
    cmake_d="$cmake_d -D DYNAMIC_LOADER=OFF"
    cmake_d="$cmake_d -D BUILD_WITH_WAYLAND_HEADERS=OFF"
    cmake_d="$cmake_d -D BUILD_WITH_XCB_HEADERS=OFF"
    cmake_d="$cmake_d -D BUILD_WITH_XLIB_HEADERS=ON"
    cmake_d="$cmake_d -D BUILD_WITH_SYSTEM_JSONCPP=OFF"

    cmake $cmake_d "-DCMAKE_CXX_FLAGS=-DDISABLE_STD_FILESYSTEM=1" ..

    make -j$THREADS && make install
    make clean

    if [ -d $_inst ]; then
      _create_inst_shortcut
    else
      ERROR "XR-OpenXR-SDK-$XR_OPENXR_VERSION failed to compile, exiting"
      exit 1
    fi

    magic_compile_set xr-openxr-$XR_OPENXR_VERSION $xr_openxr_magic

    cd $CWD
    INFO "Done compiling XR-OpenXR-SDK-$XR_OPENXR_VERSION!"
  else
    INFO "Own XR-OpenXR-SDK-$XR_OPENXR_VERSION is up to date, nothing to do!"
    INFO "If you want to force rebuild of this lib, use the --force-xr-openxr option."
  fi

  run_ldconfig "xr-openxr-sdk"
}


# ----------------------------------------------------------------------------
# Install on DEB-like

get_package_version_DEB() {
    dpkg-query -W -f '${Version}' $1 | sed -r 's/([0-9]+:)?(([0-9]+\.?)+([0-9]+)).*/\2/'
}

check_package_DEB() {
  r=`apt-cache show $1 | grep -c 'Package:'`

  if [ $r -ge 1 ]; then
    return 0
  else
    return 1
  fi
}

check_package_installed_DEB() {
  r=`dpkg-query -W -f='${Status}' $1 | grep -c "install ok"`

  if [ $r -ge 1 ]; then
    return 0
  else
    return 1
  fi
}

check_package_version_match_DEB() {
  v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'`

  if [ -z "$v" ]; then
    return 1
  fi

  version_match $v $2
  return $?
}

check_package_version_ge_DEB() {
  v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)?(([0-9]+\.?)+).*/\2/'`

  if [ -z "$v" ]; then
    return 1
  fi

  version_ge $v $2
  return $?
}

check_package_version_ge_lt_DEB() {
  v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)?(([0-9]+\.?)+).*/\2/'`

  if [ -z "$v" ]; then
    return 1
  fi

  version_ge_lt $v $2 $3
  return $?
}

install_packages_DEB() {
  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to run apt-get install for $@, you'll have to do it yourself..."
  else
    $SUDO apt-get install -y $@
    if [ $? -ge 1 ]; then
      ERROR "apt-get failed to install requested packages, exiting."
      exit 1
    fi
  fi
}

install_DEB() {
  PRINT ""
  INFO "Installing dependencies for DEB-based distribution"
  PRINT ""
  PRINT "`eval _echo "$COMMON_INFO"`"
  PRINT ""

  if [ "$NO_CONFIRM" = false ]; then
    read -p "Do you want to continue (Y/n)?"
    [ "$(echo ${REPLY:=Y} | tr [:upper:] [:lower:])" != "y" ] && exit
  fi

  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to run apt-get update, you'll have to do it yourself..."
  else
    $SUDO apt-get update
  fi

  # These libs should always be available in debian/ubuntu official repository...
  VORBIS_DEV="libvorbis-dev"
  OGG_DEV="libogg-dev"
  THEORA_DEV="libtheora-dev"

  _packages="gawk cmake cmake-curses-gui build-essential libjpeg-dev libpng-dev libtiff-dev \
             git libfreetype6-dev libfontconfig-dev libx11-dev flex bison libxxf86vm-dev \
             libxcursor-dev libxi-dev wget libsqlite3-dev libxrandr-dev libxinerama-dev \
             libbz2-dev libncurses5-dev libssl-dev liblzma-dev libreadline-dev \
             libopenal-dev libglew-dev yasm $THEORA_DEV $VORBIS_DEV $OGG_DEV \
             libsdl2-dev libfftw3-dev patch bzip2 libxml2-dev libtinyxml-dev libjemalloc-dev \
             libgmp-dev libpugixml-dev libpotrace-dev libhpdf-dev"
             # libglewmx-dev  (broken in deb testing currently...)

  VORBIS_USE=true
  OGG_USE=true
  THEORA_USE=true

  PRINT ""
  # We need openjp2, libopenjpeg is an old version
  OPENJPEG_DEV="libopenjp2-7-dev"
  check_package_DEB $OPENJPEG_DEV
  if [ $? -eq 0 ]; then
    _packages="$_packages $OPENJPEG_DEV"
    OPENJPEG_USE=true
  fi

  PRINT ""
  # Some not-so-old distro (ubuntu 12.4) do not have it, do not fail in this case, just warn.
  YAMLCPP_DEV="libyaml-cpp-dev"
  check_package_DEB $YAMLCPP_DEV
  if [ $? -eq 0 ]; then
    _packages="$_packages $YAMLCPP_DEV"
  else
    PRINT ""
    WARNING "libyaml-cpp-dev not found, you may have to install it by hand to get Blender compiling..."
    PRINT ""
  fi

  PRINT ""
  CLANG_FORMAT="clang-format"
  check_package_version_ge_DEB $CLANG_FORMAT $CLANG_FORMAT_VERSION
  if [ $? -eq 0 ]; then
    _packages="$_packages $CLANG_FORMAT"
  else
    check_package_version_ge_DEB $CLANG_FORMAT $CLANG_FORMAT_VERSION_MIN
    if [ $? -eq 0 ]; then
      _packages="$_packages $CLANG_FORMAT"
    else
      PRINT ""
      WARNING "clang-format $CLANG_FORMAT_VERSION_MIN or higher not found, this is NOT needed to get Blender compiling..."
      PRINT ""
    fi
  fi

  if [ "$WITH_JACK" = true ]; then
    _packages="$_packages libspnav-dev"
    # Only install jack if jack2 is not already installed!
    JACK="libjack-dev"
    JACK2="libjack-jackd2-dev"
    check_package_installed_DEB $JACK2
    if [ $? -eq 0 ]; then
      _packages="$_packages $JACK2"
    else
      _packages="$_packages $JACK"
    fi
  fi

  if [ "$WITH_PULSEAUDIO" = true ]; then
    _packages="$_packages libpulse-dev"
  fi

  PRINT ""
  install_packages_DEB $_packages

  PRINT""
  LIBSNDFILE_DEV="libsndfile1-dev"
  check_package_DEB $LIBSNDFILE_DEV
  if [ $? -eq 0 ]; then
    install_packages_DEB $LIBSNDFILE_DEV
  fi

  PRINT ""
  X264_DEV="libx264-dev"
  check_package_version_ge_DEB $X264_DEV $X264_VERSION_MIN
  if [ $? -eq 0 ]; then
    install_packages_DEB $X264_DEV
    X264_USE=true
  fi

  if [ "$WITH_ALL" = true ]; then
    PRINT ""
    XVID_DEV="libxvidcore-dev"
    check_package_DEB $XVID_DEV
    if [ $? -eq 0 ]; then
      install_packages_DEB $XVID_DEV
      XVID_USE=true
    fi

    PRINT ""
    MP3LAME_DEV="libmp3lame-dev"
    check_package_DEB $MP3LAME_DEV
    if [ $? -eq 0 ]; then
      install_packages_DEB $MP3LAME_DEV
      MP3LAME_USE=true
    fi

    PRINT ""
    VPX_DEV="libvpx-dev"
    check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_DEB $VPX_DEV
      VPX_USE=true
    fi

    PRINT ""
    OPUS_DEV="libopus-dev"
    check_package_version_ge_DEB $OPUS_DEV $OPUS_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_DEB $OPUS_DEV
      OPUS_USE=true
    fi
  fi

  # Check cmake/glew versions and disable features for older distros.
  # This is so Blender can at least compile.
  PRINT ""
  _cmake=`get_package_version_DEB cmake`
  version_ge $_cmake "2.8.10"
  if [ $? -eq 1 ]; then
    version_ge $_cmake "2.8.8"
    if [ $? -eq 1 ]; then
      WARNING "OpenVDB and OpenCOLLADA disabled because cmake-$_cmake is not enough"
      OPENVDB_SKIP=true
      OPENCOLLADA_SKIP=true
    else
      WARNING "OpenVDB disabled because cmake-$_cmake is not enough"
      OPENVDB_SKIP=true
    fi
  fi

  PRINT ""
  _glew=`get_package_version_DEB libglew-dev`
  if [ -z $_glew ]; then
    # Stupid virtual package in Ubuntu 12.04 doesn't show version number...
    _glew=`apt-cache showpkg libglew-dev|tail -n1|awk '{print $2}'|sed 's/-.*//'`
  fi
  version_ge $_glew "1.9.0"
  if [ $? -eq 1 ]; then
    version_ge $_glew "1.7.0"
    if [ $? -eq 1 ]; then
      WARNING "OpenSubdiv disabled because GLEW-$_glew is not enough"
      WARNING "Blender will not use system GLEW library"
      OSD_SKIP=true
      NO_SYSTEM_GLEW=true
    else
      WARNING "OpenSubdiv will compile with GLEW-$_glew but with limited capability"
      WARNING "Blender will not use system GLEW library"
      NO_SYSTEM_GLEW=true
    fi
  fi


  PRINT ""
  _do_compile_python=false
  if [ "$PYTHON_SKIP" = true ]; then
    WARNING "Skipping Python installation, as requested..."
  elif [ "$PYTHON_FORCE_BUILD" = true ]; then
    INFO "Forced Python building, as requested..."
    _do_compile_python=true
  else
    check_package_version_ge_lt_DEB python3-dev $PYTHON_VERSION_MIN $PYTHON_VERSION_MAX
    if [ $? -eq 0 ]; then
      PYTHON_VERSION_INSTALLED=$(echo `get_package_version_DEB python3-dev` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/')

      install_packages_DEB python3-dev
      clean_Python
      PRINT ""

      for module in "${PYTHON_MODULES_PACKAGES[@]}"
      do
        module=($module)
        package="python3-${module[0]}"
        package_vmin=${module[1]}
        package_vmax=${module[2]}
        check_package_version_ge_lt_DEB "$package" $package_vmin $package_vmax
        if [ $? -eq 0 ]; then
          install_packages_DEB "$package"
        else
          WARNING "Sorry, using python package but no valid $package package available!" \
                  "    Use --build-python to force building of Python and use pip to get the packages."
        fi
      done
    else
      _do_compile_python=true
    fi
  fi

  if $_do_compile_python; then
    install_packages_DEB libffi-dev
    compile_Python
  fi


  PRINT ""
  if [ "$BOOST_SKIP" = true ]; then
    WARNING "Skipping Boost installation, as requested..."
  elif [ "$BOOST_FORCE_BUILD" = true ]; then
    INFO "Forced Boost building, as requested..."
    compile_Boost
  else
    check_package_version_ge_lt_DEB libboost-dev $BOOST_VERSION_MIN $BOOST_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB libboost-dev

      boost_version=$(echo `get_package_version_DEB libboost-dev` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/')

      install_packages_DEB libboost-{filesystem,iostreams,locale,regex,system,thread,wave,program-options}$boost_version-dev
      clean_Boost
    else
      compile_Boost
    fi
  fi


  PRINT ""
  if [ "$TBB_SKIP" = true ]; then
    WARNING "Skipping TBB installation, as requested..."
  elif [ "$TBB_FORCE_BUILD" = true ]; then
    INFO "Forced TBB building, as requested..."
    compile_TBB
  else
    check_package_version_ge_lt_DEB libtbb-dev $TBB_VERSION_MIN $TBB_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB libtbb-dev
      clean_TBB
    else
      compile_TBB
    fi
  fi


  PRINT ""
  if [ "$OCIO_SKIP" = true ]; then
    WARNING "Skipping OpenColorIO installation, as requested..."
  elif [ "$OCIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenColorIO building, as requested..."
    compile_OCIO
  else
    check_package_version_ge_lt_DEB libopencolorio-dev $OCIO_VERSION_MIN $OCIO_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB libopencolorio-dev
      clean_OCIO
    else
      compile_OCIO
    fi
  fi


  PRINT ""
  if [ "$OPENEXR_SKIP" = true ]; then
    WARNING "Skipping ILMBase/OpenEXR installation, as requested..."
  elif [ "$OPENEXR_FORCE_BUILD" = true ]; then
    INFO "Forced ILMBase/OpenEXR building, as requested..."
    compile_OPENEXR
  else
    check_package_version_ge_lt_DEB libopenexr-dev $OPENEXR_VERSION_MIN $OPENEXR_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB libopenexr-dev
      OPENEXR_VERSION=`get_package_version_DEB libopenexr-dev`
      ILMBASE_VERSION=$OPENEXR_VERSION
      clean_OPENEXR
    else
      compile_OPENEXR
    fi
  fi


  PRINT ""
  if [ "$OIIO_SKIP" = true ]; then
    WARNING "Skipping OpenImageIO installation, as requested..."
  elif [ "$OIIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenImageIO building, as requested..."
    compile_OIIO
  else
    check_package_version_ge_lt_DEB libopenimageio-dev $OIIO_VERSION_MIN $OIIO_VERSION_MAX
    if [ $? -eq 0 -a "$_with_built_openexr" = false ]; then
      install_packages_DEB libopenimageio-dev openimageio-tools
      clean_OIIO
    else
      compile_OIIO
    fi
  fi


  PRINT ""
  have_llvm=false
  _do_compile_llvm=false
  if [ "$LLVM_SKIP" = true ]; then
    WARNING "Skipping LLVM installation, as requested (this also implies skipping OSL!)..."
    OSL_SKIP=true
  elif [ "$LLVM_FORCE_BUILD" = true ]; then
    INFO "Forced LLVM building, as requested..."
    _do_compile_llvm=true
  else
    check_package_version_ge_lt_DEB llvm-dev $LLVM_VERSION_MIN $LLVM_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB llvm-dev clang libclang-dev
      have_llvm=true
      LLVM_VERSION=`llvm-config --version`
      LLVM_VERSION_FOUND=$LLVM_VERSION
      clean_LLVM
    else
      _do_compile_llvm=true
    fi
  fi

  if [ "$_do_compile_llvm" = true ]; then
    install_packages_DEB libffi-dev
    # LLVM can't find the debian ffi header dir
    _FFI_INCLUDE_DIR=`dpkg -L libffi-dev | grep -e ".*/ffi.h" | sed -r 's/(.*)\/ffi.h/\1/'`
    PRINT ""
    compile_LLVM
    have_llvm=true
    LLVM_VERSION_FOUND=$LLVM_VERSION
  fi


  PRINT ""
  _do_compile_osl=false
  if [ "$OSL_SKIP" = true ]; then
    WARNING "Skipping OpenShadingLanguage installation, as requested..."
  elif [ "$OSL_FORCE_BUILD" = true ]; then
    INFO "Forced OpenShadingLanguage building, as requested..."
    _do_compile_osl=true
  else
    check_package_version_ge_lt_DEB  libopenshadinglanguage-dev $OSL_VERSION_MIN $OSL_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB libopenshadinglanguage-dev
      clean_OSL
    else
      _do_compile_osl=true
    fi
  fi

  if [ "$_do_compile_osl" = true ]; then
    if [ "$have_llvm" = true ]; then
      PRINT ""
      compile_OSL
    else
      WARNING "No LLVM available, cannot build OSL!"
    fi
  fi


  PRINT ""
  if [ "$OSD_SKIP" = true ]; then
    WARNING "Skipping OpenSubdiv installation, as requested..."
  elif [ "$OSD_FORCE_BUILD" = true ]; then
    INFO "Forced OpenSubdiv building, as requested..."
    compile_OSD
  else
    # No package currently!
    PRINT ""
    compile_OSD
  fi

  PRINT ""
  if [ "$OPENVDB_SKIP" = true ]; then
    WARNING "Skipping OpenVDB installation, as requested..."
  elif [ "$OPENVDB_FORCE_BUILD" = true ]; then
    INFO "Forced OpenVDB building, as requested..."
    compile_OPENVDB
  else
    check_package_version_ge_lt_DEB libopenvdb-dev $OPENVDB_VERSION_MIN $OPENVDB_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_DEB libopenvdb-dev libblosc-dev
      clean_OPENVDB
    else
      compile_OPENVDB
    fi
  fi

  PRINT ""
  if [ "$ALEMBIC_SKIP" = true ]; then
    WARNING "Skipping Alembic installation, as requested..."
  elif [ "$ALEMBIC_FORCE_BUILD" = true ]; then
    INFO "Forced Alembic building, as requested..."
    compile_ALEMBIC
  else
    compile_ALEMBIC
  fi

  PRINT ""
  if [ "$USD_SKIP" = true ]; then
    WARNING "Skipping USD installation, as requested..."
  elif [ "$USD_FORCE_BUILD" = true ]; then
    INFO "Forced USD building, as requested..."
    compile_USD
  else
    compile_USD
  fi

  if [ "$WITH_OPENCOLLADA" = true ]; then
    _do_compile_collada=false
    PRINT ""
    if [ "$OPENCOLLADA_SKIP" = true ]; then
      WARNING "Skipping OpenCOLLADA installation, as requested..."
    elif [ "$OPENCOLLADA_FORCE_BUILD" = true ]; then
      INFO "Forced OpenCollada building, as requested..."
      _do_compile_collada=true
    else
      # No package currently!
      _do_compile_collada=true
    fi

    if [ "$_do_compile_collada" = true ]; then
      install_packages_DEB libpcre3-dev
      # Find path to libxml shared lib...
      _XML2_LIB=`dpkg -L libxml2-dev | grep -e ".*/libxml2.so"`
      # No package
      PRINT ""
      compile_OpenCOLLADA
    fi
  fi

  if [ "$WITH_EMBREE" = true ]; then
    _do_compile_embree=false
    PRINT ""
    if [ "$EMBREE_SKIP" = true ]; then
      WARNING "Skipping Embree installation, as requested..."
    elif [ "$EMBREE_FORCE_BUILD" = true ]; then
      INFO "Forced Embree building, as requested..."
      _do_compile_embree=true
    else
      # There is a package, but it does not provide everything that Blender needs...
      #~ check_package_version_ge_lt_DEB libembree-dev $EMBREE_VERSION_MIN $EMBREE_VERSION_MAX
      #~ if [ $? -eq 0 ]; then
        #~ install_packages_DEB libembree-dev
        #~ clean_Embree
      #~ else
        _do_compile_embree=true
      #~ fi
    fi

    if [ "$_do_compile_embree" = true ]; then
      compile_Embree
    fi
  fi

  if [ "$WITH_OIDN" = true ]; then
    _do_compile_oidn=false
    PRINT ""
    if [ "$OIDN_SKIP" = true ]; then
      WARNING "Skipping OpenImgeDenoise installation, as requested..."
    elif [ "$OIDN_FORCE_BUILD" = true ]; then
      INFO "Forced OpenImageDenoise building, as requested..."
      _do_compile_oidn=true
    else
      # No package currently!
      _do_compile_oidn=true
    fi

    if [ "$_do_compile_oidn" = true ]; then
      compile_OIDN
    fi
  fi

  PRINT ""
  if [ "$FFMPEG_SKIP" = true ]; then
    WARNING "Skipping FFMpeg installation, as requested..."
  elif [ "$FFMPEG_FORCE_BUILD" = true ]; then
    INFO "Forced FFMpeg building, as requested..."
    compile_FFmpeg
  else
    # XXX Debian Testing / Ubuntu 16.04 finally includes FFmpeg, so check as usual
    check_package_DEB ffmpeg
    if [ $? -eq 0 ]; then
      check_package_version_ge_lt_DEB ffmpeg $FFMPEG_VERSION_MIN $FFMPEG_VERSION_MAX
      if [ $? -eq 0 ]; then
        install_packages_DEB libavdevice-dev
        clean_FFmpeg
      else
        compile_FFmpeg
      fi
    else
      compile_FFmpeg
    fi
  fi

  PRINT ""
  if [ "$XR_OPENXR_SKIP" = true ]; then
    WARNING "Skipping OpenXR-SDK installation, as requested..."
  elif [ "$XR_OPENXR_FORCE_BUILD" = true ]; then
    INFO "Forced OpenXR-SDK building, as requested..."
    compile_XR_OpenXR_SDK
  else
    # No package currently!
    PRINT ""
    compile_XR_OpenXR_SDK
  fi
}


# ----------------------------------------------------------------------------
# Install on RPM-like

rpm_flavour() {
  if [ -f /etc/redhat-release ]; then
    if [ "`grep '[6-7]\.' /etc/redhat-release`" ]; then
      RPM="RHEL"
    else
      RPM="FEDORA"
    fi
  elif [ -f /etc/SuSE-release ]; then
    RPM="SUSE"
  fi
}

get_package_version_RPM() {
  rpm_flavour
  if [ "$RPM" = "RHEL" ]; then
    yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'
  elif [ "$RPM" = "FEDORA" ]; then
    dnf info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'
  elif [ "$RPM" = "SUSE" ]; then
    zypper info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'
  fi
}

check_package_RPM() {
  rpm_flavour
  if [ "$RPM" = "RHEL" ]; then
    r=`yum info $1 | grep -c 'Summary'`
  elif [ "$RPM" = "FEDORA" ]; then
    r=`dnf info $1 | grep -c 'Summary'`
  elif [ "$RPM" = "SUSE" ]; then
    r=`zypper info $1 | grep -c 'Summary'`
  fi

  if [ $r -ge 1 ]; then
    return 0
  else
    return 1
  fi
}

check_package_version_match_RPM() {
  v=`get_package_version_RPM $1`

  if [ -z "$v" ]; then
    return 1
  fi

  version_match $v $2
  return $?
}

check_package_version_ge_RPM() {
  v=`get_package_version_RPM $1`

  if [ -z "$v" ]; then
    return 1
  fi

  version_ge $v $2
  return $?
}

check_package_version_ge_lt_RPM() {
  v=`get_package_version_RPM $1`

  if [ -z "$v" ]; then
    return 1
  fi

  version_ge_lt $v $2 $3
  return $?
}

install_packages_RPM() {
  rpm_flavour
  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to install $@, you'll have to do it yourself..."
  fi
  if [ "$RPM" = "RHEL" ]; then
    $SUDO yum install -y $@
    if [ $? -ge 1 ]; then
      ERROR "yum failed to install requested packages, exiting."
      exit 1
    fi

  elif [ "$RPM" = "FEDORA" ]; then
    $SUDO dnf install -y $@
    if [ $? -ge 1 ]; then
      ERROR "dnf failed to install requested packages, exiting."
      exit 1
    fi

  elif [ "$RPM" = "SUSE" ]; then
    $SUDO zypper --non-interactive install --auto-agree-with-licenses $@
    if [ $? -ge 1 ]; then
      ERROR "zypper failed to install requested packages, exiting."
      exit 1
    fi
  fi
}

install_RPM() {
  PRINT ""
  INFO "Installing dependencies for RPM-based distribution"
  PRINT ""
  PRINT "`eval _echo "$COMMON_INFO"`"
  PRINT ""

  if [ "$NO_CONFIRM" = false ]; then
    read -p "Do you want to continue (Y/n)?"
    [ "$(echo ${REPLY:=Y} | tr [:upper:] [:lower:])" != "y" ] && exit
  fi

  # Enable non-free repositories for all flavours
  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to install third party repositories, you'll have to do it yourself..."
  else
    rpm_flavour
    if [ "$RPM" = "FEDORA" ]; then
      _fedora_rel="`egrep "[0-9]{1,}" /etc/fedora-release -o`"
      $SUDO dnf -y install --nogpgcheck \
      http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$_fedora_rel.noarch.rpm \
      http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$_fedora_rel.noarch.rpm

      $SUDO dnf -y update

    elif [ "$RPM" = "RHEL" ]; then
      if [ "`grep '[^.]6\.' /etc/redhat-release`" ]; then
        ERROR "Building with GCC 4.4 is not supported!"
        exit 1
      else
        $SUDO yum -y install --nogpgcheck \
        http://download.fedoraproject.org/pub/epel/7/$(uname -i)/e/epel-release-7-6.noarch.rpm \
        http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

        $SUDO yum -y update
      fi

    elif [ "$RPM" = "SUSE" ]; then
      # Packman repo now includes name in link...
      _suse_rel="`grep -w VERSION /etc/os-release | sed 's/[^0-9.]*//g'`"
      _suse_name="`grep -w NAME /etc/os-release | gawk '{print $2}' | sed 's/\"//'`"
      if [ $_suse_name ]; then
        _suse_rel="${_suse_name}_${_suse_rel}"
      fi

      PRINT ""
      INFO "About to add 'packman' repository from http://packman.inode.at/suse/openSUSE_$_suse_rel/"
      INFO "This is only needed if you do not already have a packman repository enabled..."
      read -p "Do you want to add this repo (Y/n)?"
      if [ "$(echo ${REPLY:=Y} | tr [:upper:] [:lower:])" == "y" ]; then
        INFO "    Installing packman..."
        $SUDO zypper ar -f -n packman http://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_$_suse_rel/ packman
        INFO "    Done."
      else
        INFO "    Skipping packman installation."
      fi
      $SUDO zypper --non-interactive --gpg-auto-import-keys update --auto-agree-with-licenses
    fi
  fi

  # These libs should always be available in fedora/suse official repository...
  OPENJPEG_DEV="openjpeg2-devel"
  VORBIS_DEV="libvorbis-devel"
  OGG_DEV="libogg-devel"
  THEORA_DEV="libtheora-devel"

  _packages="gcc gcc-c++ git make cmake tar bzip2 xz findutils flex bison fontconfig-devel \
             libtiff-devel libjpeg-devel libpng-devel sqlite-devel fftw-devel SDL2-devel \
             libX11-devel libXi-devel libXcursor-devel libXrandr-devel libXinerama-devel \
             wget ncurses-devel readline-devel $OPENJPEG_DEV openal-soft-devel \
             glew-devel yasm $THEORA_DEV $VORBIS_DEV $OGG_DEV patch \
             libxml2-devel yaml-cpp-devel tinyxml-devel jemalloc-devel \
             gmp-devel pugixml-devel potrace-devel libharu-devel"

  OPENJPEG_USE=true
  VORBIS_USE=true
  OGG_USE=true
  THEORA_USE=true

  if [ "$RPM" = "FEDORA" -o "$RPM" = "RHEL" ]; then
    _packages="$_packages freetype-devel"

    if [ "$WITH_JACK" = true ]; then
      _packages="$_packages jack-audio-connection-kit-devel"
    fi

    if [ "$WITH_PULSEAUDIO" = true ]; then
      _packages="$_packages pulseaudio-libs-devel"
    fi

    PRINT ""
    install_packages_RPM $_packages

    PRINT ""
    X264_DEV="x264-devel"
    check_package_version_ge_RPM $X264_DEV $X264_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_RPM $X264_DEV
      X264_USE=true
    fi

    if [ "$WITH_ALL" = true ]; then
      PRINT ""
      XVID_DEV="xvidcore-devel"
      check_package_RPM $XVID_DEV
      if [ $? -eq 0 ]; then
        install_packages_RPM $XVID_DEV
        XVID_USE=true
      fi

      PRINT ""
      MP3LAME_DEV="lame-devel"
      check_package_RPM $MP3LAME_DEV
      if [ $? -eq 0 ]; then
        install_packages_RPM $MP3LAME_DEV
        MP3LAME_USE=true
      fi
    fi

  elif [ "$RPM" = "SUSE" ]; then
    _packages="$_packages freetype2-devel"

    PRINT ""
    install_packages_RPM $_packages

    PRINT ""
    X264_DEV="libx264-devel"
    check_package_version_ge_RPM $X264_DEV $X264_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_RPM $X264_DEV
      X264_USE=true
    fi

    if [ "$WITH_PULSEAUDIO" = true ]; then
      _packages="$_packages libpulse-devel"
    fi

    if [ "$WITH_ALL" = true ]; then
      PRINT ""
      XVID_DEV="libxvidcore-devel"
      check_package_RPM $XVID_DEV
      if [ $? -eq 0 ]; then
        install_packages_RPM $XVID_DEV
        XVID_USE=true
      fi

      PRINT ""
      MP3LAME_DEV="libmp3lame-devel"
      check_package_RPM $MP3LAME_DEV
      if [ $? -eq 0 ]; then
        install_packages_RPM $MP3LAME_DEV
        MP3LAME_USE=true
      fi
    fi
  fi

  PRINT""
  LIBSNDFILE_DEV="libsndfile-devel"
  check_package_RPM $LIBSNDFILE_DEV
  if [ $? -eq 0 ]; then
    install_packages_RPM $LIBSNDFILE_DEV
  fi

  if [ "$WITH_ALL" = true ]; then
    PRINT ""
    VPX_DEV="libvpx-devel"
    check_package_version_ge_RPM $VPX_DEV $VPX_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_RPM $VPX_DEV
      VPX_USE=true
    fi

    PRINT ""
    install_packages_RPM libspnav-devel

    PRINT ""
    OPUS_DEV="libopus-devel"
    check_package_version_ge_RPM $OPUS_DEV $OPUS_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_RPM $OPUS_DEV
      OPUS_USE=true
    fi
  fi

  PRINT ""
  CLANG_FORMAT="clang"  # Yeah, on fedora/suse clang-format is part of main clang package...
  check_package_version_ge_RPM $CLANG_FORMAT $CLANG_FORMAT_VERSION_MIN
  if [ $? -eq 0 ]; then
    install_packages_RPM $CLANG_FORMAT
  else
    PRINT ""
    WARNING "clang-format $CLANG_FORMAT_VERSION_MIN or higher not found, this is NOT needed to get Blender compiling..."
    PRINT ""
  fi

  PRINT ""
  _do_compile_python=false
  if [ "$PYTHON_SKIP" = true ]; then
    WARNING "Skipping Python installation, as requested..."
  elif [ "$PYTHON_FORCE_BUILD" = true ]; then
    INFO "Forced Python building, as requested..."
    _do_compile_python=true
  else
    check_package_version_ge_lt_RPM python3-devel $PYTHON_VERSION_MIN $PYTHON_VERSION_MAX
    if [ $? -eq 0 ]; then
      PYTHON_VERSION_INSTALLED=$(echo `get_package_version_RPM python3-devel` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/')

      install_packages_RPM python3-devel
      clean_Python

      for module in "${PYTHON_MODULES_PACKAGES[@]}"
      do
        module=($module)
        package="python3-${module[0]}"
        package_vmin=${module[1]}
        package_vmax=${module[2]}
        check_package_version_ge_lt_RPM "$package" $package_vmin $package_vmax
        if [ $? -eq 0 ]; then
          install_packages_RPM "$package"
        else
          WARNING "Sorry, using python package but no valid $package package available!" \
                  "    Use --build-python to force building of Python and use pip to get the packages."
        fi
      done
    else
      _do_compile_python=true
    fi
  fi

  if [ "$_do_compile_python" = true ]; then
    install_packages_RPM libffi-devel
    compile_Python
  fi


  PRINT ""
  _do_compile_boost=false
  if [ "$BOOST_SKIP" = true ]; then
    WARNING "Skipping Boost installation, as requested..."
  elif [ "$BOOST_FORCE_BUILD" = true ]; then
    INFO "Forced Boost building, as requested..."
    _do_compile_boost=true
  else
    check_package_version_ge_lt_RPM boost-devel $BOOST_VERSION_MIN $BOOST_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_RPM boost-devel
      clean_Boost
    else
      _do_compile_boost=true
    fi
  fi

  if [ "$_do_compile_boost" = true ]; then
    if [ "$RPM" = "SUSE" ]; then
      install_packages_RPM gcc-fortran
    else
      install_packages_RPM libquadmath-devel bzip2-devel
    fi
    PRINT ""
    compile_Boost
  fi


  PRINT ""
  if [ "$TBB_SKIP" = true ]; then
    WARNING "Skipping TBB installation, as requested..."
  elif [ "$TBB_FORCE_BUILD" = true ]; then
    INFO "Forced TBB building, as requested..."
    compile_TBB
  else
    check_package_version_ge_lt_RPM tbb-devel $TBB_VERSION_MIN $TBB_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_RPM tbb-devel
      clean_TBB
    else
      compile_TBB
    fi
  fi


  PRINT ""
  if [ "$OCIO_SKIP" = true ]; then
    WARNING "Skipping OpenColorIO installation, as requested..."
  elif [ "$OCIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenColorIO building, as requested..."
    compile_OCIO
  else
    if [ "$RPM" = "SUSE" ]; then
      check_package_version_ge_lt_RPM OpenColorIO-devel $OCIO_VERSION_MIN $OCIO_VERSION_MAX
      if [ $? -eq 0 ]; then
        install_packages_RPM OpenColorIO-devel
        clean_OCIO
      else
        compile_OCIO
      fi
    # XXX Fedora/RHEL OCIO still depends on libyaml-cpp v0.3 even when system default is v0.5!
    else
      compile_OCIO
    fi
  fi

  PRINT ""
  if [ "$OPENEXR_SKIP" = true ]; then
    WARNING "Skipping ILMBase/OpenEXR installation, as requested..."
  elif [ "$OPENEXR_FORCE_BUILD" = true ]; then
    INFO "Forced ILMBase/OpenEXR building, as requested..."
    compile_OPENEXR
  else
    check_package_version_ge_lt_RPM openexr-devel $OPENEXR_VERSION_MIN $OPENEXR_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_RPM openexr-devel
      OPENEXR_VERSION=`get_package_version_RPM openexr-devel`
      ILMBASE_VERSION=$OPENEXR_VERSION
      clean_OPENEXR
    else
      compile_OPENEXR
    fi
  fi

  PRINT ""
  if [ "$OIIO_SKIP" = true ]; then
    WARNING "Skipping OpenImageIO installation, as requested..."
  elif [ "$OIIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenImageIO building, as requested..."
    compile_OIIO
  else
    check_package_version_ge_lt_RPM OpenImageIO-devel $OIIO_VERSION_MIN $OIIO_VERSION_MAX
    if [ $? -eq 0 -a $_with_built_openexr == false ]; then
      install_packages_RPM OpenImageIO-devel OpenImageIO-utils
      clean_OIIO
    else
      compile_OIIO
    fi
  fi


  PRINT ""
  have_llvm=false
  _do_compile_llvm=false
  if [ "$LLVM_SKIP" = true ]; then
    WARNING "Skipping LLVM installation, as requested (this also implies skipping OSL!)..."
    OSL_SKIP=true
  elif [ "$LLVM_FORCE_BUILD" = true ]; then
    INFO "Forced LLVM building, as requested..."
    _do_compile_llvm=true
  else
    if [ "$RPM" = "SUSE" ]; then
      CLANG_DEV="llvm-clang-devel"
    else
      CLANG_DEV="clang-devel"
    fi
    check_package_version_ge_lt_RPM llvm-devel $LLVM_VERSION_MIN $LLVM_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_RPM llvm-devel $CLANG_DEV
      have_llvm=true
      LLVM_VERSION=`llvm-config --version`
      LLVM_VERSION_FOUND=$LLVM_VERSION
      clean_LLVM
    else
      _do_compile_llvm=true
    fi
  fi

  if [ "$_do_compile_llvm" = true ]; then
    install_packages_RPM libffi-devel
    # LLVM can't find the fedora ffi header dir...
    _FFI_INCLUDE_DIR=`rpm -ql libffi-devel | grep -e ".*/ffi.h" | sed -r 's/(.*)\/ffi.h/\1/'`
    PRINT ""
    compile_LLVM
    have_llvm=true
    LLVM_VERSION_FOUND=$LLVM_VERSION
  fi


  PRINT ""
  _do_compile_osl=false
  if [ "$OSL_SKIP" = true ]; then
    WARNING "Skipping OpenShadingLanguage installation, as requested..."
  elif [ "$OSL_FORCE_BUILD" = true ]; then
    INFO "Forced OpenShadingLanguage building, as requested..."
    _do_compile_osl=true
  else
    if [ "$RPM" = "SUSE" ]; then
      OSL_DEV="OpenShadingLanguage-devel"
    else
      OSL_DEV="openshadinglanguage-devel"
    fi
    check_package_version_ge_lt_RPM $OSL_DEV $OSL_VERSION_MIN $OSL_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_RPM $OSL_DEV
      clean_OSL
    else
      _do_compile_osl=true
    fi
  fi

  if [ "$_do_compile_osl" = true ]; then
    if [ "$have_llvm" = true ]; then
      PRINT ""
      compile_OSL
    else
      WARNING "No LLVM available, cannot build OSL!"
    fi
  fi


  PRINT ""
  if [ "$OSD_SKIP" = true ]; then
    WARNING "Skipping OpenSubdiv installation, as requested..."
  elif [ "$OSD_FORCE_BUILD" = true ]; then
    INFO "Forced OpenSubdiv building, as requested..."
    compile_OSD
  else
    # No package currently!
    compile_OSD
  fi


  PRINT ""
  if [ "$OPENVDB_SKIP" = true ]; then
    WARNING "Skipping OpenVDB installation, as requested..."
  elif [ "$OPENVDB_FORCE_BUILD" = true ]; then
    INFO "Forced OpenVDB building, as requested..."
    compile_OPENVDB
  else
    # No package currently!
    compile_OPENVDB
  fi

  PRINT ""
  if [ "$ALEMBIC_SKIP" = true ]; then
    WARNING "Skipping Alembic installation, as requested..."
  elif [ "$ALEMBIC_FORCE_BUILD" = true ]; then
    INFO "Forced Alembic building, as requested..."
    compile_ALEMBIC
  else
    # No package currently!
    compile_ALEMBIC
  fi

  PRINT ""
  if [ "$USD_SKIP" = true ]; then
    WARNING "Skipping USD installation, as requested..."
  elif [ "$USD_FORCE_BUILD" = true ]; then
    INFO "Forced USD building, as requested..."
    compile_USD
  else
    compile_USD
  fi

  if [ "$WITH_OPENCOLLADA" = true ]; then
    PRINT ""
    _do_compile_collada=false
    if [ "$OPENCOLLADA_SKIP" = true ]; then
      WARNING "Skipping OpenCOLLADA installation, as requested..."
    elif [ "$OPENCOLLADA_FORCE_BUILD" = true ]; then
      INFO "Forced OpenCollada building, as requested..."
      _do_compile_collada=true
    else
      # No package...
      _do_compile_collada=true
    fi

    if [ "$_do_compile_collada" = true ]; then
      install_packages_RPM pcre-devel
      # Find path to libxml shared lib...
      _XML2_LIB=`rpm -ql libxml2-devel | grep -e ".*/libxml2.so"`
      PRINT ""
      compile_OpenCOLLADA
    fi
  fi

  if [ "$WITH_EMBREE" = true ]; then
    PRINT ""
    _do_compile_embree=false
    if [ "$OPENCOLLADA_SKIP" = true ]; then
      WARNING "Skipping Embree installation, as requested..."
    elif [ "$EMBREE_FORCE_BUILD" = true ]; then
      INFO "Forced Embree building, as requested..."
      _do_compile_embree=true
    else
      # There is a package, but it does not provide everything that Blender needs...
      #~ check_package_version_ge_lt_RPM embree-devel $EMBREE_VERSION_MIN $EMBREE_VERSION_MAX
      #~ if [ $? -eq 0 ]; then
        #~ install_packages_RPM embree-devel
        #~ clean_Embree
      #~ else
        _do_compile_embree=true
      #~ fi
    fi

    if [ "$_do_compile_embree" = true ]; then
      compile_Embree
    fi
  fi

  if [ "$WITH_OIDN" = true ]; then
    _do_compile_oidn=false
    PRINT ""
    if [ "$OIDN_SKIP" = true ]; then
      WARNING "Skipping OpenImgeDenoise installation, as requested..."
    elif [ "$OIDN_FORCE_BUILD" = true ]; then
      INFO "Forced OpenImageDenoise building, as requested..."
      _do_compile_oidn=true
    else
      # No package currently!
      _do_compile_oidn=true
    fi

    if [ "$_do_compile_oidn" = true ]; then
      compile_OIDN
    fi
  fi

  PRINT ""
  if [ "$FFMPEG_SKIP" = true ]; then
    WARNING "Skipping FFMpeg installation, as requested..."
  elif [ "$FFMPEG_FORCE_BUILD" = true ]; then
    INFO "Forced FFMpeg building, as requested..."
    compile_FFmpeg
  else
    check_package_version_ge_lt_RPM ffmpeg-devel $FFMPEG_VERSION_MIN $FFMPEG_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_RPM ffmpeg ffmpeg-devel
      clean_FFmpeg
    else
      compile_FFmpeg
    fi
  fi

  PRINT ""
  if [ "$XR_OPENXR_SKIP" = true ]; then
    WARNING "Skipping OpenXR-SDK installation, as requested..."
  elif [ "$XR_OPENXR_FORCE_BUILD" = true ]; then
    INFO "Forced OpenXR-SDK building, as requested..."
    compile_XR_OpenXR_SDK
  else
    # No package currently!
    compile_XR_OpenXR_SDK
  fi
}


# ----------------------------------------------------------------------------
# Install on ARCH-like

get_package_version_ARCH() {
  pacman -Si $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+?(([0-9]+\.?)+).*/\1/'
}

check_package_ARCH() {
  r=`pacman -Si $1 | grep -c 'Description'`

  if [ $r -ge 1 ]; then
    return 0
  else
    return 1
  fi
}

check_package_version_match_ARCH() {
  v=`get_package_version_ARCH $1`

  if [ -z "$v" ]; then
    return 1
  fi

  version_match $v $2
  return $?
}

check_package_version_ge_ARCH() {
  v=`get_package_version_ARCH $1`

  if [ -z "$v" ]; then
    return 1
  fi

  version_ge $v $2
  return $?
}

check_package_version_ge_lt_ARCH() {
  v=`get_package_version_ARCH $1`

  if [ -z "$v" ]; then
    return 1
  fi

  version_ge_lt $v $2 $3
  return $?
}

install_packages_ARCH() {
  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to run pacman for $@, you'll have to do it yourself..."
  else
    $SUDO pacman -S --needed --noconfirm $@
    if [ $? -ge 1 ]; then
      ERROR "pacman failed to install requested packages, exiting."
      exit 1
    fi
  fi
}

install_ARCH() {
  PRINT ""
  INFO "Installing dependencies for ARCH-based distribution"
  PRINT ""
  PRINT "`eval _echo "$COMMON_INFO"`"
  PRINT ""

  if [ "$NO_CONFIRM" = false ]; then
    read -p "Do you want to continue (Y/n)?"
    [ "$(echo ${REPLY:=Y} | tr [:upper:] [:lower:])" != "y" ] && exit
  fi

  # Check for sudo...
  if [ $SUDO ]; then
    if [ ! -x "/usr/bin/sudo" ]; then
      PRINT ""
      ERROR "This script requires sudo but it is not installed."
      PRINT "Please setup sudo according to:"
      PRINT "https://wiki.archlinux.org/index.php/Sudo"
      PRINT "and try again."
      PRINT ""
      exit
    fi
  fi

  if [ ! $SUDO ]; then
    WARNING "--no-sudo enabled, impossible to run pacman -Sy, you'll have to do it yourself..."
  else
    $SUDO pacman -Sy
  fi

  # These libs should always be available in arch official repository...
  OPENJPEG_DEV="openjpeg2"
  VORBIS_DEV="libvorbis"
  OGG_DEV="libogg"
  THEORA_DEV="libtheora"

  BASE_DEVEL="base-devel"

  # Avoid conflicts when gcc-multilib is installed
  pacman -Qi gcc-multilib &>/dev/null
  if [ $? -eq 0 ]; then
    BASE_DEVEL=`pacman -Sgq base-devel | sed -e 's/^gcc$/gcc-multilib/g' | paste -s -d' '`
  fi

  _packages="$BASE_DEVEL git cmake fontconfig \
             libxi libxcursor libxrandr libxinerama glew libpng libtiff wget openal \
             $OPENJPEG_DEV $VORBIS_DEV $OGG_DEV $THEORA_DEV yasm sdl2 fftw \
             libxml2 yaml-cpp tinyxml python-requests jemalloc gmp potrace pugixml libharu"

  OPENJPEG_USE=true
  VORBIS_USE=true
  OGG_USE=true
  THEORA_USE=true

  if [ "$WITH_ALL" = true ]; then
    _packages="$_packages libspnav"
  fi

  if [ "$WITH_JACK" = true ]; then
    _packages="$_packages jack2"
  fi

  if [ "$WITH_PULSEAUDIO" = true ]; then
    _packages="$_packages libpulse"
  fi

  PRINT ""
  install_packages_ARCH $_packages

  PRINT""
  LIBSNDFILE_DEV="libsndfile"
  check_package_ARCH $LIBSNDFILE_DEV
  if [ $? -eq 0 ]; then
    install_packages_ARCH $LIBSNDFILE_DEV
  fi

  PRINT ""
  X264_DEV="x264"
  check_package_version_ge_ARCH $X264_DEV $X264_VERSION_MIN
  if [ $? -eq 0 ]; then
    install_packages_ARCH $X264_DEV
    X264_USE=true
  fi

  if [ "$WITH_ALL" = true ]; then
    PRINT ""
    XVID_DEV="xvidcore"
    check_package_ARCH $XVID_DEV
    if [ $? -eq 0 ]; then
      install_packages_ARCH $XVID_DEV
      XVID_USE=true
    fi

    PRINT ""
    MP3LAME_DEV="lame"
    check_package_ARCH $MP3LAME_DEV
    if [ $? -eq 0 ]; then
      install_packages_ARCH $MP3LAME_DEV
      MP3LAME_USE=true
    fi

    PRINT ""
    VPX_DEV="libvpx"
    check_package_version_ge_ARCH $VPX_DEV $VPX_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_ARCH $VPX_DEV
      VPX_USE=true
    fi

    PRINT ""
    OPUS_DEV="opus"
    check_package_version_ge_ARCH $OPUS_DEV $OPUS_VERSION_MIN
    if [ $? -eq 0 ]; then
      install_packages_ARCH $OPUS_DEV
      OPUS_USE=true
    fi
  fi


  PRINT ""
  CLANG_FORMAT="clang"  # Yeah, on arch clang-format is part of main clang package...
  check_package_version_ge_ARCH $CLANG_FORMAT $CLANG_FORMAT_VERSION_MIN
  if [ $? -eq 0 ]; then
    install_packages_ARCH $CLANG_FORMAT
  else
    PRINT ""
    WARNING "clang-format $CLANG_FORMAT_VERSION_MIN or higher not found, this is NOT needed to get Blender compiling..."
    PRINT ""
  fi


  PRINT ""
  _do_compile_python=false
  if [ "$PYTHON_SKIP" = true ]; then
    WARNING "Skipping Python installation, as requested..."
  elif [ "$PYTHON_FORCE_BUILD" = true ]; then
    INFO "Forced Python building, as requested..."
    _do_compile_python=true
  else
    check_package_version_ge_lt_ARCH python $PYTHON_VERSION_MIN $PYTHON_VERSION_MAX
    if [ $? -eq 0 ]; then
      PYTHON_VERSION_INSTALLED=$(echo `get_package_version_ARCH python` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/')

      install_packages_ARCH python
      clean_Python
      PRINT ""

      for module in "${PYTHON_MODULES_PACKAGES[@]}"
      do
        module=($module)
        package="python-${module[0]}"
        package_vmin=${module[1]}
        package_vmax=${module[2]}
        check_package_version_ge_lt_ARCH "$package" $package_vmin $package_vmax
        if [ $? -eq 0 ]; then
          install_packages_ARCH "$package"
        else
          WARNING "Sorry, using python package but no valid $package package available!" \
                  "    Use --build-python to force building of Python and use pip to get the packages."
        fi
      done
    else
      _do_compile_python=true
    fi
  fi

  if [ "$_do_compile_python" = true ]; then
    install_packages_ARCH libffi
    compile_Python
  fi


  PRINT ""
  if [ "$BOOST_SKIP" = true ]; then
    WARNING "Skipping Boost installation, as requested..."
  elif [ "$BOOST_FORCE_BUILD" = true ]; then
    INFO "Forced Boost building, as requested..."
    compile_Boost
  else
    check_package_version_ge_lt_ARCH boost $BOOST_VERSION_MIN $BOOST_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH boost
      clean_Boost
    else
      compile_Boost
    fi
  fi


  PRINT ""
  if [ "$TBB_SKIP" = true ]; then
    WARNING "Skipping TBB installation, as requested..."
  elif [ "$TBB_FORCE_BUILD" = true ]; then
    INFO "Forced TBB building, as requested..."
    compile_TBB
  else
    check_package_version_ge_lt_ARCH intel-tbb $TBB_VERSION_MIN $TBB_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH intel-tbb
      clean_TBB
    else
      compile_TBB
    fi
  fi


  PRINT ""
  if [ "$OCIO_SKIP" = true ]; then
    WARNING "Skipping OpenColorIO installation, as requested..."
  elif [ "$OCIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenColorIO building, as requested..."
    compile_OCIO
  else
    check_package_version_ge_lt_ARCH opencolorio $OCIO_VERSION_MIN $OCIO_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH opencolorio
      clean_OCIO
    else
      compile_OCIO
    fi
  fi


  PRINT ""
  if [ "$OPENEXR_SKIP" = true ]; then
    WARNING "Skipping ILMBase/OpenEXR installation, as requested..."
  elif [ "$OPENEXR_FORCE_BUILD" = true ]; then
    INFO "Forced ILMBase/OpenEXR building, as requested..."
    compile_OPENEXR
  else
    check_package_version_ge_lt_ARCH openexr $OPENEXR_VERSION_MIN $OPENEXR_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH openexr
      OPENEXR_VERSION=`get_package_version_ARCH openexr`
      ILMBASE_VERSION=$OPENEXR_VERSION
      clean_OPENEXR
    else
      compile_OPENEXR
    fi
  fi


  PRINT ""
  if [ "$OIIO_SKIP" = true ]; then
    WARNING "Skipping OpenImageIO installation, as requested..."
  elif [ "$OIIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenImageIO building, as requested..."
    compile_OIIO
  else
    check_package_version_ge_lt_ARCH openimageio $OIIO_VERSION_MIN $OIIO_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH openimageio
      clean_OIIO
    else
      compile_OIIO
    fi
  fi


  PRINT ""
  have_llvm=false
  _do_compile_llvm=false
  if [ "$LLVM_SKIP" = true ]; then
    WARNING "Skipping LLVM installation, as requested (this also implies skipping OSL!)..."
    OSL_SKIP=true
  elif [ "$LLVM_FORCE_BUILD" = true ]; then
    INFO "Forced LLVM building, as requested..."
    _do_compile_llvm=true
  else
    check_package_version_ge_lt_ARCH llvm $LLVM_VERSION_MIN $LLVM_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH llvm clang
      have_llvm=true
      LLVM_VERSION=`llvm-config --version`
      LLVM_VERSION_FOUND=$LLVM_VERSION
      clean_LLVM
    else
      _do_compile_llvm=true
    fi
  fi

  if [ "$_do_compile_llvm" = true ]; then
    install_packages_ARCH libffi
    # LLVM can't find the arch ffi header dir...
    _FFI_INCLUDE_DIR=`pacman -Ql libffi | grep -e ".*/ffi.h" | awk '{print $2}' | sed -r 's/(.*)\/ffi.h/\1/'`
    PRINT ""
    compile_LLVM
    have_llvm=true
    LLVM_VERSION_FOUND=$LLVM_VERSION
  fi


  PRINT ""
  _do_compile_osl=false
  if [ "$OSL_SKIP" = true ]; then
    WARNING "Skipping OpenShadingLanguage installation, as requested..."
  elif [ "$OSL_FORCE_BUILD" = true ]; then
    INFO "Forced OpenShadingLanguage building, as requested..."
    _do_compile_osl=true
  else
    check_package_version_ge_lt_ARCH openshadinglanguage $OSL_VERSION_MIN $OSL_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH openshadinglanguage
      clean_OSL
    else
      _do_compile_osl=true
    fi
  fi

  if [ "$_do_compile_osl" = true ]; then
    if [ "$have_llvm" = true ]; then
      PRINT ""
      compile_OSL
    else
      WARNING "No LLVM available, cannot build OSL!"
    fi
  fi


  PRINT ""
  if [ "$OSD_SKIP" = true ]; then
    WARNING "Skipping OpenSubdiv installation, as requested..."
  elif [ "$OSD_FORCE_BUILD" = true ]; then
    INFO "Forced OpenSubdiv building, as requested..."
    compile_OSD
  else
    check_package_version_ge_lt_ARCH opensubdiv $OSD_VERSION_MIN $OSD_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH opensubdiv
      clean_OSD
    else
      compile_OSD
    fi
  fi


  PRINT ""
  if [ "$OPENVDB_SKIP" = true ]; then
    WARNING "Skipping OpenVDB installation, as requested..."
  elif [ "$OPENVDB_FORCE_BUILD" = true ]; then
    INFO "Forced OpenVDB building, as requested..."
    compile_OPENVDB
  else
    check_package_version_ge_lt_ARCH openvdb $OPENVDB_VERSION_MIN $OPENVDB_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH openvdb
      clean_OPENVDB
    else
      compile_OPENVDB
    fi
  fi

  PRINT ""
  if [ "$ALEMBIC_SKIP" = true ]; then
    WARNING "Skipping Alembic installation, as requested..."
  elif [ "$ALEMBIC_FORCE_BUILD" = true ]; then
    INFO "Forced Alembic building, as requested..."
    compile_ALEMBIC
  else
    compile_ALEMBIC
  fi

  PRINT ""
  if [ "$USD_SKIP" = true ]; then
    WARNING "Skipping USD installation, as requested..."
  elif [ "$USD_FORCE_BUILD" = true ]; then
    INFO "Forced USD building, as requested..."
    compile_USD
  else
    compile_USD
  fi

  if [ "$WITH_OPENCOLLADA" = true ]; then
    PRINT ""
    _do_compile_collada=false
    if [ "$OPENCOLLADA_SKIP" = true ]; then
      WARNING "Skipping OpenCOLLADA installation, as requested..."
    elif [ "$OPENCOLLADA_FORCE_BUILD" = true ]; then
      INFO "Forced OpenCollada building, as requested..."
      _do_compile_collada=true
    else
      check_package_ARCH opencollada
      if [ $? -eq 0 ]; then
        install_packages_ARCH opencollada
        clean_OpenCOLLADA
      else
        _do_compile_collada=true
      fi
    fi

    if [ "$_do_compile_collada" = true ]; then
      install_packages_ARCH pcre
      # Find path to libxml shared lib...
      _XML2_LIB=`pacman -Ql libxml2 | grep -e ".*/libxml2.so$" | gawk '{print $2}'`
      PRINT ""
      compile_OpenCOLLADA
    fi
  fi

  if [ "$WITH_EMBREE" = true ]; then
    PRINT ""
    _do_compile_embree=false
    if [ "$EMBREE_SKIP" = true ]; then
      WARNING "Skipping Embree installation, as requested..."
    elif [ "$EMBREE_FORCE_BUILD" = true ]; then
      INFO "Forced Embree building, as requested..."
      _do_compile_embree=true
    else
      # There is a package, but it does not provide everything that Blender needs...
      #~ check_package_version_ge_lt_ARCH embree $EMBREE_VERSION_MIN $EMBREE_VERSION_MAX
      #~ if [ $? -eq 0 ]; then
        #~ install_packages_ARCH embree
        #~ clean_Embree
      #~ else
        _do_compile_embree=true
      #~ fi
    fi

    if [ "$_do_compile_embree" = true ]; then
      compile_Embree
    fi
  fi

  if [ "$WITH_OIDN" = true ]; then
    _do_compile_oidn=false
    PRINT ""
    if [ "$OIDN_SKIP" = true ]; then
      WARNING "Skipping OpenImgeDenoise installation, as requested..."
    elif [ "$OIDN_FORCE_BUILD" = true ]; then
      INFO "Forced OpenImageDenoise building, as requested..."
      _do_compile_oidn=true
    else
      # No package currently!
      _do_compile_oidn=true
    fi

    if [ "$_do_compile_oidn" = true ]; then
      compile_OIDN
    fi
  fi

  PRINT ""
  if [ "$FFMPEG_SKIP" = true ]; then
    WARNING "Skipping FFMpeg installation, as requested..."
  elif [ "$FFMPEG_FORCE_BUILD" = true ]; then
    INFO "Forced FFMpeg building, as requested..."
    compile_FFmpeg
  else
    check_package_version_ge_lt_ARCH ffmpeg $FFMPEG_VERSION_MIN $FFMPEG_VERSION_MAX
    if [ $? -eq 0 ]; then
      install_packages_ARCH ffmpeg
      clean_FFmpeg
    else
      compile_FFmpeg
    fi
  fi

  PRINT ""
  if [ "$XR_OPENXR_SKIP" = true ]; then
    WARNING "Skipping OpenXR-SDK installation, as requested..."
  elif [ "$XR_OPENXR_FORCE_BUILD" = true ]; then
    INFO "Forced OpenXR-SDK building, as requested..."
    compile_XR_OpenXR_SDK
  else
    # No package currently!
    compile_XR_OpenXR_SDK
  fi
}


# ----------------------------------------------------------------------------
# Install on other distro (very limited!)

install_OTHER() {
  PRINT ""
  WARNING "Attempt to build main dependencies for other linux distributions."
  PRINT ""
  PRINT "`eval _echo "$COMMON_INFO"`"
  PRINT ""

  ERROR "Failed to detect distribution type."
  PRINT ""
  PRINT "Your distribution is not supported by this script, you'll have to install dependencies and"
  PRINT "dev packages yourself. However, this script can still attempt to build main (complex) libraries for you,"
  PRINT "if you use '--build-foo' options (you can try '--build-all' one first)."
  PRINT ""
  PRINT "Quite obviously, it assumes dependencies from those libraries are already available, otherwise please"
  PRINT "install them (you can also use error messages printed out by build process to find missing libraries...)."
  PRINT ""
  PRINT "`eval _echo "$DEPS_COMMON_INFO"`"
  PRINT ""
  PRINT "`eval _echo "$DEPS_SPECIFIC_INFO"`"
  PRINT ""

  if [ "$NO_CONFIRM" = false ]; then
    read -p "Do you want to continue (Y/n)?"
    [ "$(echo ${REPLY:=Y} | tr [:upper:] [:lower:])" != "y" ] && exit
  fi

  PRINT ""
  if [ "$PYTHON_SKIP" = true ]; then
    WARNING "Skipping Python installation, as requested..."
  elif [ "$PYTHON_FORCE_BUILD" = true ]; then
    INFO "Forced Python building, as requested..."
    compile_Python
  fi


  PRINT ""
  if [ "$BOOST_SKIP" = true ]; then
    WARNING "Skipping Boost installation, as requested..."
  elif [ "$BOOST_FORCE_BUILD" = true ]; then
    INFO "Forced Boost building, as requested..."
    compile_Boost
  fi


  PRINT ""
  if [ "$TBB_SKIP" = true ]; then
    WARNING "Skipping TBB installation, as requested..."
  elif [ "$TBB_FORCE_BUILD" = true ]; then
    INFO "Forced TBB building, as requested..."
    compile_TBB
  fi


  PRINT ""
  if [ "$OCIO_SKIP" = true ]; then
    WARNING "Skipping OpenColorIO installation, as requested..."
  elif [ "$OCIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenColorIO building, as requested..."
    compile_OCIO
  fi


  PRINT ""
  if [ "$OPENEXR_SKIP" = true ]; then
    WARNING "Skipping ILMBase/OpenEXR installation, as requested..."
  elif [ "$OPENEXR_FORCE_BUILD" = true ]; then
    INFO "Forced ILMBase/OpenEXR building, as requested..."
    compile_OPENEXR
  fi


  PRINT ""
  if [ "$OIIO_SKIP" = true ]; then
    WARNING "Skipping OpenImageIO installation, as requested..."
  elif [ "$OIIO_FORCE_BUILD" = true ]; then
    INFO "Forced OpenImageIO building, as requested..."
    compile_OIIO
  fi


  PRINT ""
  have_llvm=false
  if [ "$LLVM_SKIP" = true ]; then
    WARNING "Skipping LLVM installation, as requested (this also implies skipping OSL!)..."
  elif [ "$LLVM_FORCE_BUILD" = true ]; then
    INFO "Forced LLVM building, as requested..."
    compile_LLVM
    have_llvm=true
    LLVM_VERSION_FOUND=$LLVM_VERSION
  fi


  PRINT ""
  if [ "$OSL_SKIP" = true ]; then
    WARNING "Skipping OpenShadingLanguage installation, as requested..."
  elif [ "$OSL_FORCE_BUILD" = true ]; then
    INFO "Forced OpenShadingLanguage building, as requested..."
    if [ "$have_llvm" = true ]; then
      PRINT ""
      compile_OSL
    else
      WARNING "No LLVM available, cannot build OSL!"
    fi
  fi


  PRINT ""
  if [ "$OSD_SKIP" = true ]; then
    WARNING "Skipping OpenSubdiv installation, as requested..."
  elif [ "$OSD_FORCE_BUILD" = true ]; then
    INFO "Forced OpenSubdiv building, as requested..."
    compile_OSD
  fi


  if [ "$WITH_OPENCOLLADA" = true ]; then
    PRINT ""
    if [ "$OPENCOLLADA_SKIP" = true ]; then
      WARNING "Skipping OpenCOLLADA installation, as requested..."
    elif [ "$OPENCOLLADA_FORCE_BUILD" = true ]; then
      INFO "Forced OpenCollada building, as requested..."
      compile_OpenCOLLADA
    fi
  fi

  if [ "$WITH_EMBREE" = true ]; then
    PRINT ""
    if [ "$EMBREE_SKIP" = true ]; then
      WARNING "Skipping Embree installation, as requested..."
    elif [ "$EMBREE_FORCE_BUILD" = true ]; then
      INFO "Forced Embree building, as requested..."
      compile_Embree
    fi
  fi

  if [ "$WITH_OIDN" = true ]; then
    PRINT ""
    if [ "$OIDN_SKIP" = true ]; then
      WARNING "Skipping OpenImgeDenoise installation, as requested..."
    elif [ "$OIDN_FORCE_BUILD" = true ]; then
      INFO "Forced OpenImageDenoise building, as requested..."
      compile_OIDN
    fi
  fi

  PRINT ""
  if [ "$FFMPEG_SKIP" = true ]; then
    WARNING "Skipping FFMpeg installation, as requested..."
  elif [ "$FFMPEG_FORCE_BUILD" = true ]; then
    INFO "Forced FFMpeg building, as requested..."
    compile_FFmpeg
  fi

  PRINT ""
  if [ "$XR_OPENXR_SKIP" = true ]; then
    WARNING "Skipping OpenXR-SDK installation, as requested..."
  elif [ "$XR_OPENXR_FORCE_BUILD" = true ]; then
    INFO "Forced OpenXR-SDK building, as requested..."
    compile_XR_OpenXR_SDK
  fi
}

# ----------------------------------------------------------------------------
# Printing User Info

print_info_ffmpeglink_DEB() {
  dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
}

print_info_ffmpeglink_RPM() {
  rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
}

print_info_ffmpeglink_ARCH() {
  pacman -Ql $_packages | grep -e ".*\/lib[^\/]\+\.so$" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
}

print_info_ffmpeglink() {
  # This func must only print a ';'-separated list of libs...
  if [ -z "$DISTRO" ]; then
    ERROR "Failed to detect distribution type"
    exit 1
  fi

  # Create list of packages from which to get libs names...
  _packages=""

  if [ "$THEORA_USE" = true ]; then
    _packages="$_packages $THEORA_DEV"
  fi

  if [ "$VORBIS_USE" = true ]; then
    _packages="$_packages $VORBIS_DEV"
  fi

  if [ "$OGG_USE" = true ]; then
    _packages="$_packages $OGG_DEV"
  fi

  if [ "$XVID_USE" = true ]; then
    _packages="$_packages $XVID_DEV"
  fi

  if [ "$VPX_USE" = true ]; then
    _packages="$_packages $VPX_DEV"
  fi

  if [ "$OPUS_USE" = true ]; then
    _packages="$_packages $OPUS_DEV"
  fi

  if [ "$MP3LAME_USE" = true ]; then
    _packages="$_packages $MP3LAME_DEV"
  fi

  if [ "$X264_USE" = true ]; then
    _packages="$_packages $X264_DEV"
  fi

  if [ "$OPENJPEG_USE" = true ]; then
    _packages="$_packages $OPENJPEG_DEV"
  fi

  if [ "$DISTRO" = "DEB" ]; then
    print_info_ffmpeglink_DEB
  elif [ "$DISTRO" = "RPM" ]; then
    print_info_ffmpeglink_RPM
  elif [ "$DISTRO" = "ARCH" ]; then
    print_info_ffmpeglink_ARCH
  # XXX TODO!
  else
    PRINT "<Could not determine additional link libraries needed for ffmpeg, replace this by valid list of libs...>"
  fi
}

print_info() {
  PRINT ""
  PRINT ""
  PRINT "Ran with:"
  PRINT "    install_deps.sh $COMMANDLINE"
  PRINT ""
  PRINT ""
  PRINT "If you're using CMake add this to your configuration flags:"

  _buildargs="-U *SNDFILE* -U PYTHON* -U *BOOST* -U *Boost* -U *TBB*"
  _buildargs="$_buildargs -U *OPENCOLORIO* -U *OPENEXR* -U *OPENIMAGEIO* -U *LLVM* -U *CYCLES*"
  _buildargs="$_buildargs -U *OPENSUBDIV* -U *OPENVDB*  -U *BLOSC* -U *COLLADA* -U *FFMPEG* -U *ALEMBIC* -U *USD*"
  _buildargs="$_buildargs -U *EMBREE* -U *OPENIMAGEDENOISE* -U *OPENXR*"

  _1="-D WITH_CODEC_SNDFILE=ON"
  PRINT "  $_1"
  _buildargs="$_buildargs $_1"

  _1="-D PYTHON_VERSION=$PYTHON_VERSION_INSTALLED"
  PRINT "  $_1"
  _buildargs="$_buildargs $_1"
  if [ -d "$INST/python-$PYTHON_VERSION_INSTALLED" ]; then
    _1="-D PYTHON_ROOT_DIR=$INST/python-$PYTHON_VERSION_INSTALLED"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
  fi

  if [ -d $INST/boost ]; then
    _1="-D BOOST_ROOT=$INST/boost"
    _2="-D Boost_NO_SYSTEM_PATHS=ON"
    _3="-D Boost_NO_BOOST_CMAKE=ON"
    PRINT "  $_1"
    PRINT "  $_2"
    PRINT "  $_3"
    _buildargs="$_buildargs $_1 $_2 $_3"
  fi

  if [ -d $INST/tbb ]; then
    _1="-D TBB_ROOT_DIR=$INST/tbb"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
  fi

  if [ "$OCIO_SKIP" = false ]; then
    _1="-D WITH_OPENCOLORIO=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/ocio ]; then
      _1="-D OPENCOLORIO_ROOT_DIR=$INST/ocio"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ -d $INST/openexr ]; then
    _1="-D OPENEXR_ROOT_DIR=$INST/openexr"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
  fi

  if [ -d $INST/oiio ]; then
    _1="-D WITH_OPENIMAGEIO=ON"
    _2="-D OPENIMAGEIO_ROOT_DIR=$INST/oiio"
    PRINT "  $_1"
    PRINT "  $_2"
    _buildargs="$_buildargs $_1 $_2"
  fi

  if [ "$OSL_SKIP" = false ]; then
    _1="-D WITH_CYCLES_OSL=ON"
    _2="-D WITH_LLVM=ON"
    _3="-D LLVM_VERSION=$LLVM_VERSION_FOUND"
    PRINT "  $_1"
    PRINT "  $_2"
    PRINT "  $_3"
    _buildargs="$_buildargs $_1 $_2 $_3"
    if [ -d $INST/osl ]; then
      _1="-D OSL_ROOT_DIR=$INST/osl"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
    if [ -d $INST/llvm ]; then
      _1="-D LLVM_ROOT_DIR=$INST/llvm"
      _2="-D LLVM_STATIC=ON"
      PRINT "  $_1"
      PRINT "  $_2"
      _buildargs="$_buildargs $_1 $_2"
    fi
  else
    _1="-D WITH_CYCLES_OSL=OFF"
    _2="-D WITH_LLVM=OFF"
    PRINT "  $_1"
    PRINT "  $_2"
    _buildargs="$_buildargs $_1 $_2"
  fi

  if [ "$OSD_SKIP" = false ]; then
    _1="-D WITH_OPENSUBDIV=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/osd ]; then
      _1="-D OPENSUBDIV_ROOT_DIR=$INST/osd"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$OPENVDB_SKIP" = false ]; then
    _1="-D WITH_OPENVDB=ON"
    _2="-D WITH_OPENVDB_BLOSC=ON"
    PRINT "  $_1"
    PRINT "  $_2"
    _buildargs="$_buildargs $_1 $_2"
    if [ -d $INST/openvdb ]; then
      _1="-D OPENVDB_ROOT_DIR=$INST/openvdb"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
    if [ -d $INST/blosc ]; then
      _1="-D BLOSC_ROOT_DIR=$INST/blosc"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
    if [ -d $INST/nanovdb ]; then
      _1="-D WITH_NANOVDB=ON"
      _2="-D NANOVDB_ROOT_DIR=$INST/nanovdb"
      PRINT "  $_1"
      PRINT "  $_2"
      _buildargs="$_buildargs $_1 $_2"
    fi
  fi

  if [ "$WITH_OPENCOLLADA" = true ]; then
    _1="-D WITH_OPENCOLLADA=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/opencollada ]; then
      _1="-D OPENCOLLADA_ROOT_DIR=$INST/opencollada"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$WITH_EMBREE" = true ]; then
    _1="-D WITH_CYCLES_EMBREE=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/embree ]; then
      _1="-D EMBREE_ROOT_DIR=$INST/embree"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$WITH_OIDN" = true ]; then
    _1="-D WITH_OPENIMAGEDENOISE=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/oidn ]; then
      _1="-D OPENIMAGEDENOISE_ROOT_DIR=$INST/oidn"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$WITH_JACK" = true ]; then
    _1="-D WITH_JACK=ON"
    _2="-D WITH_JACK_DYNLOAD=ON"
    PRINT "  $_1"
    PRINT "  $_2"
    _buildargs="$_buildargs $_1 $_2"
  fi

  if [ "$WITH_PULSEAUDIO" = true ]; then
    _1="-D WITH_PULSEAUDIO=ON"
    _2="-D WITH_PULSEAUDIO_DYNLOAD=ON"
    PRINT "  $_1"
    PRINT "  $_2"
    _buildargs="$_buildargs $_1 $_2"
  fi

  if [ "$ALEMBIC_SKIP" = false ]; then
    _1="-D WITH_ALEMBIC=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/alembic ]; then
      _1="-D ALEMBIC_ROOT_DIR=$INST/alembic"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$USD_SKIP" = false ]; then
    _1="-D WITH_USD=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/usd ]; then
      _1="-D USD_ROOT_DIR=$INST/usd"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$NO_SYSTEM_GLEW" = true ]; then
    _1="-D WITH_SYSTEM_GLEW=OFF"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
  fi

  if [ "$FFMPEG_SKIP" = false ]; then
    _1="-D WITH_CODEC_FFMPEG=ON"
    _2="-D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;swresample;lzma;rt;`print_info_ffmpeglink`'"
    PRINT "  $_1"
    PRINT "  $_2"
    _buildargs="$_buildargs $_1 $_2"
    if [ -d $INST/ffmpeg ]; then
      _1="-D FFMPEG=$INST/ffmpeg"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  if [ "$XR_OPENXR_SKIP" = false ]; then
    _1="-D WITH_XR_OPENXR=ON"
    PRINT "  $_1"
    _buildargs="$_buildargs $_1"
    if [ -d $INST/xr-openxr-sdk ]; then
      _1="-D XR_OPENXR_SDK_ROOT_DIR=$INST/xr-openxr-sdk"
      PRINT "  $_1"
      _buildargs="$_buildargs $_1"
    fi
  fi

  PRINT ""
  PRINT "Or even simpler, just run (in your blender-source dir):"
  PRINT "  make -j$THREADS BUILD_CMAKE_ARGS=\"$_buildargs\""

  PRINT ""
  PRINT "Or in all your build directories:"
  PRINT "  cmake $_buildargs ."
}

# ----------------------------------------------------------------------------
# "Main"

# Detect distribution type used on this machine
if [ -f /etc/debian_version ]; then
  DISTRO="DEB"
  install_DEB
elif [ -f /etc/arch-release ]; then
  DISTRO="ARCH"
  install_ARCH
elif [ -f /etc/redhat-release -o /etc/SuSE-release ]; then
  DISTRO="RPM"
  install_RPM
else
  DISTRO="OTHER"
  install_OTHER
fi

print_info | tee $INFO_PATH/BUILD_NOTES.txt
PRINT ""
PRINT "This information has been written to $INFO_PATH/BUILD_NOTES.txt"
PRINT ""

# Switch back to user language.
LANG=LANG_BACK
export LANG

CXXFLAGS=$CXXFLAGS_BACK
export CXXFLAGS
