[libc][bazel] Support generating public libc headers in Bazel builds. (#145381)
Running `hdrgen` in Bazel hermetically requires adding a new dependency
on PyYAML. This PR uses PyYAML version 5.1 due to keep in line with the
docs:
b878e0d118/libc/docs/dev/header_generation.rst (L22)
See https://github.com/llvm/llvm-project/issues/134780.
Generated headers are placed in a `staging/` directory so that they have
the opportunity to be treated differently from non-generated headers.
This is a follow-up to https://github.com/llvm/llvm-project/pull/141256,
which was reverted in https://github.com/llvm/llvm-project/pull/143001
because it caused downstream failures when bootstrapping builds.
This commit is contained in:
@@ -164,6 +164,15 @@ maybe(
|
|||||||
url = "https://github.com/pybind/pybind11/archive/v2.10.3.zip",
|
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(
|
maybe(
|
||||||
http_archive,
|
http_archive,
|
||||||
name = "robin_map",
|
name = "robin_map",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ load("@rules_python//python:defs.bzl", "py_binary")
|
|||||||
load(
|
load(
|
||||||
":libc_build_rules.bzl",
|
":libc_build_rules.bzl",
|
||||||
"libc_function",
|
"libc_function",
|
||||||
|
"libc_generated_header",
|
||||||
"libc_header_library",
|
"libc_header_library",
|
||||||
"libc_math_function",
|
"libc_math_function",
|
||||||
"libc_support_library",
|
"libc_support_library",
|
||||||
@@ -88,6 +89,14 @@ py_binary(
|
|||||||
srcs = glob(["utils/hdrgen/hdrgen/**/*.py"]),
|
srcs = glob(["utils/hdrgen/hdrgen/**/*.py"]),
|
||||||
imports = ["utils/hdrgen"],
|
imports = ["utils/hdrgen"],
|
||||||
main = "utils/hdrgen/hdrgen/main.py",
|
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
|
# Library containing all headers that can be transitively included by generated llvm-libc
|
||||||
|
|||||||
@@ -248,6 +248,36 @@ def libc_header_library(name, hdrs, deps = [], **kwargs):
|
|||||||
**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(
|
def libc_math_function(
|
||||||
name,
|
name,
|
||||||
additional_deps = None):
|
additional_deps = None):
|
||||||
|
|||||||
16
utils/bazel/third_party_build/pyyaml.BUILD
Normal file
16
utils/bazel/third_party_build/pyyaml.BUILD
Normal file
@@ -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"]),
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user