| #!/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! ========== |
| |