fetchDependencies supports options for specifying which platform options to build for. Fix SPIRV-Tools builds to avoid code stripping warnings.
378 lines
9.3 KiB
Bash
Executable File
378 lines
9.3 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] [--ios-fat] [--macos] [--all]
|
|
# [-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.
|
|
#
|
|
# --ios-fat
|
|
# Build a single binary for each external library, each containing code
|
|
# for both iOS and iOS Simulator platforms.
|
|
#
|
|
# --macos
|
|
# Build the external libraries for the macOS platform.
|
|
#
|
|
# --all
|
|
# Equivalent to specifying [--ios-fat --macos]. Results in two binaries for
|
|
# each external library: one for the iOS and iOS Simulator platforms, and
|
|
# another for the macOS platform.
|
|
#
|
|
# Multiple platform options may be specified.
|
|
#
|
|
# --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.
|
|
#
|
|
# --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_IOS=""
|
|
BLD_IOS_SIM=""
|
|
BLD_MACOS=""
|
|
BLD_SPECIFIED=""
|
|
XC_CONFIG="Release"
|
|
XC_BUILD_VERBOSITY="-quiet"
|
|
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
|
|
;;
|
|
--ios-fat)
|
|
BLD_IOS="Y"
|
|
BLD_IOS_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_MACOS="Y"
|
|
BLD_SPECIFIED="Y"
|
|
shift 1
|
|
;;
|
|
--debug)
|
|
XC_CONFIG="Debug"
|
|
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 flag $1" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# 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: --ios --ios-fat --macos --all
|
|
exit 1
|
|
fi
|
|
|
|
# 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
|
|
|
|
|
|
|
|
# ----------------- 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 [ "$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 dependencies -----------------
|
|
echo
|
|
echo ========== Building dependency libraries quietly. Please be patient on first build. ==========
|
|
echo
|
|
|
|
# Build an Xcode scheme
|
|
function build() {
|
|
echo Building external libraries for ${XC_PLTFM}
|
|
xcodebuild \
|
|
-project "${XC_PROJ}" \
|
|
-scheme "${XC_SCHEME}" \
|
|
-destination "generic/platform=${XC_PLTFM}" \
|
|
-configuration "${XC_CONFIG}" \
|
|
-derivedDataPath "${XC_DD_PATH}" \
|
|
${XC_BUILD_VERBOSITY} \
|
|
build
|
|
}
|
|
|
|
EXT_DEPS=ExternalDependencies
|
|
XC_PROJ="${EXT_DEPS}.xcodeproj"
|
|
XC_DD_PATH="${EXT_DIR}/build"
|
|
|
|
if [ "$BLD_IOS" != "" ]; then
|
|
XC_SCHEME="${EXT_DEPS}-iOS"
|
|
XC_PLTFM="iOS"
|
|
build
|
|
fi
|
|
|
|
if [ "$BLD_IOS_SIM" != "" ]; then
|
|
XC_SCHEME="${EXT_DEPS}-iOS"
|
|
XC_PLTFM="iOS Simulator"
|
|
build
|
|
fi
|
|
|
|
if [ "$BLD_MACOS" != "" ]; then
|
|
XC_SCHEME="${EXT_DEPS}-macOS"
|
|
XC_PLTFM="macOS"
|
|
build
|
|
fi
|
|
|
|
echo ========== Done! ==========
|
|
|