| # 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") | |
| IREE_INPUT_TORCH_ENV_KEY = "IREE_INPUT_TORCH" | |
| 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. | |
| # TODO(#15332): Dockerfiles no longer include these deps. Simplify. | |
| 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 torch_mlir_auto_configure_impl(repository_ctx): | |
| """Conditionally configures torch-mlir based on IREE_INPUT_TORCH env var.""" | |
| env = repository_ctx.os.environ | |
| iree_repo_alias = repository_ctx.attr.iree_repo_alias | |
| enabled = env.get(IREE_INPUT_TORCH_ENV_KEY, "OFF").upper() in ["ON", "TRUE", "1", "YES"] | |
| if enabled: | |
| # Run torch-mlir's configure to create the overlay. | |
| # We need to find the torch-mlir source and run its overlay script. | |
| torch_mlir_path = repository_ctx.path( | |
| Label("%s//:third_party/torch-mlir/CMakeLists.txt" % iree_repo_alias), | |
| ).dirname | |
| bazel_path = torch_mlir_path.get_child("utils").get_child("bazel") | |
| overlay_path = bazel_path.get_child("torch-mlir-overlay") | |
| script_path = bazel_path.get_child("overlay_directories.py") | |
| python_bin = repository_ctx.which("python3") | |
| if not python_bin: | |
| python_bin = repository_ctx.which("python") | |
| if not python_bin: | |
| fail("Failed to find python3 binary for torch-mlir configuration") | |
| cmd = [ | |
| python_bin, | |
| script_path, | |
| "--src", | |
| torch_mlir_path, | |
| "--overlay", | |
| overlay_path, | |
| "--target", | |
| ".", | |
| ] | |
| exec_result = repository_ctx.execute(cmd, timeout = 60) | |
| if exec_result.return_code != 0: | |
| fail(("Failed to configure torch-mlir: '{cmd}'\n" + | |
| "Exited with code {return_code}\n" + | |
| "stdout:\n{stdout}\n" + | |
| "stderr:\n{stderr}\n").format( | |
| cmd = " ".join([str(arg) for arg in cmd]), | |
| return_code = exec_result.return_code, | |
| stdout = exec_result.stdout, | |
| stderr = exec_result.stderr, | |
| )) | |
| else: | |
| # Create stub repository when torch-mlir is disabled. | |
| repository_ctx.file( | |
| "BUILD.bazel", | |
| content = """# Stub: torch-mlir disabled (IREE_INPUT_TORCH != ON) | |
| package(default_visibility = ["//visibility:public"]) | |
| # Provide empty targets that dependent code can reference. | |
| # These will fail at build time if actually used. | |
| """, | |
| ) | |
| torch_mlir_auto_configure = repository_rule( | |
| environ = [IREE_INPUT_TORCH_ENV_KEY], | |
| implementation = torch_mlir_auto_configure_impl, | |
| local = True, | |
| attrs = { | |
| "iree_repo_alias": attr.string(default = "@iree_core"), | |
| }, | |
| ) | |
| def configure_iree_torch_mlir_deps(iree_repo_alias = None): | |
| maybe( | |
| torch_mlir_auto_configure, | |
| name = "torch-mlir", | |
| iree_repo_alias = iree_repo_alias, | |
| ) | |
| 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.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 = "hsa_runtime_headers", | |
| build_file = iree_repo_alias + "//:build_tools/third_party/hsa-runtime-headers/BUILD.overlay", | |
| path = paths.join(iree_path, "third_party/hsa-runtime-headers"), | |
| ) | |
| 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"), | |
| ) |