478 lines
12 KiB
Bash
Executable File
478 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2016-2020 The Brenwill Workshop Ltd.
|
|
#
|
|
# fetchDependencies - Retrieves the correct versions of all dependencies
|
|
#
|
|
# macOS usage: ./fetchDependencies [--ios] [--iosfat] [--tvos] [--tvosfat] [--macos] [--all] [--none]
|
|
# [-v] [--debug] [--build-spirv-tools]
|
|
# [--v-headers-root path] [--spirv-cross-root path] [--glslang-root path]
|
|
#
|
|
# --ios
|
|
# Build the external libraries for the iOS platform.
|
|
#
|
|
# --iosfat
|
|
# Build a single binary for each external library, each containing code
|
|
# for both iOS and iOS Simulator platforms.
|
|
#
|
|
# --tvos
|
|
# Build the external libraries for the tvOS platform.
|
|
#
|
|
# --tvosfat
|
|
# Build a single binary for each external library, each containing code
|
|
# for both tvOS and tvOS Simulator platforms.
|
|
#
|
|
# --macos
|
|
# Build the external libraries for the macOS platform.
|
|
#
|
|
# --all
|
|
# Equivalent to specifying [--iosfat --tvosfat --macos]. Results in thee
|
|
# binaries for each external library: one for the iOS and iOS Simulator platforms,
|
|
# one for the tvOS and tvOS Simulator platforms, and one for the macOS platform.
|
|
#
|
|
# --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
|
|
;;
|
|
--iosfat)
|
|
BLD_IOS="Y"
|
|
BLD_IOS_SIM="Y"
|
|
BLD_SPECIFIED="Y"
|
|
shift 1
|
|
;;
|
|
--tvos)
|
|
BLD_TVOS="Y"
|
|
BLD_SPECIFIED="Y"
|
|
shift 1
|
|
;;
|
|
--tvosfat)
|
|
BLD_TVOS="Y"
|
|
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
|
|
|
|
|
|
# ----------------- 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 " --ios --iosfat --tvos --tvosfat --macos --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_OS}"
|
|
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
|
|
}
|
|
|
|
# Build a fat library for the OS containing code for the OS and its Simulator
|
|
# Builds serially to ensure both are built
|
|
# 1 - OS
|
|
function build_fat_impl() {
|
|
XC_OS=${1}
|
|
|
|
build_impl ${XC_OS} ${XC_OS}
|
|
build_impl ${XC_OS} "${XC_OS} Simulator"
|
|
}
|
|
|
|
# Select whether or not to run the build in parallel.
|
|
# 1 - OS
|
|
function build_fat() {
|
|
if [ "$XC_USE_BCKGND" != "" ]; then
|
|
build_fat_impl ${1} &
|
|
else
|
|
build_fat_impl ${1}
|
|
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
|
|
if [ "$BLD_IOS_SIM" != "" ]; then
|
|
build_fat "iOS"
|
|
else
|
|
build "iOS" "iOS"
|
|
fi
|
|
fi
|
|
|
|
if [ "$BLD_TVOS" != "" ]; then
|
|
if [ "$BLD_TVOS_SIM" != "" ]; then
|
|
build_fat "tvOS"
|
|
else
|
|
build "tvOS" "tvOS"
|
|
fi
|
|
fi
|
|
|
|
# Wait for any background process (if selected) to finish
|
|
if [ "$XC_USE_BCKGND" != "" ]; then
|
|
wait
|
|
fi
|
|
|
|
# Update latest symlink and clean MoltenVK for rebuild
|
|
PROJECT_DIR="."
|
|
CONFIGURATION=${XC_CONFIG}
|
|
. "./Scripts/package_ext_libs_finish.sh"
|
|
|
|
echo ========== Finished at `date +"%r"` ==========
|
|
exit 0
|