Bazel构建时向C++程序传递自定义VERSION变量不生效的问题
Bazel构建时向C++程序传递自定义VERSION变量不生效的问题
嘿,我来帮你捋清楚这个问题出在哪~
你当前的BUILD文件里,local_defines是直接把VERSION=\\\"alpha\\\"硬编码进去了,这就意味着不管你通过--define传递什么值,编译时都会用这个固定的alpha——因为BUILD文件根本没用到你传的那个VERSION构建变量。
要让--define传递的值生效,得让BUILD文件引用这个变量才行,具体可以这么改:
方法一(推荐,Bazel 0.27+支持)
修改你的BUILD文件,用defines结合default_defines来设置可覆盖的默认值:
cc_binary( name = "main", srcs = ["main.cpp"], # 用$(VERSION)引用构建变量,注意转义引号 defines = ["VERSION=\\\"$(VERSION)\\\""], # 设置默认值,没传--define时就用alpha default_defines = {"VERSION": "alpha"}, )
方法二(兼容旧版Bazel)
如果你的Bazel版本比较老,不支持default_defines,可以用select结合config_setting来实现:
# 定义一个配置规则,检测是否传递了VERSION变量 config_setting( name = "has_custom_version", define_values = {"VERSION": ".+"}, ) cc_binary( name = "main", srcs = ["main.cpp"], defines = select({ # 如果传递了VERSION,就用自定义值 ":has_custom_version": ["VERSION=\\\"$(VERSION)\\\""], # 否则用默认的alpha "//conditions:default": ["VERSION=\\\"alpha\\\""], }), )
改完之后再测试:
- 运行
bazel run --define VERSION=beta main,应该会输出Version: beta - 直接运行
bazel run main,会输出默认的Version: alpha
原理很简单:现在BUILD文件会识别你通过--define传递的VERSION变量,编译时把它替换到宏定义里,而不是一直用硬编码的alpha啦。
备注:内容来源于stack exchange,提问作者jeffreyveon
相关产品推荐
相关产品推荐

