[llvm] [libc][bazel] Add a repo with linux kernel UAPI headers (PR #216867)
Jackson Stogel via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 26 20:16:16 PDT 2026
https://github.com/jtstogel updated https://github.com/llvm/llvm-project/pull/216867
>From 28ef86f0802c787d56f819fb6644f847d706be08 Mon Sep 17 00:00:00 2001
From: jtstogel <jtstogel at gmail.com>
Date: Wed, 15 Jul 2026 10:57:17 -0700
Subject: [PATCH] [libc][bazel] Add a repo with linux kernel UAPI headers
This will be used to support libc's -DFULL_BUILD option, which uses `-nostdlibinc` and thus requires a copy of linux kernel headers.
---
utils/bazel/MODULE.bazel | 1 +
utils/bazel/MODULE.bazel.lock | 6 ++-
utils/bazel/extensions.bzl | 2 +
utils/bazel/linux_uapi.bzl | 74 +++++++++++++++++++++++++++++++++++
4 files changed, 82 insertions(+), 1 deletion(-)
create mode 100644 utils/bazel/linux_uapi.bzl
diff --git a/utils/bazel/MODULE.bazel b/utils/bazel/MODULE.bazel
index d836c8bc72448..973438734f917 100644
--- a/utils/bazel/MODULE.bazel
+++ b/utils/bazel/MODULE.bazel
@@ -36,6 +36,7 @@ bazel_dep(name = "llvm", version = "0.8.5", dev_dependency = True)
llvm_repos_extension = use_extension(":extensions.bzl", "llvm_repos_extension")
use_repo(
llvm_repos_extension,
+ "linux_uapi",
"llvm-raw",
"pyyaml",
"vulkan_sdk",
diff --git a/utils/bazel/MODULE.bazel.lock b/utils/bazel/MODULE.bazel.lock
index 03931eff76777..7d1e6c6b36daa 100644
--- a/utils/bazel/MODULE.bazel.lock
+++ b/utils/bazel/MODULE.bazel.lock
@@ -318,7 +318,7 @@
"moduleExtensions": {
"//:extensions.bzl%llvm_repos_extension": {
"general": {
- "bzlTransitiveDigest": "AfKN+Lbkiv3K+Q5JzNJsTiBryWarkkhFl9xAwjGjVfw=",
+ "bzlTransitiveDigest": "nmqMTTDURvBeR6PLzbfX1EEbe79FTb8wSzrT13UXlFk=",
"usagesDigest": "X0yUkkWyxQ2Y5oZVDkRSE/K4YkDWo1IjhHsL+1weKyU=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
@@ -335,6 +335,10 @@
"repoRuleId": "@@//:vulkan_sdk.bzl%vulkan_sdk_setup",
"attributes": {}
},
+ "linux_uapi": {
+ "repoRuleId": "@@//:linux_uapi.bzl%linux_uapi_setup",
+ "attributes": {}
+ },
"pyyaml": {
"repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
"attributes": {
diff --git a/utils/bazel/extensions.bzl b/utils/bazel/extensions.bzl
index b1c81762d3394..972310c56cc5a 100644
--- a/utils/bazel/extensions.bzl
+++ b/utils/bazel/extensions.bzl
@@ -6,6 +6,7 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:local.bzl", "new_local_repository")
+load(":linux_uapi.bzl", "linux_uapi_setup")
load(":vulkan_sdk.bzl", "vulkan_sdk_setup")
_PYYAML_CONTENT = """\
@@ -32,6 +33,7 @@ def _llvm_repos_extension_impl(module_ctx):
)
vulkan_sdk_setup(name = "vulkan_sdk")
+ linux_uapi_setup(name = "linux_uapi")
http_archive(
name = "pyyaml",
diff --git a/utils/bazel/linux_uapi.bzl b/utils/bazel/linux_uapi.bzl
new file mode 100644
index 0000000000000..aa0a764d2e1e4
--- /dev/null
+++ b/utils/bazel/linux_uapi.bzl
@@ -0,0 +1,74 @@
+# 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
+
+"""bzlmod extension for making Linux kernel UAPI headers available in Bazel."""
+
+_SYSTEM_HEADERS_PATH_ENV_VAR = "LINUX_UAPI_INCLUDE_DIR"
+
+_ERROR_MESSAGE_BZL = """\
+def _error_message_impl(ctx):
+ fail(ctx.attr.message)
+
+error_message = rule(
+ implementation = _error_message_impl,
+ attrs = {"message": attr.string()},
+)
+"""
+
+_ERROR_BUILD = """\
+load(":error_message.bzl", "error_message")
+
+error_message(
+ name = "linux_uapi_headers",
+ message = \"""System linux UAPI headers not found.
+
+Pass --repo_env={var_name}=/path/to/your/linux/include to bazel build.
+\"""
+)
+""".format(var_name = _SYSTEM_HEADERS_PATH_ENV_VAR)
+
+_SYSTEM_BUILD = """\
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
+cc_library(
+ name = "linux_uapi_headers",
+ # Builds using /usr/include may have a lot of junk that does not cleanly
+ # compile, so use `textual_hdrs` instead of `hdrs`.
+ textual_hdrs = glob(["include/**"]),
+ includes = ["include"],
+ visibility = ["//visibility:public"],
+)
+"""
+
+def _default_include_dir(repository_ctx):
+ """Returns a default include dir if it looks to have Linux UAPI headers."""
+ include_dir = "/usr/include"
+ if not repository_ctx.path(include_dir + "/linux").exists:
+ return None
+ return include_dir
+
+def _linux_uapi_setup_impl(repository_ctx):
+ """Sets up a repository of UAPI headers from a system directory."""
+ include_dir = repository_ctx.getenv(_SYSTEM_HEADERS_PATH_ENV_VAR, "")
+ if not include_dir:
+ include_dir = _default_include_dir(repository_ctx)
+
+ # If the directory doesn't exist, then set up a dummy rule that just errors.
+ # This defers the error message until an actual build,
+ # rather than failing during repository setup.
+ if not include_dir:
+ repository_ctx.file("error_message.bzl", _ERROR_MESSAGE_BZL)
+ repository_ctx.file("BUILD.bazel", _ERROR_BUILD)
+ return
+
+ if not include_dir.startswith("/"):
+ fail("{} must be absolute, was {}".format(
+ _SYSTEM_HEADERS_PATH_ENV_VAR,
+ include_dir,
+ ))
+
+ repository_ctx.symlink(include_dir, "include")
+ repository_ctx.file("BUILD.bazel", _SYSTEM_BUILD)
+
+linux_uapi_setup = repository_rule(implementation = _linux_uapi_setup_impl)
More information about the llvm-commits
mailing list