blob: 89ad70e3cf6b982c2af2b269c0421fa91d74d304 [file] [log] [blame]
#!/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! ==========