blob: a1af67edc2c59d952c8f139177c574ae7cb53178 [file] [log] [blame]
#!/bin/bash
# Copyright 2019 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
# This script builds SwiftShader's Vulkan ICD. By default, it creates a
# `.swiftshader` installation directory in your OS's home directory (`HOME` on
# not-windows, `USERPROFILE` on windows):
#
# bash build_tools/third_party/swiftshader/build_vk_swiftshader.sh
#
# The installation directory can be overridden using the first positional
# argument:
#
# bash build_tools/third_party/swiftshader/build_vk_swiftshader.sh <parent-dir>
#
# If the installation dir already exists, it will be deleted and rebuilt.
#
# Note that you will need a working CMake installation for this script to
# succeed. On Windows, Visual Studio 2019 is recommended.
#
# Afterward, you'll need to set the `VK_ICD_FILENAMES` environment variable to
# the absolute path of the `vk_swiftshader_icd.json` manifest file. This tells
# the Vulkan loader on your system to load it. Assuming you use the default
# installation directory this can be done on not-Windows via:
#
# export VK_ICD_FILENAMES="${HOME?}/.swiftshader/Linux/vk_swiftshader_icd.json"
#
# or on Windows via:
#
# set VK_ICD_FILENAMES=%USERPROFILE%\.swiftshader\Windows\vk_swiftshader_icd.json
#
# If you used a custom installation directory then the correct path will be
# printed to stdout.
#
# See https://vulkan.lunarg.com/doc/view/1.1.70.1/windows/loader_and_layer_interface.html
# for further details about the Vulkan loader and ICDs.
set -euo pipefail
set +e # Ignore errors if not found.
CYGPATH="$(which cygpath 2>/dev/null)"
set -e
# This isn't an argument so that we can set the swiftshader commit in one place
# for the whole project.
SWIFTSHADER_COMMIT=32f9332d1d7aacbdba7c1aa5df894bb1890bb2cc
SWIFTSHADER_SRC_DIR="$(mktemp --directory --tmpdir swiftshader_src_XXXXXX)"
SWIFTSHADER_BUILD_DIR="$(mktemp --directory --tmpdir swiftshader_build_XXXXXX)"
CC=${CC:-clang}
CXX=${CXX:-clang++}
if [[ -z "${CYGPATH}" ]]; then
# Anything that isn't Windows.
SWIFTSHADER_INSTALL_DIR="${1:-${HOME}/.swiftshader}"
PLATFORM_DIR="${SWIFTSHADER_BUILD_DIR}/Linux"
SET_VK_ICD_CMD="export VK_ICD_FILENAMES=${SWIFTSHADER_INSTALL_DIR}/vk_swiftshader_icd.json"
else
# Windows.
SWIFTSHADER_INSTALL_DIR="${1:-${USERPROFILE}\.swiftshader}"
PLATFORM_DIR="${SWIFTSHADER_BUILD_DIR}"'\Windows\'
SET_VK_ICD_CMD='set VK_ICD_FILENAMES='"${SWIFTSHADER_INSTALL_DIR}"'\vk_swiftshader_icd.json'
fi
# Shallow clone the specific swiftshader commit.
cd "${SWIFTSHADER_SRC_DIR}"
git init --quiet
git remote add origin https://github.com/google/swiftshader
git fetch --depth 1 origin "${SWIFTSHADER_COMMIT}"
git -c advice.detachedHead=false checkout "${SWIFTSHADER_COMMIT}"
# Build in a temporary directory
cmake -B "${SWIFTSHADER_BUILD_DIR}" \
-GNinja \
-DCMAKE_C_COMPILER=${CC} \
-DCMAKE_CXX_COMPILER=${CXX} \
-DSWIFTSHADER_BUILD_TESTS=OFF \
-DSWIFTSHADER_WARNINGS_AS_ERRORS=OFF \
.
# Build the project, choosing just the vk_swiftshader target.
cmake --build "${SWIFTSHADER_BUILD_DIR}" --config Release --target vk_swiftshader -- -k 0
echo "Installing to ${SWIFTSHADER_INSTALL_DIR}"
if [[ -d "${SWIFTSHADER_INSTALL_DIR}" ]]; then
echo " Install directory already exists, cleaning it"
rm -rf "${SWIFTSHADER_INSTALL_DIR}"
fi
if ! [[ -d "${PLATFORM_DIR}" ]]; then
echo "Build failed to create expected directory '${PLATFORM_DIR}'" >&2
exit 1
fi
# Copy the actual built artifacts into the installation directory
cp -rf "${PLATFORM_DIR}" "${SWIFTSHADER_INSTALL_DIR}"
# Keep track of the commit we are using.
echo "${SWIFTSHADER_COMMIT}" > "${SWIFTSHADER_INSTALL_DIR}/git-commit"
# Cleanup
rm -rf "${SWIFTSHADER_SRC_DIR}" "${SWIFTSHADER_BUILD_DIR}"
echo
echo "Ensure the following variable is set in your enviroment:"
echo " " "${SET_VK_ICD_CMD}"