#!/bin/bash # # Copyright (c) 2016-2020 The Brenwill Workshop Ltd. # # fetchDependencies - Retrieves the correct versions of all dependencies # # macOS usage: ./fetchDependencies [--macos] [--ios] [--iossim] [--tvos] [--tvossim] [--all] [--none] # [-v] [--debug] [--build-spirv-tools] # [--v-headers-root path] [--spirv-cross-root path] [--glslang-root path] # # --macos # Build the external libraries for the macOS platform. # # --ios # Build the external libraries for the iOS platform. # # --iossim # Build the external libraries for the iOS Simulator platform. # # --tvos # Build the external libraries for the tvOS platform. # # --tvossim # Build the external libraries for the tvOS Simulator platform. # # --all # Equivalent to specifying [--macos --ios --iossim --tvos --tvossim]. # Results in one XCFramework for each external library, each containing # binaries for all supported platforms. # # --none # Don't build the external libraries for any platform. # # Multiple platform options may be specified. At least one platform option must be specified. # # --debug # Build the external libraries in Debug mode, which may be useful when debugging # and tracing calls into those libraries. # # --no-parallel-build # Build the external libraries serially instead of in parallel using background processes. # # --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. # # --build-spirv-tools # Build the full spirv-tools distribution. Normally this is not needed, because # MoltenVK includes a template of pre-generated SPIRV-Tools header files, which # is all that is needed. Avoiding the spirv-tools build saves significant time # during the running of this script, and is necessary during CI because Travis CI # cannot support the required use of Python3 by the spirv-tools build. This flag # is used by the packagePregenSpirvToolsHeaders script which regenerates the # spirv-tools header files and repackages the Templates/spirv-tools/build.zip # file when the spirv-tools library version is upgraded. # # --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 -e # ----------------- Functions ------------------- BLD_NONE="" BLD_IOS="" BLD_IOS_SIM="" BLD_TVOS="" BLD_TVOS_SIM="" BLD_MACOS="" BLD_SPECIFIED="" XC_CONFIG="Release" XC_BUILD_VERBOSITY="-quiet" XC_USE_BCKGND="Y" V_HEADERS_ROOT="" SPIRV_CROSS_ROOT="" GLSLANG_ROOT="" BLD_SPV_TLS="" while (( "$#" )); do case "$1" in --ios) BLD_IOS="Y" BLD_SPECIFIED="Y" shift 1 ;; --iossim) BLD_IOS_SIM="Y" BLD_SPECIFIED="Y" shift 1 ;; --tvos) BLD_TVOS="Y" BLD_SPECIFIED="Y" shift 1 ;; --tvossim) BLD_TVOS_SIM="Y" BLD_SPECIFIED="Y" shift 1 ;; --macos) BLD_MACOS="Y" BLD_SPECIFIED="Y" shift 1 ;; --all) BLD_IOS="Y" BLD_IOS_SIM="Y" BLD_TVOS="Y" BLD_TVOS_SIM="Y" BLD_MACOS="Y" BLD_SPECIFIED="Y" shift 1 ;; --none) BLD_NONE="Y" BLD_SPECIFIED="Y" shift 1 ;; --debug) XC_CONFIG="Debug" shift 1 ;; --no-parallel-build) XC_USE_BCKGND="" shift 1 ;; -v) XC_BUILD_VERBOSITY="" shift 1 ;; --build-spirv-tools) BLD_SPV_TLS="Y" shift 1 ;; --skip-spirv-tools-build) #deprecated BLD_SPV_TLS="" 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 option $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) function 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 function 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 # ----------------- 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 rm -rf build ./build_info.py . \ -i build_info.h.tmpl \ -o build/include/glslang/build_info.h 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 [ "$BLD_SPV_TLS" = "Y" ]; then build_repo "${SPV_TLS_DIR}" else unzip -o -q -d "${SPV_TLS_DIR}" ../Templates/spirv-tools/build.zip rm -rf "${SPV_TLS_DIR}/__MACOSX" 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 external library dependencies ----------------- # if no platform was specified, print usage message and exit if [ "$BLD_SPECIFIED" = "" ]; then echo "ERROR: You did not specify a platform to build." echo "Include one or more of the following platform options:" echo " --macos --ios --iossim --tvos --tvossim --all" echo "See the instructions in the fetchDependencies script for more info." exit 1 fi echo echo ========== Started building dependency libraries at `date +"%r"` ========== echo Please be patient on first build # Build an Xcode scheme for an OS and platform # 1 - OS # 2 - platform function build_impl() { XC_OS=${1} XC_PLTFM=${2} XC_SCHEME="${EXT_DEPS}-${XC_OS}" XC_LCL_DD_PATH="${XC_DD_PATH}/Intermediates/${XC_PLTFM}" XC_DEST="generic/platform=${XC_PLTFM}" echo Building external libraries for ${XC_PLTFM} xcodebuild \ -project "${XC_PROJ}" \ -scheme "${XC_SCHEME}" \ -destination "${XC_DEST}" \ -configuration "${XC_CONFIG}" \ -derivedDataPath "${XC_LCL_DD_PATH}" \ ${XC_BUILD_VERBOSITY} \ build echo Completed building external libraries for ${XC_PLTFM} } # Select whether or not to run the build in parallel. # 1 - OS # 2 - platform function build() { if [ "$XC_USE_BCKGND" != "" ]; then build_impl "${1}" "${2}" & else build_impl "${1}" "${2}" fi } EXT_DEPS=ExternalDependencies XC_PROJ="${EXT_DEPS}.xcodeproj" XC_DD_PATH="${EXT_DIR}/build" # Structure build tasks by platform so they can be built in parallel per platform. # Content for each platform must be built in series to avoid if [ "$XC_USE_BCKGND" != "" ]; then trap "exit" INT TERM ERR trap "kill 0" EXIT fi if [ "$BLD_NONE" != "" ]; then echo Not building any platforms fi if [ "$BLD_MACOS" != "" ]; then build "macOS" "macOS" fi if [ "$BLD_IOS" != "" ]; then build "iOS" "iOS" fi if [ "$BLD_IOS_SIM" != "" ]; then build "iOS" "iOS Simulator" fi if [ "$BLD_TVOS" != "" ]; then build "tvOS" "tvOS" fi if [ "$BLD_TVOS_SIM" != "" ]; then build "tvOS" "tvOS Simulator" fi # Wait for any background process (if selected) to finish if [ "$XC_USE_BCKGND" != "" ]; then wait fi # Build XCFrameworks, update latest symlink, and clean MoltenVK for rebuild PROJECT_DIR="." CONFIGURATION=${XC_CONFIG} . "./Scripts/create_ext_lib_xcframeworks.sh" . "./Scripts/package_ext_libs_finish.sh" echo ========== Finished at `date +"%r"` ========== exit 0