【问题标题】:How to specify preprocessor includes in Bazel? (-include common_header.h)如何指定预处理器包含在 Bazel 中? (-包括 common_header.h)
【发布时间】:2021-05-27 09:51:57
【问题描述】:

我正在尝试使用 Bazel 中的代码,该代码使用 -include 标志 (https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html) 始终包含配置标头。
配置头设置了一些头文件需要的#defines,即启用/禁用某些API。

配置头看起来像这样:

#ifndef CONFIG_H_
#define CONFIG_H_

// part of library, defines some stuff to use in this file
#include "config_defs.h"

<#define several config settings>

// also part of library, has a defaults via `#ifndef`->`#define`
#include "config_defaults.h" 

#endif  // CONFIG_H_

很遗憾,不能将该标题添加到每个文件中。
由于设置的数量,我想避免将完整的配置和所有默认值转换为-D(即通过defines = [...])。

从外观上看,配置需要以CcToolchainConfigInfo.includes (https://docs.bazel.build/versions/master/cc-toolchain-config-reference.html#cctoolchainconfiginfo-build-variables) 结尾,但我不知道如何到达那里。

我尝试在工具链中添加-include(通过功能标志),但不知道如何告诉它挂载文件。

【问题讨论】:

  • 我设法通过制作自定义工具链(在功能标志中带有-include)并将其添加到cc_toolchain 中的相关文件组中来集成它。仍远未达到最佳状态,但有效...
  • 找到另一种方式 - 我现在使用 genrule 在每个 .h/.c 文件的开头包含配置头。

标签: c++ bazel


【解决方案1】:

选项:

  1. 将 --define 添加到 .bazelrc:
build --define VAR1=hello
build --define VAR2=world
  1. 定义一个将包装默认 cc_library 的宏:
def my_cc_library(
  name,
  copts=[],
  **kwargs):

  cc_library(
    name = name,
    copts = copts + ["-DVAR=1"],
    **kwargs)

我推荐第二种选择。

【讨论】:

  • 我希望避免这种情况,因为标题配置还包含一个文件 (config_defaults.h),其中包含大量默认值(一些取决于其他值),我必须手动添加它情况,使我的 BUILD 文件膨胀。
  • @AcuteDrops 如果在 BUILD 文件中使用 my_cc_library 而不是 cc_library,则不会加载。在此宏中定义一次值。
  • 正如我之前提到的,config_defaults.h 包含很多默认值,其中大部分我不想触及...我必须转换该文件中的所有默认值(库提供)到一个庞大的defines list/dict(我的意思是膨胀,如果它隐藏在其他文件中并不重要)并将我想要的一些更改合并到其中。
  • @AcuteDrops 你用什么编译器?传递这个标志: -include "config_defaults.h" 如果你使用 gcc。其他编译器也有类似的标志。
  • 我的问题,如原始问题所述,是如何通过-include 干净地包含文件。如果我无论如何都要包含一个标题,我也可以包含我自己的并将我的定义放在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2019-06-22
  • 1970-01-01
  • 2010-09-23
  • 2019-07-07
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多