使用bazel为具有模拟依赖关系的C构建单元测试

mon*_*och 5 c bazel

我有一个C代码库,我正在尝试用Bazel构建.这个代码库包含单元测试,使用fff库在C中生成函数模拟.实际的库并不重要,但是我对函数模拟的整个概念有问题.

现在我有一个makefile,我链接并运行我的测试.当我构建测试时,我编译并链接测试库和测试源本身.此测试还定义了库依赖项的模拟.链接时,模拟符号会被解析为模拟实现,并且所有内容都按预期工作.但它这样做的原因是我没有链接实际的依赖库,我链接测试源中定义的模拟符号.

主要问题是:我如何使用Bazel做到这一点?当链接cc_test目标的二进制文件时,Bazel compilis并链接所有传递依赖项.由于受测试的库依赖于(via deps)符号的实际实现,因此这个真实的定义与模拟符号并列,我自然会得到这个错误:multiple definition of XXX.

例:

cc_library(
  name = "a",
  # a.cc has the real version of "void some_function()".
  srcs = ["a.cc"],
  hdrs = ["a.h"],
)

# This test is working just fine.
cc_test(
  name = "a_test",
  srcs = ["a_test.cpp"],
  deps = [":a"],
)

cc_library(
  name = "b",
   # b.cc includes a.h and uses "void some_function()".
  srcs = ["b.cc"],
  hdrs = ["b.h"],
  deps = [":a"],
)

# This test has two definitions for "void some_function()":
# the real one and the mock one.
cc_test(
  name = "b_test",
  # b_test.cpp has the mock version of "void some_function()".
  srcs = ["b_test.cpp"],
  deps = [":b"],
)
Run Code Online (Sandbox Code Playgroud)

我不是巴泽尔的新手,但我也不是专家,花了很多时间尝试我失败的事情.有关如何使其工作的任何建议?

Dav*_*vid 0

您的问题可能是一个非常基本的问题,与名称空间和/或扩展类相关。

c 根据定义没有命名空间,但可以以某种方式模拟它们:
/sf/answers/1997490981/

但由于您可能使用 c++ 而不是 c,因此可以直接使用命名空间。

具体问题是,您有两次相同的函数,这将用名称空间a.some_function()和来表示b.some_function()

在 Bazel 中,存在几种解决该问题的选项,我仅发布简短的复制片段,您必须在链接页面上阅读详细信息。

deps = [
    "@gtest//:main",
    "//lib:hello-greet",
],
Run Code Online (Sandbox Code Playgroud)

链接: https: //docs.bazel.build/versions/master/cpp-use-cases.html
该片段也用于测试,但我认为这与您的问题并不重要。

Bazel 中也存在工具链,下面是一个例子:

config_setting(
    name = "on_linux",
    constraint_values = [
        "@bazel_tools//platforms:linux",
    ],
)

config_setting(
    name = "on_windows",
    constraint_values = [
        "@bazel_tools//platforms:windows",
    ],
)

bar_binary(
    name = "myprog",
    srcs = ["mysrc.bar"],
    compiler = select({
        ":on_linux": "//bar_tools:barc_linux",
        ":on_windows": "//bar_tools:barc_windows",
    }),
)
Run Code Online (Sandbox Code Playgroud)

链接: https: //docs.bazel.build/versions/master/toolchains.html

由于我不是用 c 或 c++ 编程,通常需要花费相当长的时间来挖掘足够的内容来发布解决方案,所以我必须在没有真正的解决方案的情况下保留它,但我希望问题和解决它的方法变得更清楚了一点。
我会先尝试使用上面第一个片段下方的第二个链接。