# Copyright 2021 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 """Helper functions for configuring IREE and dependent project WORKSPACE files.""" load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") CUDA_TOOLKIT_ROOT_ENV_KEY = "IREE_CUDA_TOOLKIT_ROOT" # Our CI docker images use a stripped down CUDA directory tree in some # images, and it is tailored just to support building key elements. # When this is done, the IREE_CUDA_DEPS_DIR env var is set, and we # respect that here in order to match the CMake side (which needs it # because CUDA toolkit detection differs depending on whether it is # stripped down or not). # TODO: Simplify this on the CMake/docker side and update here to match. CUDA_DEPS_DIR_FOR_CI_ENV_KEY = "IREE_CUDA_DEPS_DIR" def cuda_auto_configure_impl(repository_ctx): env = repository_ctx.os.environ cuda_toolkit_root = None iree_repo_alias = repository_ctx.attr.iree_repo_alias # Probe environment for CUDA toolkit location. env_cuda_toolkit_root = env.get(CUDA_TOOLKIT_ROOT_ENV_KEY) env_cuda_deps_dir_for_ci = env.get(CUDA_DEPS_DIR_FOR_CI_ENV_KEY) if env_cuda_toolkit_root: cuda_toolkit_root = env_cuda_toolkit_root elif env_cuda_deps_dir_for_ci: cuda_toolkit_root = env_cuda_deps_dir_for_ci # Symlink the tree. libdevice_rel_path = "iree_local/libdevice.bc" if cuda_toolkit_root != None: # Symlink top-level directories we care about. repository_ctx.symlink(cuda_toolkit_root + "/include", "include") # TODO: Should be probing for the libdevice, as it can change from # version to version. repository_ctx.symlink( cuda_toolkit_root + "/nvvm/libdevice/libdevice.10.bc", libdevice_rel_path, ) repository_ctx.template( "BUILD", Label("%s//:build_tools/third_party/cuda/BUILD.template" % iree_repo_alias), { "%ENABLED%": "True" if cuda_toolkit_root else "False", "%LIBDEVICE_REL_PATH%": libdevice_rel_path if cuda_toolkit_root else "BUILD", "%IREE_REPO_ALIAS%": iree_repo_alias, }, ) cuda_auto_configure = repository_rule( environ = [ CUDA_DEPS_DIR_FOR_CI_ENV_KEY, CUDA_TOOLKIT_ROOT_ENV_KEY, ], implementation = cuda_auto_configure_impl, attrs = { "iree_repo_alias": attr.string(default = "@iree_core"), }, ) def configure_iree_cuda_deps(iree_repo_alias = None): maybe( cuda_auto_configure, name = "iree_cuda", iree_repo_alias = iree_repo_alias, ) def configure_iree_submodule_deps(iree_repo_alias = "@", iree_path = "./"): """Configure all of IREE's simple repository dependencies that come from submodules. Simple is defined here as just calls to `local_repository` or `new_local_repository`. This assumes you have a directory that includes IREE and all its submodules. Note that fetching a GitHub archive does not include submodules. Yes it is necessary to have both the workspace alias and path argument... Args: iree_repo_alias: The alias for the IREE repository. iree_path: The path to the IREE repository containing submodules """ maybe( native.local_repository, name = "com_google_googletest", path = paths.join(iree_path, "third_party/googletest"), ) maybe( native.new_local_repository, name = "com_github_dvidelabs_flatcc", build_file = iree_repo_alias + "//:build_tools/third_party/flatcc/BUILD.overlay", path = paths.join(iree_path, "third_party/flatcc"), ) maybe( native.new_local_repository, name = "vulkan_headers", build_file = iree_repo_alias + "//:build_tools/third_party/vulkan_headers/BUILD.overlay", path = paths.join(iree_path, "third_party/vulkan_headers"), ) maybe( native.local_repository, name = "stablehlo", path = paths.join(iree_path, "third_party/stablehlo"), ) maybe( native.local_repository, name = "com_google_benchmark", path = paths.join(iree_path, "third_party/benchmark"), ) maybe( native.local_repository, name = "cpuinfo", path = paths.join(iree_path, "third_party/cpuinfo"), ) maybe( native.new_local_repository, name = "spirv_cross", build_file = iree_repo_alias + "//:build_tools/third_party/spirv_cross/BUILD.overlay", path = paths.join(iree_path, "third_party/spirv_cross"), ) maybe( native.new_local_repository, name = "tracy_client", build_file = iree_repo_alias + "//:build_tools/third_party/tracy_client/BUILD.overlay", path = paths.join(iree_path, "third_party/tracy"), ) maybe( native.new_local_repository, name = "nccl", build_file = iree_repo_alias + "//:build_tools/third_party/nccl/BUILD.overlay", path = paths.join(iree_path, "third_party/nccl"), ) maybe( native.new_local_repository, name = "webgpu_headers", build_file = iree_repo_alias + "//:build_tools/third_party/webgpu-headers/BUILD.overlay", path = paths.join(iree_path, "third_party/webgpu-headers"), )