# This file is 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 macros to configure the LLVM overlay project.""" load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") load(":zlib.bzl", "llvm_zlib_disable", "llvm_zlib_system") load(":terminfo.bzl", "llvm_terminfo_disable", "llvm_terminfo_system") # Directory of overlay files relative to WORKSPACE DEFAULT_OVERLAY_PATH = "llvm-project-overlay" DEFAULT_TARGETS = [ "AArch64", "AMDGPU", "ARM", "AVR", "BPF", "Hexagon", "Lanai", "Mips", "MSP430", "NVPTX", "PowerPC", "RISCV", "Sparc", "SystemZ", "WebAssembly", "X86", "XCore", ] def _overlay_directories(repository_ctx): src_path = repository_ctx.path(Label("//:WORKSPACE")).dirname bazel_path = src_path.get_child("utils").get_child("bazel") overlay_path = bazel_path.get_child("llvm-project-overlay") script_path = bazel_path.get_child("overlay_directories.py") python_bin = repository_ctx.which("python3") if not python_bin: # Windows typically just defines "python" as python3. The script itself # contains a check to ensure python3. python_bin = repository_ctx.which("python") if not python_bin: fail("Failed to find python3 binary") cmd = [ python_bin, script_path, "--src", src_path, "--overlay", overlay_path, "--target", ".", ] exec_result = repository_ctx.execute(cmd, timeout = 20) if exec_result.return_code != 0: fail(("Failed to execute overlay script: '{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, )) def _llvm_configure_impl(repository_ctx): _overlay_directories(repository_ctx) # Create a starlark file with the requested LLVM targets. targets = repository_ctx.attr.targets repository_ctx.file( "llvm/targets.bzl", content = "llvm_targets = " + str(targets), executable = False, ) llvm_configure = repository_rule( implementation = _llvm_configure_impl, local = True, configure = True, attrs = { "targets": attr.string_list(default = DEFAULT_TARGETS), }, ) def llvm_disable_optional_support_deps(): maybe( llvm_zlib_disable, name = "llvm_zlib", ) maybe( llvm_terminfo_disable, name = "llvm_terminfo", ) def llvm_use_system_support_deps(): maybe( llvm_zlib_system, name = "llvm_zlib", ) maybe( llvm_terminfo_system, name = "llvm_terminfo", )