在Bazel中跨仓库引用导出文件的问题(rules_doxygen示例)
解决方案:跨仓库引用rules_doxygen静态文件的正确方式
问题根源在于:doxygen规则的html_header参数本身不会自动解析外部仓库的依赖,而genrule的srcs属性会自动处理依赖并将文件拉取到构建沙箱中。要实现跨仓库引用,需要手动声明依赖并使用沙箱内的正确路径。
修改后的配置示例
doxygen( name = "doxygen_test", srcs = glob([ "*.h", "*.cpp", ], allow_empty = True,), aliases = [ "licence=@par Licence:^^", "verb{1}=@verbatim \\1 @endverbatim", ], project_brief = "Example project for doxygen", project_name = "example", recursive = True, input = "src", tags = ["manual"], # 1. 将外部仓库文件添加到data依赖,触发Bazel拉取文件到构建沙箱 data = ["@my_resource_repo//doxygen:resources/doxygen/header.html"], # 2. 使用$(location)获取沙箱内的真实路径,而非直接引用外部仓库标签 html_header = "$(location @my_resource_repo//doxygen:resources/doxygen/header.html)" )
核心原理说明
- Bazel的构建沙箱是隔离的,只有通过规则的
srcs、data等属性声明的依赖,才会被复制到沙箱内供构建过程访问。 html_header属于规则的配置参数,Bazel不会自动解析该参数中的外部仓库路径,因此必须手动将目标文件加入data属性。$(location)是Bazel的内置宏,会将仓库标签转换为构建沙箱内的相对路径,确保doxygen能正确找到文件。
内容的提问来源于stack exchange,提问作者tenspd137
相关产品推荐
相关产品推荐

