blob: 0f3d0fda3d4d73ca41a13f54ea8db84fd4ed5f67 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2023 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 illustrates how IREE can be built with various forms of LLVM
# installations with the option -DIREE_BUILD_BUNDLED_LLVM=OFF set, disabling
# a source dependency on the bundled LLVM submodule.
#
# Usage:
# byo_llvm.sh build_llvm && \
# byo_llvm.sh build_mlir && \
# byo_llvm.sh build_iree
#
# Additionally, to run tests:
# byo_llvm.sh test_iree
#
# This script has minimal configurability, which can be extended as needed. The
# defaults should suffice for testing on CI. Different configurations are
# possible (i.e. building MLIR bundled with LLVM vs standalone), and this
# is just normal CMake package management options.
#
# Fully separating LLVM+LLD+CLANG from MLIR and from IREE enables maximum
# flexibility for the cases where multiple teams are responsible for
# different parts. Note that IREE often has a tight dependency on specific
# MLIR commits, and the bundled submodule often carries patches and fixes
# required for full functionality of all backends.
TD="$(cd $(dirname $0) && pwd)"
REPO_ROOT="$(cd $TD/../.. && pwd)"
LLVM_SOURCE_DIR="${LLVM_SOURCE_DIR:-${REPO_ROOT}/third_party/llvm-project}"
IREE_BYOLLVM_BUILD_DIR="${IREE_BYOLLVM_BUILD_DIR:-${REPO_ROOT}/../iree-byollvm-build}"
IREE_BYOLLVM_INSTALL_DIR="${IREE_BYOLLVM_INSTALL_DIR:-${REPO_ROOT}/../iree-byollvm-install}"
# Canonicalize as absolute paths. These end up in CMake variables such as
# CMAKE_MODULE_PATH, where relative paths are a footgun as CMake gets invoked
# from different directories.
LLVM_SOURCE_DIR="$(realpath -m "${LLVM_SOURCE_DIR}")"
IREE_BYOLLVM_BUILD_DIR="$(realpath -m "${IREE_BYOLLVM_BUILD_DIR}")"
IREE_BYOLLVM_INSTALL_DIR="$(realpath -m "${IREE_BYOLLVM_INSTALL_DIR}")"
echo "Paths canonicalized as:"
echo "LLVM_SOURCE_DIR=${LLVM_SOURCE_DIR}"
echo "IREE_BYOLLVM_BUILD_DIR=${IREE_BYOLLVM_BUILD_DIR}"
echo "IREE_BYOLLVM_INSTALL_DIR=${IREE_BYOLLVM_INSTALL_DIR}"
command="$1"
shift
# Detect commands.
has_ccache=false
if (command -v ccache &> /dev/null); then
has_ccache=true
fi
has_clang=false
if (command -v clang &> /dev/null) && (command -v clang++ &> /dev/null); then
has_clang=true
fi
has_lld=false
if (command -v lld &> /dev/null); then
has_lld=true
fi
python3_command=""
if (command -v python3 &> /dev/null); then
python3_command="python3"
elif (command -v python &> /dev/null); then
python3_command="python"
fi
set -euo pipefail
print_toolchain_config() {
if $has_ccache; then
echo -n "-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache "
fi
if $has_clang; then
echo "-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++"
fi
}
do_build_llvm() {
echo "*********************** BUILDING LLVM *********************************"
main_build_dir="${IREE_BYOLLVM_BUILD_DIR}/llvm"
main_install_dir="${IREE_BYOLLVM_INSTALL_DIR}/llvm"
targets_to_build="${LLVM_TARGETS_TO_BUILD:-X86}"
cmake_options="-DLLVM_TARGETS_TO_BUILD='${targets_to_build}'"
cmake_options="${cmake_options} -DCMAKE_BUILD_TYPE=Release"
cmake_options="${cmake_options} -C $TD/llvm_config.cmake"
cmake_options="${cmake_options} -DCMAKE_INSTALL_PREFIX=${main_install_dir}"
cmake_options="${cmake_options} $(print_toolchain_config)"
if $has_lld; then
cmake_options="${cmake_options} -DLLVM_ENABLE_LLD=ON"
fi
echo "Source Directory: ${LLVM_SOURCE_DIR}"
echo "Build Directory: ${main_build_dir}"
echo "CMake Options: ${cmake_options}"
cmake -GNinja -S "${LLVM_SOURCE_DIR}/llvm" -B "${main_build_dir}" \
$cmake_options
cmake --build "${main_build_dir}" \
--target install-toolchain-distribution \
--target install-development-distribution
}
do_build_mlir() {
echo "*********************** BUILDING MLIR *********************************"
main_install_dir="${IREE_BYOLLVM_INSTALL_DIR}/llvm"
mlir_build_dir="${IREE_BYOLLVM_BUILD_DIR}/mlir"
mlir_install_dir="${IREE_BYOLLVM_INSTALL_DIR}/mlir"
cmake_options="-DLLVM_DIR='${main_install_dir}/lib/cmake/llvm'"
cmake_options="${cmake_options} -DPython3_EXECUTABLE='$(which $python3_command)'"
cmake_options="${cmake_options} -DMLIR_ENABLE_BINDINGS_PYTHON=ON"
cmake_options="${cmake_options} -DCMAKE_INSTALL_PREFIX=${mlir_install_dir}"
cmake_options="${cmake_options} -C $TD/mlir_config.cmake"
cmake_options="${cmake_options} $(print_toolchain_config)"
if $has_lld; then
cmake_options="${cmake_options} -DLLVM_ENABLE_LLD=ON"
fi
echo "Source Directory: ${LLVM_SOURCE_DIR}"
echo "Build Directory: ${mlir_build_dir}"
echo "CMake Options: ${cmake_options}"
cmake -GNinja -S "${LLVM_SOURCE_DIR}/mlir" -B "${mlir_build_dir}" \
$cmake_options
cmake --build "${mlir_build_dir}" \
--target install-mlirdevelopment-distribution
}
print_iree_config() {
llvm_cmake_dir="${IREE_BYOLLVM_INSTALL_DIR}/llvm/lib/cmake/llvm"
lld_cmake_dir="${IREE_BYOLLVM_INSTALL_DIR}/llvm/lib/cmake/lld"
clang_cmake_dir="${IREE_BYOLLVM_INSTALL_DIR}/llvm/lib/cmake/clang"
mlir_cmake_dir="${IREE_BYOLLVM_BUILD_DIR}/mlir/lib/cmake/mlir"
if ! [ -d "$llvm_cmake_dir" ]; then
echo "WARNING: CMake dir does not exist ($llvm_cmake_dir)" >&2
return 1
fi
if ! [ -d "$lld_cmake_dir" ]; then
echo "WARNING: CMake dir does not exist ($lld_cmake_dir)" >&2
return 1
fi
if ! [ -d "$clang_cmake_dir" ]; then
echo "WARNING: CMake dir does not exist ($clang_cmake_dir)" >&2
return 1
fi
if ! [ -d "$mlir_cmake_dir" ]; then
echo "WARNING: CMake dir does not exist ($mlir_cmake_dir)" >&2
return 1
fi
echo "-DLLVM_DIR='$llvm_cmake_dir' -DLLD_DIR='$lld_cmake_dir' -DMLIR_DIR='$mlir_cmake_dir' -DClang_DIR='$clang_cmake_dir' -DIREE_BUILD_BUNDLED_LLVM=OFF"
}
do_build_iree() {
echo "*********************** BUILDING IREE *********************************"
iree_build_dir="${IREE_BYOLLVM_BUILD_DIR}/iree"
iree_install_dir="${IREE_BYOLLVM_INSTALL_DIR}/iree"
cmake_options="$(print_iree_config)"
cmake_options="${cmake_options} -DPython3_EXECUTABLE='$(which $python3_command)'"
cmake_options="${cmake_options} -DIREE_BUILD_PYTHON_BINDINGS=ON"
# Feel free to manually enable or disable any backend, for example
# -DIREE_TARGET_BACKEND_LLVM_CPU=OFF
# Be aware though that several tests in IREE's own suite are currently
# assuming that certain backends are enabled (#14034), so that may cause test
# failures, but that's a test-only issue.
cmake_options="${cmake_options} -DIREE_TARGET_BACKEND_DEFAULTS=OFF"
cmake_options="${cmake_options} -DIREE_TARGET_BACKEND_LLVM_CPU=ON"
cmake_options="${cmake_options} -DIREE_HAL_DRIVER_DEFAULTS=OFF"
cmake_options="${cmake_options} -DIREE_HAL_DRIVER_LOCAL_SYNC=ON"
cmake_options="${cmake_options} -DIREE_HAL_DRIVER_LOCAL_TASK=ON"
cmake_options="${cmake_options} -DCMAKE_BUILD_TYPE=Release"
cmake_options="${cmake_options} $(print_toolchain_config)"
if $has_lld; then
cmake_options="${cmake_options} -DIREE_ENABLE_LLD=ON"
fi
echo "Source Directory: ${REPO_ROOT}"
echo "Build Directory: ${iree_build_dir}"
echo "CMake Options: ${cmake_options}"
cmake -GNinja -S "${REPO_ROOT}" -B "${iree_build_dir}" \
$cmake_options
cmake --build "${iree_build_dir}"
cmake -DCMAKE_INSTALL_PREFIX="${iree_install_dir}" -P "${iree_build_dir}/cmake_install.cmake"
}
do_test_iree() {
echo "*********************** TESTING IREE **********************************"
iree_build_dir="${IREE_BYOLLVM_BUILD_DIR}/iree"
iree_install_dir="${IREE_BYOLLVM_INSTALL_DIR}/iree"
echo "Source Directory: ${REPO_ROOT}"
echo "Build Directory: ${iree_build_dir}"
cmake --build "${iree_build_dir}" --target iree-test-deps
"${REPO_ROOT}/build_tools/cmake/ctest_all.sh" "${iree_build_dir}"
}
case "${command}" in
build_llvm)
do_build_llvm
;;
build_mlir)
do_build_mlir
;;
build_iree)
do_build_iree
;;
test_iree)
do_test_iree
;;
*)
echo "ERROR: Expected command of 'build_llvm', 'clean_install' (got '${command}')"
exit 1
;;
esac