如何将特定宏传递给bazel中的每个编译?
以下是构建文件的简单版本:如何将特定宏传递给bazel中的每个编译?,bazel,Bazel,以下是构建文件的简单版本: cc_library( name = "ab", srcs = ['a.c', 'b.c', 'logger.h'], ) logger.h包含使用宏XOC\u FILE\u ID的日志功能的实现XOC\u FILE\u ID必须包含源文件的名称。 使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
cc_library(
name = "ab",
srcs = ['a.c', 'b.c', 'logger.h'],
)
logger.h
包含使用宏XOC\u FILE\u ID
的日志功能的实现XOC\u FILE\u ID
必须包含源文件的名称。
使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
这就是为什么我需要用不同的定义编译这些文件:
gcc -c [...] -DXOC_FILE_ID="a.c" a.c
gcc -c [...] -DXOC_FILE_ID="b.c" b.c
我失败的方法:
- 使用值
{source\u file}
设置属性local\u defines
:local\u defines=['XOC\u file\u ID=“{source\u file}]”
:不会被替换
- 使用make变量设置属性
local\u defines
,您可以在工具链定义中访问{source\u file}
这意味着您必须编写自己的工具链定义。
我尝试了两种编写工具链的方法:
- 使用。后来我的构建被破坏了:Bazel的默认编译选项丢失了<代码>抄送库
不再创建共享库
bazel clean
并更新$PATH以使编译器可用。巴泽尔会把它捡起来的
我的工具链/
)
bazel build@bazel_tools//tools/cpp:toolchain
BUILD
、所有*.bzl
文件、cc\u wrapper.sh
和buildin\u include\u目录路径
从$(bazel info output\u base)/external/local\u config\u cc//code>复制到工具链目录;复制符号链接指向的文件,而不是复制符号链接
my toolchain/
中的BUILD
文件适应您的需要,例如添加'-DXOC\u file\u ID=\\\“%{source\u file}\\\”
到cc\u toolchain\u config
的compile\u标志
.bazelrc
以使Bazel默认使用新的工具链:
您可以访问工具链定义中的
{source_file}
这意味着您必须编写自己的工具链定义。
我尝试了两种编写工具链的方法:
- 使用。后来我的构建被破坏了:Bazel的默认编译选项丢失了<代码>抄送库不再创建共享库
- 使用指向并使用Bazel自己使用您的环境创建的工具链。这就是我现在要描述的(对于Bazel 3.5.1)
bazel clean
并更新$PATH以使编译器可用。巴泽尔会把它捡起来的
我的工具链/
)
bazel build@bazel_tools//tools/cpp:toolchain
BUILD
、所有*.bzl
文件、cc\u wrapper.sh
和buildin\u include\u目录路径
从$(bazel info output\u base)/external/local\u config\u cc//code>复制到工具链目录;复制符号链接指向的文件,而不是复制符号链接
my toolchain/
中的BUILD
文件适应您的需要,例如添加'-DXOC\u file\u ID=\\\“%{source\u file}\\\”
到cc\u toolchain\u config
的compile\u标志
.bazelrc
以使Bazel默认使用新的工具链:
build:my-toolchain --crosstool_top=//my-toolchain:toolchain
build --config=my-toolchain