diff --git a/utils/bazel/WORKSPACE b/utils/bazel/WORKSPACE index 84e65e6f67b5a..5e28c3b67fc3b 100644 --- a/utils/bazel/WORKSPACE +++ b/utils/bazel/WORKSPACE @@ -164,6 +164,15 @@ maybe( url = "https://github.com/pybind/pybind11/archive/v2.10.3.zip", ) +maybe( + http_archive, + name = "pyyaml", + build_file = "@llvm-raw//utils/bazel/third_party_build:pyyaml.BUILD", + sha256 = "f0a35d7f282a6d6b1a4f3f3965ef5c124e30ed27a0088efb97c0977268fd671f", + strip_prefix = "pyyaml-5.1/lib3", + url = "https://github.com/yaml/pyyaml/archive/refs/tags/5.1.zip", +) + maybe( http_archive, name = "robin_map", diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 9e2828eaf098c..fe6c1257e33b8 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -9,6 +9,7 @@ load("@rules_python//python:defs.bzl", "py_binary") load( ":libc_build_rules.bzl", "libc_function", + "libc_generated_header", "libc_header_library", "libc_math_function", "libc_support_library", @@ -88,6 +89,14 @@ py_binary( srcs = glob(["utils/hdrgen/hdrgen/**/*.py"]), imports = ["utils/hdrgen"], main = "utils/hdrgen/hdrgen/main.py", + deps = ["@pyyaml//:yaml"], +) + +libc_generated_header( + name = "include_stdbit_h", + hdr = "staging/include/stdbit.h", + other_srcs = ["include/stdbit.h.def"], + yaml_template = "include/stdbit.yaml", ) # Library containing all headers that can be transitively included by generated llvm-libc diff --git a/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl b/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl index 7fe263ab08f71..e123e4d32b785 100644 --- a/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl +++ b/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl @@ -248,6 +248,36 @@ def libc_header_library(name, hdrs, deps = [], **kwargs): **kwargs ) +def libc_generated_header(name, hdr, yaml_template, other_srcs = []): + """Generates a libc header file from YAML template. + + Args: + name: Name of the genrule target. + hdr: Path of the header file to generate. + yaml_template: Path of the YAML template file. + other_srcs: Other files required to generate the header, if any. + """ + hdrgen = "//libc:hdrgen" + cmd = "$(location {hdrgen}) $(location {yaml}) -o $@".format( + hdrgen = hdrgen, + yaml = yaml_template, + ) + + if not hdr.startswith("staging/"): + fail( + "Generated headers should be placed in a 'staging/' directory " + + "so that they can be treated differently from constant source files " + + "when bootstrapping builds.", + ) + + native.genrule( + name = name, + outs = [hdr], + srcs = [yaml_template] + other_srcs, + cmd = cmd, + tools = [hdrgen], + ) + def libc_math_function( name, additional_deps = None): diff --git a/utils/bazel/third_party_build/pyyaml.BUILD b/utils/bazel/third_party_build/pyyaml.BUILD new file mode 100644 index 0000000000000..78261a7f60d9b --- /dev/null +++ b/utils/bazel/third_party_build/pyyaml.BUILD @@ -0,0 +1,16 @@ +# 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 + +load("@rules_python//python:defs.bzl", "py_library") + +package( + default_visibility = ["//visibility:public"], + # BSD/MIT-like license (for PyYAML) + licenses = ["notice"], +) + +py_library( + name = "yaml", + srcs = glob(["yaml/*.py"]), +)