#!/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 # # 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}"