You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bazel的cc_library元目标中重导出依赖头文件以通过layering_check?

Bazel封装嵌入式SDK HAL元目标的头文件重导出问题

我正在为嵌入式项目的厂商SDK做Bazel封装,SDK的*硬件抽象层(HAL)*针对每个支持的部件都有同名的C头文件和源文件。我想给每个部件单独创建目标,再通过select把它们纳入一个元目标hal,让它根据所选平台自动选择正确依赖。但依赖这个元目标时,HAL头文件没被正确识别为依赖,导致layering_check失败。

代码示例

cc_library(
    name = "hal_part_A",
    hdrs = ["part_A/hal_regs.h"],
    strip_include_prefix = "part_A/",
    target_compatible_with = ["//part:part_A"],
)

cc_library(
    name = "hal_part_B",
    hdrs = ["part_B/hal_regs.h"],
    strip_include_prefix = "part_B/",
    target_compatible_with = ["//part:part_B"],
)

cc_library(
    name = "hal",
    deps = select({
        "//part:part_A": [":hal_part_A"],
        "//part:part_B": [":hal_part_B"],
    }),
    # <- 在此添加方法以重导出依赖项声明的头文件
)

cc_binary(
    name = "main",
    srcs = ["main.c"],
    deps = [":hal"],
)

报错信息

当选择//part:part_A平台时,编译包含hal_regs.h的main.c会触发如下错误:

Compiling main.c failed: undeclared inclusion(s) in rule '//:main': 'part_A/hal_regs.h'

核心原因是//:main未直接依赖暴露该头文件的hal_part_A,而元目标hal没有将依赖的头文件重导出给上层目标。

问题

有没有办法让Bazel识别hal元目标需要重导出其依赖的头文件?

不够理想的现有解决方案

  • 不使用元目标:让main直接通过select选择HAL实现,但select逻辑需要复制到每个依赖HAL的目标中,维护成本高。
  • 元目标显式声明头文件:通过hdrs = select(...)列出所有平台的头文件,但会导致配置重复,增加后续维护的复杂度。

内容的提问来源于stack exchange,提问作者burnpanck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:30:11