基于构建配置的Bazel select()

基于构建配置的Bazel select(),bazel,Bazel,我试图在编译时根据用户是运行bazel测试还是运行bazel构建来提供一些预处理器定义 具体来说,我希望有一个cc_library.deps的条件依赖项和一个cc_library.defines中的条件定义 我发现select是一种方法,但我不知道如何知道用户运行的操作。我不知道使用select检测当前命令build vs test的任何方法,但我认为您可以实现类似的功能 您可以定义如下所示的配置设置块: 建筑 配置设置 名称=自定义, 值={ 定义:enable_my_flag=true }

我试图在编译时根据用户是运行bazel测试还是运行bazel构建来提供一些预处理器定义

具体来说,我希望有一个cc_library.deps的条件依赖项和一个cc_library.defines中的条件定义


我发现select是一种方法,但我不知道如何知道用户运行的操作。

我不知道使用select检测当前命令build vs test的任何方法,但我认为您可以实现类似的功能

您可以定义如下所示的配置设置块:

建筑 配置设置 名称=自定义, 值={ 定义:enable_my_flag=true } 并在库中使用它来控制定义:

建造-续 图书馆 name=mylib, hdrs=[mylib.h], srcs=[mylib.cc], 定义=选择{ :自定义:[我的国旗], //条件:默认值:[], } 现在,使用bazel build:mylib构建库将导致默认情况-不存在定义,但如果使用bazel build:mylib-define enable_my_flag=true构建库,则将选择另一个分支并定义my_flag

这可以很容易地扩展到测试用例,例如通过将-define添加到.bazelrc:

巴泽尔先生 测试-定义启用\我的\标志=真 现在,每次运行bazel-test:mylib_测试时,都会附加define标志,并使用已定义的MY_标志构建库


出于好奇,为什么要在使用不同的定义/依赖项集构建的库上运行测试?这可能会破坏测试的目的,因为最终您测试的是与您将要使用的库不同的东西。

我不知道使用select检测当前命令build vs test的任何方法,但我认为您可以实现类似的功能

您可以定义如下所示的配置设置块:

建筑 配置设置 名称=自定义, 值={ 定义:enable_my_flag=true } 并在库中使用它来控制定义:

建造-续 图书馆 name=mylib, hdrs=[mylib.h], srcs=[mylib.cc], 定义=选择{ :自定义:[我的国旗], //条件:默认值:[], } 现在,使用bazel build:mylib构建库将导致默认情况-不存在定义,但如果使用bazel build:mylib-define enable_my_flag=true构建库,则将选择另一个分支并定义my_flag

这可以很容易地扩展到测试用例,例如通过将-define添加到.bazelrc:

巴泽尔先生 测试-定义启用\我的\标志=真 现在,每次运行bazel-test:mylib_测试时,都会附加define标志,并使用已定义的MY_标志构建库


出于好奇,为什么要在使用不同的定义/依赖项集构建的库上运行测试?这可能会破坏测试的目的,因为最终您测试的是与您将要使用的库不同的内容。

这并不是我所希望的,但现在解决了我的问题。非常感谢。我发现这个示例非常混乱-自定义配置设置的名称是custom,但它没有出现在命令行的任何地方。它的定义是建立一个键值对映射define来启用_my_flag=true。目前还不清楚define是否是一个bazel概念,或者它如何公开define的C概念。但出于某种原因,我们用于设置的关键是我们在命令行上放置的内容。。。我们将它设置为一个字符串值,看起来像是设置了一个变量,但我猜它只是一个字符串?这并不是我所希望的,但现在解决了我的问题。非常感谢。我发现这个示例非常混乱-自定义配置设置的名称是custom,但它没有出现在命令行的任何地方。它的定义是建立一个键值对映射define来启用_my_flag=true。目前还不清楚define是否是一个bazel概念,或者它如何公开define的C概念。但出于某种原因,我们用于设置的关键是我们在命令行上放置的内容。。。我们将它设置为一个字符串值,看起来像是设置了一个变量,但我猜它只是一个字符串?