如何在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
相关产品推荐
相关产品推荐

