我正在尝试使用 Bazel 构建遗留的 C/C++ 嵌入式代码库。代码被分成软件集。因为系统是嵌入式的,所以有一个环境头包含作为参数传递给每个软件集的编译器。标头路径使用#define 定义:
software_set_b 的源文件可能以:
#include MY_ENV
编译指令会将 MY_ENV 定义为 software_set_a 中环境头的绝对路径,例如:
gcc -DMY_ENV=/path/to/software_set_a/headers/MyEnvironmentHeader.h
是否可以使用 Bazel 来实现这一点,而无需显式传入/path/to/software_set_a/headers/MyEnvironment.h
参数--define
,bazel build
或硬编码 software_set_b 的 BUILD 文件中的值,例如:
cc_library(
name = 'software_set_b',
defines = [
'MY_ENV=/path/to/software_set_a/headers/MyEnvironment.h'
],
...
)
理想情况下,程序员可以选择带有参数的包,例如bazel build //:software_set_b --//:from_env=software_set_a
在 BUILD 脚本中使用类似于以下内容的片段:
File: software_set_b/BUILD
string_flag(
name = 'from_env',
build_setting_default = ''
)
def deps_from_env():
from_env = get_flag_value('from_env') # A function that gets the value of the flag.
return '@' + from_env + '//:env' # Evaluate to e.g. '@software_set_a//:env'
cc_library(
name = 'software_set_b',
deps = [
deps_from_env()
]
)
File: software_set_a/BUILD
cc_library(
name = 'env',
defines = [
# Something to give me '/path/to/software_set_a/headers/MyEnvironment.h'
'MY_ENV=$(rootpath)/headers/MyEnvironment.h'
],
...
)