如何在Bazel项目子目录中移除部分全局编译选项?
解决方案
方法1:单目标单独配置(最灵活)
直接在你新增子目录的BUILD文件中,为对应C++目标的copts字段添加需要启用的警告参数即可,该配置优先级高于全局.bazelrc的设置,不会影响其他目录的编译行为。
示例:
cc_library( name = "your_custom_lib", srcs = ["xxx.cc"], hdrs = ["xxx.h"], # 此处添加你需要启用的警告参数,会覆盖全局关闭警告的配置 copts = [ "-Wall", "-Wextra", "-Wpedantic", # 可按需添加其他警告规则,比如-Werror=return-type等 ], )
方法2:子目录全量生效(适合多目标场景)
如果你的子目录下有大量C目标,不想逐个配置,可以在子目录BUILD文件顶部设置包级默认编译参数,该包下所有C目标都会自动继承配置:
# 子目录BUILD文件顶部添加 package( default_copts = [ "-Wall", "-Wextra", "-Wpedantic", ], ) # 后续目标无需再单独写copts,会自动继承上面的配置 cc_library( name = "lib1", srcs = ["lib1.cc"], ) cc_binary( name = "bin1", srcs = ["bin1.cc"], )
配置原理说明
Bazel编译参数优先级遵循:目标级copts > 包级default_copts > 全局.bazelrc配置参数。根目录.bazelrc设置的是全局关闭所有C++警告的规则,你只需要在自己的子目录目标/包级别配置需要的警告参数,编译器会优先采用后面传入的警告配置,覆盖全局关闭警告的设置。
内容的提问来源于stack exchange,提问作者Mars Cheng
相关产品推荐
相关产品推荐

