#!/usr/bin/env bash
#
# Copyright (c) 2016-2018 The Brenwill Workshop Ltd.
#
# fetchDependencies - Retrieves the correct versions of all dependencies
#
# macOS usage: ./fetchDependencies [--v-headers-root path] [--spirv-cross-root path] [--glslang-root path]
#
#      --v-headers-root path
#              "path" specifies a directory path to a
#              KhronosGroup/Vulkan-Headers repository.
#              This repository does not have to be built.
#
#      --spirv-cross-root path
#              "path" specifies a directory path to a
#              KhronosGroup/SPIRV-Cross repository.
#              This repository does not have to be built.
#
#      --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.
#
#


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

V_HEADERS_ROOT=""
SPIRV_CROSS_ROOT=""
GLSLANG_ROOT=""

while (( "$#" )); do
  case "$1" in
       --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 -
	else
		rm -rf $1
		git clone $2 $1
		cd $1
		git checkout $3
		cd -
	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
	fi

	make install

	cd -
}


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

EXT_DIR=External
EXT_REV_DIR=ExternalRevisions

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

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

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

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 -------------------

# When MoltenVK is built by something that already has a copy of the
# Vulkan-Headers repo, use it by creating a symlink.
if [ ! "$V_HEADERS_ROOT" = "" ]; then
       REPO_NAME=Vulkan-Headers
       rm -rf ${REPO_NAME}
       ln -sfn ${V_HEADERS_ROOT} ${REPO_NAME}
else
       REPO_NAME=Vulkan-Headers
       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


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

# When MoltenVK is built by something that already has a copy of the
# Vulkan-Headers repo, use it by creating a symlink.
if [ ! "$SPIRV_CROSS_ROOT" = "" ]; then
       REPO_NAME=SPIRV-Cross
       rm -rf ${REPO_NAME}
       ln -sfn ${SPIRV_CROSS_ROOT} ${REPO_NAME}
else
       REPO_NAME=SPIRV-Cross
       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


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

# When MoltenVK is built by something that already has a copy of the
# Vulkan-Headers repo, use it by creating a symlink.
if [ ! "$GLSLANG_ROOT" = "" ]; then
       REPO_NAME=glslang
       rm -rf ${REPO_NAME}
       ln -sfn ${GLSLANG_ROOT} ${REPO_NAME}
else
       REPO_NAME=glslang
       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 -

       build_repo ${REPO_NAME}
fi


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

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 -------------------

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}


cd ..

