如何在 bazel/googletest 中使用环境变量
How to use environment variables in bazel/googletest
所以我想使用 bazel 和 googletest 框架进行 运行 模拟单元测试。为此,我想要样本输入文件和样本输出文件。
我想获取源文件、测试文件或存储库中任何文件的绝对路径,因此我可以从那里创建输入文件的相对路径。
例如:
std::string path = __SOME_PATH_IN_REPO__+"/../inputfiles/input.txt";
std::fstream infile(path);
经过大量搜索,我发现您可以直接从 Bazel 的 BUILD 文件中定义常量,如下所示:
cc_test(
name = "gtest_capabilities",
srcs = [
"testing/pwdTest.cpp",
],
deps = [
"@gtest//:main",
],
copts = [
"-D __ABSOLUTE_PATH__=$(workspace)",
],
)
重要的一行是科普特语,我在这里使用$(workspace)
。
我读到 here,您可以像这样指定 copts(或者 defines
),这确实有效。
第一页链接到的 This 页面告诉我,我可以像这样使用环境变量:$(FOO)
它还告诉我,我可以 运行 bazel info --show_make_env
获取所有可用的环境变量。
当我 运行 它时,我得到一个很大的环境变量列表,其中包含工作区,旁边还有很多其他变量。
问题来了:
但是当我使用 $(workspace)
变量时,bazel 告诉我,$(workspace) 没有定义。
如果我可以使用 $PWD 变量,我也会为我工作,但我也无法让它工作。
希望有人能帮助我。
你好,
罗密欧
编辑:
我现在在 bazel 构建文件中使用 'data' 选项。这主要有效
呃,这是一个糟糕的输出。基本上,--show_make_env
将 bazel info
的输出和 make 变量混合在一起,没有给出哪个是哪个的指示。要找到 make 变量,您可以比较输出以删除非 make 信息:
$ bazel info --show_make_env > make-vars
$ bazel info > no-make-vars
$ diff make-vars no-make-vars
1,22d0
< ABI: local
< ABI_GLIBC_VERSION: local
< ANDROID_CPU: armeabi
< AR: /usr/bin/ar
< BINDIR: bazel-out/local-fastbuild/bin
< BINMODE: -dbg
< CC: /usr/bin/gcc
< CC_FLAGS:
< COMPILATION_MODE: fastbuild
< CROSSTOOLTOP: external/local_config_cc
< C_COMPILER: compiler
< GENDIR: bazel-out/local-fastbuild/genfiles
< GLIBC_VERSION: local
< JAVA: external/local_jdk/bin/java
< JAVABASE: external/local_jdk
< JAVA_CPU: k8
< JAVA_TRANSLATIONS: 0
< NM: /usr/bin/nm
< OBJCOPY: /usr/bin/objcopy
< STACK_FRAME_UNLIMITED:
< STRIP: /usr/bin/strip
< TARGET_CPU: k8
这些是可用的 make 变量。
您能在测试中找到 PWD,而不是使用 -D
对其进行硬编码吗?
所以我想使用 bazel 和 googletest 框架进行 运行 模拟单元测试。为此,我想要样本输入文件和样本输出文件。
我想获取源文件、测试文件或存储库中任何文件的绝对路径,因此我可以从那里创建输入文件的相对路径。
例如:
std::string path = __SOME_PATH_IN_REPO__+"/../inputfiles/input.txt";
std::fstream infile(path);
经过大量搜索,我发现您可以直接从 Bazel 的 BUILD 文件中定义常量,如下所示:
cc_test(
name = "gtest_capabilities",
srcs = [
"testing/pwdTest.cpp",
],
deps = [
"@gtest//:main",
],
copts = [
"-D __ABSOLUTE_PATH__=$(workspace)",
],
)
重要的一行是科普特语,我在这里使用$(workspace)
。
我读到 here,您可以像这样指定 copts(或者 defines
),这确实有效。
第一页链接到的 This 页面告诉我,我可以像这样使用环境变量:$(FOO)
它还告诉我,我可以 运行 bazel info --show_make_env
获取所有可用的环境变量。
当我 运行 它时,我得到一个很大的环境变量列表,其中包含工作区,旁边还有很多其他变量。
问题来了:
但是当我使用 $(workspace)
变量时,bazel 告诉我,$(workspace) 没有定义。
如果我可以使用 $PWD 变量,我也会为我工作,但我也无法让它工作。
希望有人能帮助我。
你好,
罗密欧
编辑:
我现在在 bazel 构建文件中使用 'data' 选项。这主要有效
呃,这是一个糟糕的输出。基本上,--show_make_env
将 bazel info
的输出和 make 变量混合在一起,没有给出哪个是哪个的指示。要找到 make 变量,您可以比较输出以删除非 make 信息:
$ bazel info --show_make_env > make-vars
$ bazel info > no-make-vars
$ diff make-vars no-make-vars
1,22d0
< ABI: local
< ABI_GLIBC_VERSION: local
< ANDROID_CPU: armeabi
< AR: /usr/bin/ar
< BINDIR: bazel-out/local-fastbuild/bin
< BINMODE: -dbg
< CC: /usr/bin/gcc
< CC_FLAGS:
< COMPILATION_MODE: fastbuild
< CROSSTOOLTOP: external/local_config_cc
< C_COMPILER: compiler
< GENDIR: bazel-out/local-fastbuild/genfiles
< GLIBC_VERSION: local
< JAVA: external/local_jdk/bin/java
< JAVABASE: external/local_jdk
< JAVA_CPU: k8
< JAVA_TRANSLATIONS: 0
< NM: /usr/bin/nm
< OBJCOPY: /usr/bin/objcopy
< STACK_FRAME_UNLIMITED:
< STRIP: /usr/bin/strip
< TARGET_CPU: k8
这些是可用的 make 变量。
您能在测试中找到 PWD,而不是使用 -D
对其进行硬编码吗?