我试图根据用户运行bazel test
还是bazel build
在编译时提供一些预处理器定义。
具体来说,我希望有一个cc_library.deps
的条件依赖项和一个cc_library.defines
中的条件定义。
我发现select()
是可行的方法,但我不知道如何知道用户会执行什么操作。
答案 0 :(得分:1)
我不知道有什么方法可以使用build
检测当前命令(test
与select()
),但是我认为您可以使用custom keys来实现类似的目的
您可以定义一个config_setting
块,如下所示:
# BUILD
config_setting(
name = "custom",
values = {
"define": "enable_my_flag=true"
}
)
并在您的库中使用它来控制defines
:
# BUILD - continued
cc_library(
name = "mylib",
hdrs = ["mylib.h"],
srcs = ["mylib.cc"],
defines = select({
":custom": ["MY_FLAG"],
"//conditions:default": [],
})
)
现在使用bazel build :mylib
构建库将导致默认情况-没有定义存在,但是如果使用bazel build :mylib --define enable_my_flag=true
构建,则将选择另一个分支,并且MY_FLAG
将被定义。
例如,可以通过将--define
添加到您的.bazelrc
中来轻松扩展到测试用例:
# .bazelrc
test --define enable_my_flag=true
现在,每次您运行bazel test :mylib_test
时,都会附加define
标志,并且将使用定义的MY_FLAG
来构建库。
出于好奇,为什么要在使用一组不同的定义/依赖关系构建的库上运行测试?这可能会破坏测试的目的,因为最后您要测试与将要使用的库不同的东西。