Files
filament/build.sh
Philip Rideout 0b1fa7fc80 Enable Vulkan for Android by default.
The presence of a special Gradle property is now used to exclude Vulkan
support from the build. By making Vulkan "always on" for local
development, we can avoid stale CMake cache issues that arise from
toggling the Gradle property. It also lets you avoid adding the flag
to Android Studio preferences.

This is motivated by testing and does not indicate production readiness.
Clients still need to pass VULKAN into the Engine constructor to select
the Vulkan backend.

To keep APK size down and keep CI fast, we are continuing to exclude
Vulkan from official Android builds.

After syncing this change, you might need to use `./build.sh -c` to
clobber various build caches.
2020-05-18 09:34:55 -07:00

838 lines
27 KiB
Bash
Executable File

#!/bin/bash
set -e
# Host tools required by Android, WebGL, and iOS builds
MOBILE_HOST_TOOLS="matc resgen cmgen filamesh"
WEB_HOST_TOOLS="${MOBILE_HOST_TOOLS} mipgen filamesh"
IOS_TOOLCHAIN_URL="https://opensource.apple.com/source/clang/clang-800.0.38/src/cmake/platforms/iOS.cmake"
function print_help {
local self_name=$(basename "$0")
echo "Usage:"
echo " $self_name [options] <build_type1> [<build_type2> ...] [targets]"
echo ""
echo "Options:"
echo " -h"
echo " Print this help message."
echo " -a"
echo " Generate .tgz build archives, implies -i."
echo " -c"
echo " Clean build directories."
echo " -f"
echo " Always invoke CMake before incremental builds."
echo " -i"
echo " Install build output"
echo " -j"
echo " Do not compile desktop Java projects"
echo " -m"
echo " Compile with make instead of ninja."
echo " -p platform1,platform2,..."
echo " Where platformN is [desktop|android|ios|webgl|all]."
echo " Platform(s) to build, defaults to desktop."
echo " Building for iOS will automatically generate / download"
echo " the toolchains if needed and perform a partial desktop build."
echo " -q abi1,abi2,..."
echo " Where platformN is [armeabi-v7a|arm64-v8a|x86|x86_64|all]."
echo " ABIs to build when the platform is Android. Defaults to all."
echo " -u"
echo " Run all unit tests, will trigger a debug build if needed."
echo " -v"
echo " Exclude Vulkan support from the Android build."
echo " -s"
echo " Add iOS simulator support to the iOS build."
echo " -w"
echo " Build Web documents (compiles .md.html files to .html)."
echo ""
echo "Build types:"
echo " release"
echo " Release build only"
echo " debug"
echo " Debug build only"
echo ""
echo "Targets:"
echo " Any target supported by the underlying build system"
echo ""
echo "Examples:"
echo " Desktop release build:"
echo " \$ ./$self_name release"
echo ""
echo " Desktop debug and release builds:"
echo " \$ ./$self_name debug release"
echo ""
echo " Clean, desktop debug build and create archive of build artifacts:"
echo " \$ ./$self_name -c -a debug"
echo ""
echo " Android release build type:"
echo " \$ ./$self_name -p android release"
echo ""
echo " Desktop and Android release builds, with installation:"
echo " \$ ./$self_name -p desktop,android -i release"
echo ""
echo " Desktop matc target, release build:"
echo " \$ ./$self_name release matc"
echo ""
echo " Build gltf_viewer then immediately run it with no arguments:"
echo " \$ ./$self_name release run_gltf_viewer"
echo ""
}
# Requirements
CMAKE_MAJOR=3
CMAKE_MINOR=10
ANDROID_NDK_VERSION=21
# Internal variables
ISSUE_CLEAN=false
ISSUE_DEBUG_BUILD=false
ISSUE_RELEASE_BUILD=false
# Default: build desktop only
ISSUE_ANDROID_BUILD=false
ISSUE_IOS_BUILD=false
ISSUE_DESKTOP_BUILD=true
ISSUE_WEBGL_BUILD=false
# Default: all
ABI_ARMEABI_V7A=true
ABI_ARM64_V8A=true
ABI_X86=true
ABI_X86_64=true
ABI_GRADLE_OPTION="all"
ISSUE_ARCHIVES=false
BUILD_JS_DOCS=false
ISSUE_CMAKE_ALWAYS=false
ISSUE_WEB_DOCS=false
RUN_TESTS=false
JS_DOCS_OPTION="-DGENERATE_JS_DOCS=OFF"
FILAMENT_ENABLE_JAVA=ON
INSTALL_COMMAND=
VULKAN_ANDROID_OPTION="-DFILAMENT_SUPPORTS_VULKAN=ON"
VULKAN_ANDROID_GRADLE_OPTION=""
IOS_BUILD_SIMULATOR=false
BUILD_GENERATOR=Ninja
BUILD_COMMAND=ninja
BUILD_CUSTOM_TARGETS=
UNAME=$(uname)
LC_UNAME=$(echo "${UNAME}" | tr '[:upper:]' '[:lower:]')
# Functions
function build_clean {
echo "Cleaning build directories..."
rm -Rf out
rm -Rf android/filament-android/build android/filament-android/.externalNativeBuild android/filament-android/.cxx
rm -Rf android/filamat-android/build android/filamat-android/.externalNativeBuild android/filamat-android/.cxx
rm -Rf android/gltfio-android/build android/gltfio-android/.externalNativeBuild android/gltfio-android/.cxx
rm -Rf android/filament-utils-android/build android/filament-utils-android/.externalNativeBuild android/filament-utils-android/.cxx
}
function build_desktop_target {
local lc_target=$(echo "$1" | tr '[:upper:]' '[:lower:]')
local build_targets=$2
if [[ ! "${build_targets}" ]]; then
build_targets=${BUILD_CUSTOM_TARGETS}
fi
echo "Building ${lc_target} in out/cmake-${lc_target}..."
mkdir -p "out/cmake-${lc_target}"
cd "out/cmake-${lc_target}"
# On macOS, set the deployment target to 10.14.
local lc_name=$(echo "${UNAME}" | tr '[:upper:]' '[:lower:]')
if [[ "${lc_name}" == "darwin" ]]; then
local deployment_target="-DCMAKE_OSX_DEPLOYMENT_TARGET=10.14"
fi
if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then
cmake \
-G "${BUILD_GENERATOR}" \
-DIMPORT_EXECUTABLES_DIR=out \
-DCMAKE_BUILD_TYPE="$1" \
-DCMAKE_INSTALL_PREFIX="../${lc_target}/filament" \
-DFILAMENT_ENABLE_JAVA="${FILAMENT_ENABLE_JAVA}" \
${deployment_target} \
../..
fi
${BUILD_COMMAND} ${build_targets}
if [[ "${INSTALL_COMMAND}" ]]; then
echo "Installing ${lc_target} in out/${lc_target}/filament..."
${BUILD_COMMAND} ${INSTALL_COMMAND}
fi
if [[ -d "../${lc_target}/filament" ]]; then
if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then
echo "Generating out/filament-${lc_target}-${LC_UNAME}.tgz..."
cd "../${lc_target}"
tar -czvf "../filament-${lc_target}-${LC_UNAME}.tgz" filament
fi
fi
cd ../..
}
function build_desktop {
if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
build_desktop_target "Debug" "$1"
fi
if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
build_desktop_target "Release" "$1"
fi
}
function build_webgl_with_target {
local lc_target=$(echo "$1" | tr '[:upper:]' '[:lower:]')
echo "Building WebGL ${lc_target}..."
mkdir -p "out/cmake-webgl-${lc_target}"
cd "out/cmake-webgl-${lc_target}"
if [[ ! "${BUILD_TARGETS}" ]]; then
BUILD_TARGETS=${BUILD_CUSTOM_TARGETS}
ISSUE_CMAKE_ALWAYS=true
fi
if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then
# Apply the emscripten environment within a subshell.
(
# shellcheck disable=SC1090
source "${EMSDK}/emsdk_env.sh"
cmake \
-G "${BUILD_GENERATOR}" \
-DIMPORT_EXECUTABLES_DIR=out \
-DCMAKE_TOOLCHAIN_FILE="${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" \
-DCMAKE_BUILD_TYPE="$1" \
-DCMAKE_INSTALL_PREFIX="../webgl-${lc_target}/filament" \
-DWEBGL=1 \
${JS_DOCS_OPTION} \
../..
${BUILD_COMMAND} ${BUILD_TARGETS}
)
fi
if [[ -d "web/filament-js" ]]; then
if [[ "${BUILD_JS_DOCS}" == "true" ]]; then
echo "Generating JavaScript documentation..."
local DOCS_FOLDER="web/docs"
local DOCS_SCRIPT="../../web/docs/build.py"
python3 ${DOCS_SCRIPT} --disable-demo \
--output-folder "${DOCS_FOLDER}" \
--build-folder "${PWD}"
fi
if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then
echo "Generating out/filament-${lc_target}-web.tgz..."
# The web archive has the following subfolders:
# dist...core WASM module and accompanying JS file.
# docs...HTML tutorials for the JS API, accompanying demos, and a reference page.
cd web
tar -cvf "../../filament-${lc_target}-web.tar" -s /^filament-js/dist/ \
filament-js/filament.js
tar -rvf "../../filament-${lc_target}-web.tar" -s /^filament-js/dist/ \
filament-js/filament.wasm
cd -
gzip -c "../filament-${lc_target}-web.tar" > "../filament-${lc_target}-web.tgz"
rm "../filament-${lc_target}-web.tar"
fi
fi
cd ../..
}
function build_webgl {
# For the host tools, supress install and always use Release.
local old_install_command=${INSTALL_COMMAND}; INSTALL_COMMAND=
local old_issue_debug_build=${ISSUE_DEBUG_BUILD}; ISSUE_DEBUG_BUILD=false
local old_issue_release_build=${ISSUE_RELEASE_BUILD}; ISSUE_RELEASE_BUILD=true
build_desktop "${WEB_HOST_TOOLS}"
INSTALL_COMMAND=${old_install_command}
ISSUE_DEBUG_BUILD=${old_issue_debug_build}
ISSUE_RELEASE_BUILD=${old_issue_release_build}
if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
build_webgl_with_target "Debug"
fi
if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
build_webgl_with_target "Release"
fi
}
function build_android_target {
local lc_target=$(echo "$1" | tr '[:upper:]' '[:lower:]')
local arch=$2
echo "Building Android ${lc_target} (${arch})..."
mkdir -p "out/cmake-android-${lc_target}-${arch}"
cd "out/cmake-android-${lc_target}-${arch}"
if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then
cmake \
-G "${BUILD_GENERATOR}" \
-DIMPORT_EXECUTABLES_DIR=out \
-DCMAKE_BUILD_TYPE="$1" \
-DCMAKE_INSTALL_PREFIX="../android-${lc_target}/filament" \
-DCMAKE_TOOLCHAIN_FILE="../../build/toolchain-${arch}-linux-android.cmake" \
${VULKAN_ANDROID_OPTION} \
../..
fi
# We must always install Android libraries to build the AAR
${BUILD_COMMAND} install
cd ../..
}
function build_android_arch {
local arch=$1
if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
build_android_target "Debug" "${arch}"
fi
if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
build_android_target "Release" "${arch}"
fi
}
function archive_android {
local lc_target=$(echo "$1" | tr '[:upper:]' '[:lower:]')
if [[ -d "out/android-${lc_target}/filament" ]]; then
if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then
echo "Generating out/filament-android-${lc_target}-${LC_UNAME}.tgz..."
cd "out/android-${lc_target}"
tar -czvf "../filament-android-${lc_target}-${LC_UNAME}.tgz" filament
cd ../..
fi
fi
}
function ensure_android_build {
if [[ "${ANDROID_HOME}" == "" ]]; then
echo "Error: ANDROID_HOME is not set, exiting"
exit 1
fi
local ndk_side_by_side="${ANDROID_HOME}/ndk/"
if [[ -d ${ndk_side_by_side} ]]; then
# shellcheck disable=SC2012
local ndk_version=$(ls "${ndk_side_by_side}" | sort -V | tail -n 1 | cut -f 1 -d ".")
if [[ ${ndk_version} -lt ${ANDROID_NDK_VERSION} ]]; then
echo "Error: Android NDK side-by-side version ${ANDROID_NDK_VERSION} or higher must be installed, exiting"
exit 1
fi
else
echo "Error: Android NDK side-by-side version ${ANDROID_NDK_VERSION} or higher must be installed, exiting"
exit 1
fi
local cmake_version=$(cmake --version)
if [[ "${cmake_version}" =~ ([0-9]+)\.([0-9]+)\.[0-9]+ ]]; then
if [[ "${BASH_REMATCH[1]}" -lt "${CMAKE_MAJOR}" ]] || \
[[ "${BASH_REMATCH[2]}" -lt "${CMAKE_MINOR}" ]]; then
echo "Error: cmake version ${CMAKE_MAJOR}.${CMAKE_MINOR}+ is required," \
"${BASH_REMATCH[1]}.${BASH_REMATCH[2]} installed, exiting"
exit 1
fi
fi
}
function build_android {
ensure_android_build
# Supress intermediate desktop tools install
local old_install_command=${INSTALL_COMMAND}
INSTALL_COMMAND=
build_desktop "${MOBILE_HOST_TOOLS}"
INSTALL_COMMAND=${old_install_command}
if [[ "${ABI_ARM64_V8A}" == "true" ]]; then
build_android_arch "aarch64" "aarch64-linux-android"
fi
if [[ "${ABI_ARMEABI_V7A}" == "true" ]]; then
build_android_arch "arm7" "arm-linux-androideabi"
fi
if [[ "${ABI_X86_64}" == "true" ]]; then
build_android_arch "x86_64" "x86_64-linux-android"
fi
if [[ "${ABI_X86}" == "true" ]]; then
build_android_arch "x86" "i686-linux-android"
fi
if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
archive_android "Debug"
fi
if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
archive_android "Release"
fi
cd android
if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
./gradlew \
-Pfilament_dist_dir=../out/android-debug/filament \
-Pfilament_abis=${ABI_GRADLE_OPTION} \
${VULKAN_ANDROID_GRADLE_OPTION} \
:filament-android:assembleDebug \
:gltfio-android:assembleDebug \
:filament-utils-android:assembleDebug
./gradlew \
-Pfilament_dist_dir=../out/android-debug/filament \
-Pfilament_abis=${ABI_GRADLE_OPTION} \
:filamat-android:assembleDebug
if [[ "${INSTALL_COMMAND}" ]]; then
echo "Installing out/filamat-android-debug.aar..."
cp filamat-android/build/outputs/aar/filamat-android-lite-debug.aar ../out/
cp filamat-android/build/outputs/aar/filamat-android-full-debug.aar ../out/filamat-android-debug.aar
echo "Installing out/filament-android-debug.aar..."
cp filament-android/build/outputs/aar/filament-android-debug.aar ../out/
echo "Installing out/gltfio-android-debug.aar..."
cp gltfio-android/build/outputs/aar/gltfio-android-lite-debug.aar ../out/
cp gltfio-android/build/outputs/aar/gltfio-android-full-debug.aar ../out/gltfio-android-debug.aar
echo "Installing out/filament-utils-android-debug.aar..."
cp filament-utils-android/build/outputs/aar/filament-utils-android-lite-debug.aar ../out/
cp filament-utils-android/build/outputs/aar/filament-utils-android-full-debug.aar ../out/filament-utils-android-debug.aar
fi
fi
if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
./gradlew \
-Pfilament_dist_dir=../out/android-release/filament \
-Pfilament_abis=${ABI_GRADLE_OPTION} \
${VULKAN_ANDROID_GRADLE_OPTION} \
:filament-android:assembleRelease \
:gltfio-android:assembleRelease \
:filament-utils-android:assembleRelease
./gradlew \
-Pfilament_dist_dir=../out/android-release/filament \
-Pfilament_abis=${ABI_GRADLE_OPTION} \
:filamat-android:assembleRelease
if [[ "${INSTALL_COMMAND}" ]]; then
echo "Installing out/filamat-android-release.aar..."
cp filamat-android/build/outputs/aar/filamat-android-lite-release.aar ../out/
cp filamat-android/build/outputs/aar/filamat-android-full-release.aar ../out/filamat-android-release.aar
echo "Installing out/filament-android-release.aar..."
cp filament-android/build/outputs/aar/filament-android-release.aar ../out/
echo "Installing out/gltfio-android-release.aar..."
cp gltfio-android/build/outputs/aar/gltfio-android-lite-release.aar ../out/
cp gltfio-android/build/outputs/aar/gltfio-android-full-release.aar ../out/gltfio-android-release.aar
echo "Installing out/filament-utils-android-release.aar..."
cp filament-utils-android/build/outputs/aar/filament-utils-android-lite-release.aar ../out/
cp filament-utils-android/build/outputs/aar/filament-utils-android-full-release.aar ../out/filament-utils-android-release.aar
fi
fi
cd ..
}
function ensure_ios_toolchain {
local toolchain_path="build/toolchain-mac-ios.cmake"
if [[ -e ${toolchain_path} ]]; then
echo "iOS toolchain file exists."
return 0
fi
echo
echo "iOS toolchain file does not exist."
echo "It will automatically be downloaded from http://opensource.apple.com."
if [[ "${GITHUB_WORKFLOW}" ]]; then
REPLY=y
else
read -p "Continue? (y/n) " -n 1 -r
echo
fi
if [[ ! "${REPLY}" =~ ^[Yy]$ ]]; then
echo "Toolchain file must be downloaded to continue."
exit 1
fi
curl -o "${toolchain_path}" "${IOS_TOOLCHAIN_URL}" || {
echo "Error downloading iOS toolchain file."
exit 1
}
# Apple's toolchain hard-codes the PLATFORM_NAME into the toolchain file. Instead, make this a
# CACHE variable that can be overriden on the command line.
local FIND='SET(PLATFORM_NAME iphoneos)'
local REPLACE='SET(PLATFORM_NAME "iphoneos" CACHE STRING "iOS platform to build for")'
sed -i '' "s/${FIND}/${REPLACE}/g" ./${toolchain_path}
# Apple's toolchain specifies isysroot based on an environment variable, which we don't set.
# The toolchain doesn't need to do this, however, as isysroot is implicitly set in the toolchain
# via CMAKE_OSX_SYSROOT.
# shellcheck disable=SC2016
local FIND='SET(IOS_COMMON_FLAGS "-isysroot $ENV{SDKROOT} '
local REPLACE='SET(IOS_COMMON_FLAGS "'
sed -i '' "s/${FIND}/${REPLACE}/g" ./${toolchain_path}
# Prepend Filament-specific settings.
(cat build/toolchain-mac-ios.filament.cmake; cat ${toolchain_path}) > tmp && mv tmp ${toolchain_path}
echo "Successfully downloaded iOS toolchain file and prepended Filament-specific settings."
}
function build_ios_target {
local lc_target=$(echo "$1" | tr '[:upper:]' '[:lower:]')
local arch=$2
local platform=$3
echo "Building iOS ${lc_target} (${arch}) for ${platform}..."
mkdir -p "out/cmake-ios-${lc_target}-${arch}"
cd "out/cmake-ios-${lc_target}-${arch}"
if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then
cmake \
-G "${BUILD_GENERATOR}" \
-DIMPORT_EXECUTABLES_DIR=out \
-DCMAKE_BUILD_TYPE="$1" \
-DCMAKE_INSTALL_PREFIX="../ios-${lc_target}/filament" \
-DIOS_ARCH="${arch}" \
-DPLATFORM_NAME="${platform}" \
-DIOS_MIN_TARGET=12.0 \
-DIOS=1 \
-DCMAKE_TOOLCHAIN_FILE=../../build/toolchain-mac-ios.cmake \
../..
fi
${BUILD_COMMAND}
if [[ "${INSTALL_COMMAND}" ]]; then
echo "Installing ${lc_target} in out/${lc_target}/filament..."
${BUILD_COMMAND} ${INSTALL_COMMAND}
fi
if [[ -d "../ios-${lc_target}/filament" ]]; then
if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then
echo "Generating out/filament-${lc_target}-ios.tgz..."
cd "../ios-${lc_target}"
tar -czvf "../filament-${lc_target}-ios.tgz" filament
fi
fi
cd ../..
}
function build_ios {
# Supress intermediate desktop tools install
local old_install_command=${INSTALL_COMMAND}
INSTALL_COMMAND=
build_desktop "${MOBILE_HOST_TOOLS}"
INSTALL_COMMAND=${old_install_command}
ensure_ios_toolchain
# In theory, we could support iPhone architectures older than arm64, but
# only arm64 devices support OpenGL 3.0 / Metal
if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
build_ios_target "Debug" "arm64" "iphoneos"
if [[ "${IOS_BUILD_SIMULATOR}" == "true" ]]; then
build_ios_target "Debug" "x86_64" "iphonesimulator"
fi
fi
if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
build_ios_target "Release" "arm64" "iphoneos"
if [[ "${IOS_BUILD_SIMULATOR}" == "true" ]]; then
build_ios_target "Release" "x86_64" "iphonesimulator"
fi
fi
}
function build_web_docs {
echo "Building Web documents..."
mkdir -p out/web-docs
cd out/web-docs
# Create an empty npm package to link markdeep-rasterizer into
npm list | grep web-docs@1.0.0 > /dev/null || npm init --yes > /dev/null
npm list | grep markdeep-rasterizer > /dev/null || npm install ../../third_party/markdeep-rasterizer > /dev/null
# Generate documents
npx markdeep-rasterizer ../../docs/Filament.md.html ../../docs/Materials.md.html ../../docs/
cd ../..
}
function validate_build_command {
set +e
# Make sure CMake is installed
local cmake_binary=$(command -v cmake)
if [[ ! "${cmake_binary}" ]]; then
echo "Error: could not find cmake, exiting"
exit 1
fi
# Make sure Ninja is installed
if [[ "${BUILD_COMMAND}" == "ninja" ]]; then
local ninja_binary=$(command -v ninja)
if [[ ! "${ninja_binary}" ]]; then
echo "Warning: could not find ninja, using make instead"
BUILD_GENERATOR="Unix Makefiles"
BUILD_COMMAND="make"
fi
fi
# Make sure Make is installed
if [[ "${BUILD_COMMAND}" == "make" ]]; then
local make_binary=$(command -v make)
if [[ ! "${make_binary}" ]]; then
echo "Error: could not find make, exiting"
exit 1
fi
fi
# Make sure we have Java
local javac_binary=$(command -v javac)
if [[ "${JAVA_HOME}" == "" ]] || [[ ! "${javac_binary}" ]]; then
echo "Warning: JAVA_HOME is not set, skipping Java projects"
FILAMENT_ENABLE_JAVA=OFF
fi
# If building a WebAssembly module, ensure we know where Emscripten lives.
if [[ "${EMSDK}" == "" ]] && [[ "${ISSUE_WEBGL_BUILD}" == "true" ]]; then
echo "Error: EMSDK is not set, exiting"
exit 1
fi
# Web documents require node and npm for processing
if [[ "${ISSUE_WEB_DOCS}" == "true" ]]; then
local node_binary=$(command -v node)
local npm_binary=$(command -v npm)
local npx_binary=$(command -v npx)
if [[ ! "${node_binary}" ]] || [[ ! "${npm_binary}" ]] || [[ ! "${npx_binary}" ]]; then
echo "Error: Web documents require node, npm and npx to be installed"
exit 1
fi
fi
set -e
}
function run_test {
local test=$1
# The input string might contain arguments, so we use "set -- $test" to replace $1 with the
# first whitespace-separated token in the string.
# shellcheck disable=SC2086
set -- ${test}
local test_name=$(basename "$1")
# shellcheck disable=SC2086
./out/cmake-debug/${test} --gtest_output="xml:out/test-results/${test_name}/sponge_log.xml"
}
function run_tests {
if [[ "${ISSUE_WEBGL_BUILD}" == "true" ]]; then
if ! echo "TypeScript $(tsc --version)" ; then
tsc --noEmit \
third_party/gl-matrix/gl-matrix.d.ts \
web/filament-js/filament.d.ts \
web/filament-js/test.ts
fi
else
while read -r test; do
run_test "${test}"
done < build/common/test_list.txt
fi
}
# Beginning of the script
pushd "$(dirname "$0")" > /dev/null
while getopts ":hacfijmp:q:uvsw" opt; do
case ${opt} in
h)
print_help
exit 1
;;
a)
ISSUE_ARCHIVES=true
INSTALL_COMMAND=install
;;
c)
ISSUE_CLEAN=true
;;
f)
ISSUE_CMAKE_ALWAYS=true
;;
i)
INSTALL_COMMAND=install
;;
j)
FILAMENT_ENABLE_JAVA=OFF
;;
m)
BUILD_GENERATOR="Unix Makefiles"
BUILD_COMMAND="make"
;;
p)
ISSUE_DESKTOP_BUILD=false
platforms=$(echo "${OPTARG}" | tr ',' '\n')
for platform in ${platforms}
do
case ${platform} in
desktop)
ISSUE_DESKTOP_BUILD=true
;;
android)
ISSUE_ANDROID_BUILD=true
;;
ios)
ISSUE_IOS_BUILD=true
;;
webgl)
ISSUE_WEBGL_BUILD=true
;;
all)
ISSUE_ANDROID_BUILD=true
ISSUE_IOS_BUILD=true
ISSUE_DESKTOP_BUILD=true
ISSUE_WEBGL_BUILD=false
;;
esac
done
;;
q)
ABI_ARMEABI_V7A=false
ABI_ARM64_V8A=false
ABI_X86=false
ABI_X86_64=false
ABI_GRADLE_OPTION="${OPTARG}"
abis=$(echo "${OPTARG}" | tr ',' '\n')
for abi in ${abis}
do
case ${abi} in
armeabi-v7a)
ABI_ARMEABI_V7A=true
;;
arm64-v8a)
ABI_ARM64_V8A=true
;;
x86)
ABI_X86=true
;;
x86_64)
ABI_X86_64=true
;;
all)
ABI_ARMEABI_V7A=true
ABI_ARM64_V8A=true
ABI_X86=true
ABI_X86_64=true
;;
esac
done
;;
u)
ISSUE_DEBUG_BUILD=true
RUN_TESTS=true
;;
v)
VULKAN_ANDROID_OPTION="-DFILAMENT_SUPPORTS_VULKAN=OFF"
VULKAN_ANDROID_GRADLE_OPTION="-Pfilament_exclude_vulkan"
echo "Disabling support for Vulkan in the core Filament library."
echo "Consider using -c after changing this option to clear the Gradle cache."
;;
s)
IOS_BUILD_SIMULATOR=true
echo "iOS simulator support enabled."
;;
w)
ISSUE_WEB_DOCS=true
;;
\?)
echo "Invalid option: -${OPTARG}" >&2
echo ""
print_help
exit 1
;;
:)
echo "Option -${OPTARG} requires an argument." >&2
echo ""
print_help
exit 1
;;
esac
done
if [[ "$#" == "0" ]]; then
print_help
exit 1
fi
shift $((OPTIND - 1))
for arg; do
if [[ "${arg}" == "release" ]]; then
ISSUE_RELEASE_BUILD=true
elif [[ "${arg}" == "debug" ]]; then
ISSUE_DEBUG_BUILD=true
else
BUILD_CUSTOM_TARGETS="${BUILD_CUSTOM_TARGETS} ${arg}"
fi
done
validate_build_command
if [[ "${ISSUE_CLEAN}" == "true" ]]; then
build_clean
fi
if [[ "${ISSUE_DESKTOP_BUILD}" == "true" ]]; then
build_desktop
fi
if [[ "${ISSUE_ANDROID_BUILD}" == "true" ]]; then
build_android
fi
if [[ "${ISSUE_IOS_BUILD}" == "true" ]]; then
build_ios
fi
if [[ "${ISSUE_WEBGL_BUILD}" == "true" ]]; then
build_webgl
fi
if [[ "${ISSUE_WEB_DOCS}" == "true" ]]; then
build_web_docs
fi
if [[ "${RUN_TESTS}" == "true" ]]; then
run_tests
fi