#!/usr/bin/env bash
#
# Copyright (c) 2016-2019 The Brenwill Workshop Ltd.
#
# fetchDependencies - Retrieves the correct versions of all dependencies
#
# macOS usage: ./fetchDependencies [-v] [--debug] [--skip-spirv-tools-build]
#                                  [--v-headers-root path] [--spirv-cross-root path] [--glslang-root path]
#
#      --debug
#              Build the external libraries in Debug mode, which may be useful when debugging
#              and tracing calls into those libraries.
#
#      --glslang-root path
#              "path" specifies a directory path to a KhronosGroup/glslang repository.
#              This repository does need to be built and the build directory must be in the
#              specified directory. It should be built the same way this script builds it.
#
#      --skip-spirv-tools-build
#              Skip the spirv-tools build and install a template of pre-generated SPIRV-Tools header files
#              instead. The primary purpose of this is to allow Travis CI to skip the SPIRV-Tools build
#              because Travis cannot support the required use of Python3 by the SPIRV-Tools build.
#
#      --spirv-cross-root path
#              "path" specifies a directory path to a KhronosGroup/SPIRV-Cross repository.
#              This repository does not have to be built.
#
#      -v      verbose output
#
#      --v-headers-root path
#              "path" specifies a directory path to a KhronosGroup/Vulkan-Headers repository.
#              This repository does not have to be built.
#

set -o errexit

# ----------------- Functions -------------------

XC_SCHEME_SFX=""
XC_BUILD_VERBOSITY="-quiet"
V_HEADERS_ROOT=""
SPIRV_CROSS_ROOT=""
GLSLANG_ROOT=""
SKIP_SPV_TLS_BLD=""

while (( "$#" )); do
  case "$1" in
       --debug)
         XC_SCHEME_SFX=" (Debug)"
         shift 1
         ;;
       -v)
         XC_BUILD_VERBOSITY=""
         shift 1
         ;;
       --skip-spirv-tools-build)
         SKIP_SPV_TLS_BLD="Y"
         shift 1
         ;;
       --v-headers-root)
         V_HEADERS_ROOT=$2
         shift 2
         ;;
       --spirv-cross-root)
         SPIRV_CROSS_ROOT=$2
         shift 2
         ;;
       --glslang-root)
         GLSLANG_ROOT=$2
         shift 2
         ;;
       -*|--*=)
         echo "Error: Unsupported flag $1" >&2
         exit 1
         ;;
  esac
done

# Update a repository. If it exists, fetch it; if not, clone it.
# $1 repo name
# $2 repo url
# $3 repo revision (commit SHA)
update_repo() {
	echo "$1 repo: $2"
	echo "$1 revision: $3"

	if [ -d $1 -a -d $1/.git ]; then
		cd $1
		git fetch --all
		git checkout --force $3
		cd -  > /dev/null
	else
		rm -rf $1
		git clone $2 $1
		cd $1
		git checkout $3
		cd -  > /dev/null
	fi
}

# Build a repository
# $1 repo name
build_repo() {
	echo "Building $1"

	mkdir -p $1/build
	cd $1/build
	if type ninja >/dev/null 2>&1 ; then
		cmake -G Ninja -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=install ..
		ninja
	else
		cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=install ..
		make -j $(sysctl -n hw.activecpu)
	fi

	cd -  > /dev/null
}


# ----------------- Main -------------------

EXT_DIR=External
EXT_REV_DIR=../ExternalRevisions

echo
echo ========== Retrieving MoltenVK dependencies into ${EXT_DIR} ==========

mkdir -p ${EXT_DIR}
cd ${EXT_DIR}


# ----------------- Cereal -------------------

echo
echo ========== Cereal ==========
echo

REPO_NAME=cereal
REPO_URL="https://github.com/USCiLab/${REPO_NAME}.git"
REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}


# ----------------- Vulkan-Headers -------------------

echo
echo ========== Vulkan-Headers ==========
echo

# When MoltenVK is built by something that already has
# a copy of this repo, use it by creating a symlink.

REPO_NAME=Vulkan-Headers

if [ ! "$V_HEADERS_ROOT" = "" ]; then
	rm -rf ${REPO_NAME}
	ln -sfn ${V_HEADERS_ROOT} ${REPO_NAME}
else
	REPO_URL="https://github.com/KhronosGroup/${REPO_NAME}.git"
	REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

	update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}
fi

# ----------------- Vulkan-Portability -------------------

echo
echo ========== Vulkan-Portability ==========
echo

REPO_NAME=Vulkan-Portability
REPO_URL="https://github.com/KhronosGroup/${REPO_NAME}.git"
REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}


# ----------------- SPIRV-Cross -------------------

echo
echo ========== SPIRV-Cross ==========
echo

# When MoltenVK is built by something that already has
# a copy of this repo, use it by creating a symlink.

REPO_NAME=SPIRV-Cross

if [ ! "$SPIRV_CROSS_ROOT" = "" ]; then
	rm -rf ${REPO_NAME}
	ln -sfn ${SPIRV_CROSS_ROOT} ${REPO_NAME}
else
	REPO_URL="https://github.com/KhronosGroup/${REPO_NAME}.git"
	REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

	update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}
fi

# Record the SPIRV-Cross revision as a derived header file suitable for including in a build
HDR_FILE=${REPO_NAME}/mvkSpirvCrossRevisionDerived.h
echo "// Auto-generated by MoltenVK" > ${HDR_FILE}
echo "static const char* spirvCrossRevisionString = \"${REPO_REV}\";" >> ${HDR_FILE}


# ----------------- glslang -------------------

echo
echo ========== glslang and SPIRV-Tools ==========
echo

# When MoltenVK is built by something that already has
# a copy of this repo, use it by creating a symlink.

REPO_NAME=glslang

if [ ! "$GLSLANG_ROOT" = "" ]; then
	rm -rf ${REPO_NAME}
	ln -sfn ${GLSLANG_ROOT} ${REPO_NAME}
else
	REPO_URL="https://github.com/KhronosGroup/${REPO_NAME}.git"
	REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

	update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}

	cd ${REPO_NAME}
	./update_glslang_sources.py
	cd -  > /dev/null
fi

# Build the embedded spirv-tools, or use option of pre-generated headers
SPV_TLS_DIR="${REPO_NAME}/External/spirv-tools"
if [ ! "$SKIP_SPV_TLS_BLD" = "" ]; then
	unzip -o -q -d "${SPV_TLS_DIR}" ../Templates/spirv-tools/build.zip
	rm -rf "${SPV_TLS_DIR}/__MACOSX"
else
	build_repo "${SPV_TLS_DIR}"
fi



# ----------------- Vulkan-Tools -------------------

echo
echo ========== Vulkan-Tools ==========
echo

REPO_NAME=Vulkan-Tools
REPO_URL="https://github.com/KhronosGroup/${REPO_NAME}.git"
REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}


# ----------------- VulkanSamples -------------------

echo
echo ========== VulkanSamples ==========
echo

REPO_NAME=VulkanSamples
REPO_URL="https://github.com/LunarG/${REPO_NAME}.git"
REPO_REV=$(cat "${EXT_REV_DIR}/${REPO_NAME}_repo_revision")

update_repo ${REPO_NAME} ${REPO_URL} ${REPO_REV}

# Generate dispatch files needed for Hologram demo
cd "${REPO_NAME}/Sample-Programs/Hologram"
./generate-dispatch-table HelpersDispatchTable.h
./generate-dispatch-table HelpersDispatchTable.cpp
cd -  > /dev/null


# ----------------- Cleanup -------------------

cd ..


# -------------- Build MoltenVK dependencies -----------------
echo
echo ========== Building dependency libraries quietly. Please be patient on first build. ==========
echo

EXT_DEPS=ExternalDependencies
XC_PROJ="${EXT_DEPS}.xcodeproj"
XC_SCHEME="${EXT_DEPS}${XC_SCHEME_SFX}"
XC_DD_PATH="${EXT_DIR}/build"

xcodebuild 								\
	-project "${XC_PROJ}"				\
	-scheme "${XC_SCHEME}"				\
	-derivedDataPath "${XC_DD_PATH}"	\
	${XC_BUILD_VERBOSITY}				\
	build

echo ========== Done! ==========

