如何在Bazel中仅对自有模块启用自包含头文件检查?
如何仅在Bazel本地模块启用头文件自包含检查
想给自己的C/C++ Bazel项目开parse_headers和process_headers_in_dependencies特性检查头文件自包含,但不想要求第三方依赖遵循该规则?这几个方法能实现精细化控制:
方法1:用.bazelrc做全局过滤
直接在项目根目录的.bazelrc里加配置,给本地目标开特性,同时排除第三方依赖:
# 给所有本地默认目标启用头文件检查 build --features=parse_headers,process_headers_in_dependencies --//conditions:default # 给第三方依赖关掉这俩特性,替换成你实际的依赖路径 build --nofeatures=parse_headers --nofeatures=process_headers_in_dependencies --@third_party//...
要是第三方依赖来自不同的外部工作区,比如@com_google_abseil//...,多写几行排除规则就行。
方法2:给本地目标逐个加特性
如果本地目标不多,直接在BUILD文件里给每个cc_library/cc_binary目标手动加features属性:
cc_library( name = "my_local_lib", srcs = ["my_lib.cc"], hdrs = ["my_lib.h"], features = ["parse_headers", "process_headers_in_dependencies"], # 其他配置正常写 )
这种方式精准度最高,只影响你指定的本地目标,第三方依赖完全不受波及。
方法3:批量配置本地包
如果本地包很多,用package_group批量管理更省心:
- 在项目根BUILD文件里定义本地包组:
package_group( name = "local_packages", packages = [ "//my_core/...", "//utils/...", # 把所有本地包路径都加进来 ], )
- 接着在
.bazelrc里用这个包组做过滤:
# 给本地包组里的目标开特性 build --features=parse_headers,process_headers_in_dependencies --package_group=//:local_packages # 给非本地包的目标关掉特性 build --nofeatures=parse_headers --nofeatures=process_headers_in_dependencies --not_package_group=//:local_packages
这样不用逐个改目标,一次性搞定所有本地包的配置。
要注意:process_headers_in_dependencies本来会处理依赖的头文件,但用上面的方法后,只有本地目标的依赖头文件会被检查,第三方依赖的头文件完全不碰,刚好符合你的需求。
内容的提问来源于stack exchange,提问作者Shantanu Gontia
相关产品推荐
相关产品推荐

