如何将特定宏传递给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自己使用您的环境创建的工具链。这就是我现在要描述的(对于Bazel 3.5.1)
  • 如果要使用不在$PATH中的编译器,请执行
    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)
  • 如果要使用不在$PATH中的编译器,请执行
    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