如何让Bazel的cc_binary规则默认启用grpc_no_xds=true定义?
解决方案
你可以通过自定义封装cc_binary的宏来永久默认添加grpc_no_xds=true的编译定义,无需依赖命令行参数或.bazelrc文件。具体操作分两种场景:
1. 单个BUILD文件内复用
直接在当前BUILD文件中定义一个封装了默认配置的宏,替代原生的cc_binary:
# 自定义封装宏,自动添加grpc_no_xds=true编译定义 def my_cc_binary(name, srcs, deps=[], **kwargs): native.cc_binary( name = name, srcs = srcs, deps = deps, # 把grpc_no_xds=true加入编译定义,同时保留用户传入的其他defines defines = ["grpc_no_xds=true"] + kwargs.pop("defines", []), **kwargs ) # 使用自定义宏替代原生cc_binary my_cc_binary( name = "greeter_client", srcs = ["greeter_client.cc"], deps = [ "//src/myproject/grpc/examples/proto:helloworld_cc_grpc", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/flags:flag", "@com_google_absl//absl/flags:parse", ], )
2. 跨多个BUILD文件复用
如果需要在项目多个BUILD文件中使用这个配置,把宏放到单独的.bzl文件中:
- 在项目根目录创建
rules.bzl文件,内容如下:
def my_cc_binary(name, srcs, deps=[], **kwargs): native.cc_binary( name = name, srcs = srcs, deps = deps, defines = ["grpc_no_xds=true"] + kwargs.pop("defines", []), **kwargs )
- 在需要使用的BUILD文件中加载这个宏,再调用:
load("//:rules.bzl", "my_cc_binary") my_cc_binary( name = "greeter_client", srcs = ["greeter_client.cc"], deps = [ "//src/myproject/grpc/examples/proto:helloworld_cc_grpc", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/flags:flag", "@com_google_absl//absl/flags:parse", ], )
原理说明
gRPC的BUILD配置中通过grpc_no_xds这个编译定义控制XDS相关代码的编译开关,我们直接在cc_binary规则的defines参数中添加该定义,等价于命令行传入--define=grpc_no_xds=true,且无需每次手动指定。宏的写法还保留了对原生cc_binary所有参数的支持,不会影响你添加其他编译选项。
内容的提问来源于stack exchange,提问作者Lajos Nagy
相关产品推荐
相关产品推荐

