Test the bring-your-own-LLVM path. (#14035)
* Adds a`byo_llvm` CI job. Do we want to disable running it on PRs? It's
enabled for now so we get live coverage while iterating on this PR but
we can always flip that.
* Note: the current CI job was the first to have ccache enabled so it
didn't benefit from ccache hits; subsequent ones should be cheaper (this
initial one took 15 minutes).
* Changes to the (user-facing) `byo_llvm.sh` script:
* Canonicalize paths to absolute paths. These end up in CMake variables
like `CMAKE_MODULE_PATH` where relative paths are a footgun.
* Defaults to buiding the `llvm-cpu` target backend. Users can still
disable it, but at the moment about 20 tests fail without it enabled
(filed #14034). Not a problem for users unless they run IREE tests.
Until that's fixed, enabling that here allows to keep the CI job aligned
with the default, and increases coverage (otherwise, users who do enable
`llvm-cpu` would be outside of CI coverage).
* Changes both the name and the default values of the environment
variables controlling build/install dirs. **Caveat existing users, this
could break incremental rebuilds -- as this is moving to a new
directory, it will lose existing values of CMake variables, etc.**
* `LLVM_BUILD_DIR` changed to `IREE_BYOLLVM_BUILD_DIR` because that's
only the parent directory under which we create `llvm/`, `mlir/`,
`iree/` subdirs. The former name made it sound like it was the `llvm/`
build dir itself.
* Default value `iree-llvm-build` likewise changed to
`iree-byollvm-build`.
* Changes to general CMake code:
* Continuing along the lines of earlier `byo_llvm` fixes (#13968) which
introduced `IREE_CLANG_BINARY` to refer to the `clang` binary regardless
of whether it's a CMake target (which is only the case in the bundled
build, not in `byo_llvm`), running tests revealed that we needed the
same for `lld`, so here comes `IREE_LLD_BINARY`, so we can execute `lld`
even if we don't have a `IREE_LLD_TARGET`.
* The one part of the code that decidedly doesn't currently work with
`byo_llvm` is the linking part of the Compiler API, because it relies on
linking against LLD libraries, and for that it currently requires
IREE_LLD_TARGET. I don't know how easy or feasible that would be to
overcome (though that might be easy if those LLD libraries are exported
by the LLVM install).
* Changes to tests:
* `assign_target_devices.mlir` was assuming the `vulkan-spirv` backend
to be enabled.
* A number of tests, mainly tests that depend on the Compiler API, are
skipped when `IREE_LLD_TARGET` is not defined.
Fixes #13989
diff --git a/build_tools/cmake/build_and_test_byo_llvm.sh b/build_tools/cmake/build_and_test_byo_llvm.sh
new file mode 100755
index 0000000..a2120ac
--- /dev/null
+++ b/build_tools/cmake/build_and_test_byo_llvm.sh
@@ -0,0 +1,35 @@
+#!/bin/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
+
+# Build and test, using CMake/CTest, with the bring-your-own-LLVM path.
+
+set -xeuo pipefail
+
+source build_tools/cmake/setup_ccache.sh
+
+# Environment variables read by byo_llvm.sh.
+export IREE_BYOLLVM_BUILD_DIR="${1:-build-byo-llvm}"
+export IREE_BYOLLVM_INSTALL_DIR="${IREE_BYOLLVM_BUILD_DIR}/install"
+
+# Note: by using the `build_llvm` action here, we are exercising byo_llvm.sh's
+# ability to build LLVM... from our own third_party/llvm-project. That's not
+# the most intuitive interpretation of "bring your own LLVM", since as far as
+# the source repository is concerned, that's just the standard IREE-bundled one,
+# but that exists for good reasons as some users need control more over the
+# building and packaging than over the source repository, and that's good to
+# have test coverage for, and of course that's more convenient for us to test.
+build_tools/scripts/byo_llvm.sh build_llvm
+
+build_tools/scripts/byo_llvm.sh build_mlir
+build_tools/scripts/byo_llvm.sh build_iree
+
+echo "*********************** TESTING IREE **********************************"
+iree_build_dir="${IREE_BYOLLVM_BUILD_DIR}/iree"
+echo "Build Directory: ${iree_build_dir}"
+cmake --build "${iree_build_dir}" --target iree-test-deps
+build_tools/cmake/ctest_all.sh "${iree_build_dir}"