[libc-commits] [libc] 166f996 - [libc][bazel] Add generation for public headers (#184889)

via libc-commits libc-commits at lists.llvm.org
Fri Mar 27 09:44:37 PDT 2026


Author: Michael Jones
Date: 2026-03-27T09:44:32-07:00
New Revision: 166f996c44fd94feae3ccf83073ebe17041ceab1

URL: https://github.com/llvm/llvm-project/commit/166f996c44fd94feae3ccf83073ebe17041ceab1
DIFF: https://github.com/llvm/llvm-project/commit/166f996c44fd94feae3ccf83073ebe17041ceab1.diff

LOG: [libc][bazel] Add generation for public headers (#184889)

Previously there was a single rule for stdbit, this PR adds generated
header targets for the rest of the linux headers. It also adds a
cc_library
for all of the public headers which also includes the types and macros
headers.

Added: 
    

Modified: 
    libc/include/sys/socket.yaml
    utils/bazel/llvm-project-overlay/libc/BUILD.bazel
    utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl

Removed: 
    


################################################################################
diff  --git a/libc/include/sys/socket.yaml b/libc/include/sys/socket.yaml
index 945e730413adb..1be7190fe795d 100644
--- a/libc/include/sys/socket.yaml
+++ b/libc/include/sys/socket.yaml
@@ -18,7 +18,7 @@ functions:
     return_type: int
     arguments:
       - type: int
-      - type: sockaddr *__restrict
+      - type: struct sockaddr *__restrict
       - type: socklen_t *__restrict
   - name: bind
     standards:

diff  --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index 925670785d19c..926f177681f96 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -5,11 +5,13 @@
 # LLVM libc project.
 load("@bazel_skylib//lib:selects.bzl", "selects")
 load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
+load("@rules_cc//cc:defs.bzl", "cc_library")
 load("@rules_python//python:defs.bzl", "py_binary")
 load(
     ":libc_build_rules.bzl",
     "libc_function",
     "libc_generated_header",
+    "libc_header_info",
     "libc_header_library",
     "libc_math_function",
     "libc_support_library",
@@ -83,6 +85,22 @@ config_setting(
     flag_values = {":mpc": "system"},
 )
 
+# A flag to enable modular format for printf.
+# Usage: `-- at llvm-project//libc:modular_format=<disable|enable>`.
+string_flag(
+    name = "modular_format",
+    build_setting_default = "disable",
+    values = [
+        "disable",
+        "enable",
+    ],
+)
+
+config_setting(
+    name = "modular_format_enable",
+    flag_values = {":modular_format": "enable"},
+)
+
 ########################### Header Generation ##################################
 
 py_binary(
@@ -93,23 +111,268 @@ py_binary(
     deps = ["@pyyaml//:yaml"],
 )
 
+LLVM_LIBC_HEADERS = [
+    libc_header_info(
+        "arpa/inet",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "assert",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "complex",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "elf",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "endian",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "errno",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "fcntl",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "features",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "float",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "inttypes",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "limits",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "link",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "locale",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "math",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "netinet/in",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "poll",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sched",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "signal",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "stdbit",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "stdckdint",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "stdfix",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "stdint",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "stdio",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sysexits",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/auxv",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/epoll",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/ioctl",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/mman",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/prctl",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/random",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/resource",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/select",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/socket",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/stat",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/syscall",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/time",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/types",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "sys/wait",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "termios",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "time",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "unistd",
+        has_def_template = True,
+    ),
+    libc_header_info(
+        "wchar",
+        has_def_template = True,
+    ),
+    libc_header_info("ctype"),
+    libc_header_info("dirent"),
+    libc_header_info("dlfcn"),
+    libc_header_info("fenv"),
+    libc_header_info("nl_types"),
+    libc_header_info("pthread"),
+    libc_header_info("search"),
+    libc_header_info("setjmp"),
+    libc_header_info("spawn"),
+    libc_header_info("string"),
+    libc_header_info("strings"),
+    libc_header_info("sys/ipc"),
+    libc_header_info("sys/statvfs"),
+    libc_header_info("sys/utsname"),
+    libc_header_info("threads"),
+    libc_header_info("uchar"),
+    libc_header_info("wctype"),
+    libc_header_info(
+        "stdlib",
+        has_def_template = True,
+        other_srcs = ["include/stdlib-malloc.yaml"],
+    ),
+    libc_header_info(
+        "malloc",
+        other_srcs = ["include/stdlib-malloc.yaml"],
+    ),
+]
+
+[
+    libc_generated_header(
+        name = info.target_name,
+        hdr = info.staging_path,
+        other_srcs = info.other_srcs,
+        yaml_template = info.yaml_template,
+    )
+    for info in LLVM_LIBC_HEADERS
+]
+
+# needed for startup and VDSO. Doesn't get placed in /include so is handled separately.
 libc_generated_header(
-    name = "include_stdbit_h",
-    hdr = "staging/include/stdbit.h",
-    other_srcs = ["include/stdbit.h.def"],
-    yaml_template = "include/stdbit.yaml",
+    name = "hdr_elf_proxy_h",
+    hdr = "staging/hdr/elf_proxy.h",
+    proxy = True,
+    yaml_template = "include/elf.yaml",
+)
+
+# Static headers that need to be in staging/include
+STATIC_HEADERS = glob(
+    ["include/llvm-libc-types/**/*.h"],
+) + glob(
+    ["include/llvm-libc-macros/**/*.h"],
+    exclude = [
+        "include/llvm-libc-macros/_LIBC_MODULAR_FORMAT_PRINTF.h",
+        "include/llvm-libc-macros/_LIBC_MODULAR_FORMAT_PRINTF-disable.h",
+    ],
+) + ["include/__llvm-libc-common.h"]
+
+genrule(
+    name = "copy_llvm_libc_static_headers",
+    srcs = STATIC_HEADERS,
+    outs = ["staging/" + f for f in STATIC_HEADERS],
+    cmd = """srcs=($(SRCS))\n outs=($(OUTS))\n for i in "$${!srcs[@]}"; do cp "$${srcs[$$i]}" "$${outs[$$i]}"; done""",
+)
+
+genrule(
+    name = "copy_modular_format_header",
+    srcs = select({
+        ":modular_format_enable": ["include/llvm-libc-macros/_LIBC_MODULAR_FORMAT_PRINTF.h"],
+        "//conditions:default": ["include/llvm-libc-macros/_LIBC_MODULAR_FORMAT_PRINTF-disable.h"],
+    }),
+    outs = ["staging/include/llvm-libc-macros/_LIBC_MODULAR_FORMAT_PRINTF.h"],
+    cmd = "cp $< $@",
+)
+
+STATIC_AND_CONDITIONAL_HEADERS = STATIC_HEADERS + ["include/llvm-libc-macros/_LIBC_MODULAR_FORMAT_PRINTF.h"]
+
+cc_library(
+    name = "public_headers",
+    hdrs = [header.target_name for header in LLVM_LIBC_HEADERS],
+    includes = ["staging/include"],
+    textual_hdrs = ["staging/" + f for f in STATIC_AND_CONDITIONAL_HEADERS],
+    deps = [
+        ":copy_llvm_libc_static_headers",
+        ":copy_modular_format_header",
+    ],
 )
 
-# Library containing all headers that can be transitively included by generated llvm-libc
-# public headers (or by the unit tests).
+# Textual versions of the static headers. These are taken from the source tree
+# and are separate from the generated headers above. They are used for
+# testing purposes.
 libc_support_library(
     name = "public_headers_deps",
-    textual_hdrs = [
-        "include/__llvm-libc-common.h",
-    ] + glob([
-        "include/llvm-libc-types/**/*.h",
-        "include/llvm-libc-macros/**/*.h",
-    ]),
+    textual_hdrs = STATIC_AND_CONDITIONAL_HEADERS,
 )
 
 ################################## Base Config #################################

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 3f9918df76f6b..4a405c88afdc3 100644
--- a/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
+++ b/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
@@ -255,7 +255,7 @@ def libc_header_library(name, hdrs, deps = [], **kwargs):
         enforce_headers_only = True,
     )
 
-def libc_generated_header(name, hdr, yaml_template, other_srcs = []):
+def libc_generated_header(name, hdr, yaml_template, other_srcs = [], proxy = False):
     """Generates a libc header file from YAML template.
 
     Args:
@@ -263,12 +263,13 @@ def libc_generated_header(name, hdr, yaml_template, other_srcs = []):
       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.
+      proxy: Whether this is a proxy header with slightly 
diff erent generation results.
     """
     hdrgen = "//libc:hdrgen"
     cmd = "$(location {hdrgen}) $(location {yaml}) -o $@".format(
         hdrgen = hdrgen,
         yaml = yaml_template,
-    )
+    ) + (" --proxy" if proxy else "")
 
     if not hdr.startswith("staging/"):
         fail(
@@ -285,6 +286,17 @@ def libc_generated_header(name, hdr, yaml_template, other_srcs = []):
         tools = [hdrgen],
     )
 
+def libc_header_info(
+        name,
+        has_def_template = False,
+        other_srcs = []):
+    return struct(
+        target_name = "include_{}_h".format(name.replace("/", "_")),
+        staging_path = "staging/include/{}.h".format(name),
+        yaml_template = "include/{}.yaml".format(name),
+        other_srcs = other_srcs + (["include/{}.h.def".format(name)] if has_def_template else []),
+    )
+
 def libc_math_function(
         name,
         additional_deps = None):


        


More information about the libc-commits mailing list