代码之家  ›  专栏  ›  技术社区  ›  erenon

包含由bazel http_文件下载的文件

  •  0
  • erenon  · 技术社区  · 6 年前

    我在用 Bazel 来建立我的项目。我想使用单头测试框架, Catch v2 . 我决定用 http_file 规则使bazel下载catch头。我的 WORKSPACE 文件如下:

    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
    
    http_file(
      name = "catch",
      downloaded_file_path = "catch.hpp",
      sha256 = "cc6cc272cf84d8e10fb28f66f52584dedbb80d1234aae69e6a1027af4f31ae6f",
      urls = ["https://github.com/catchorg/Catch2/releases/download/v2.4.2/catch.hpp"],
    )
    

    根据文档,测试依赖于生成的包,如下所示:

    cc_test(
      name = "my_test",
      srcs = ["@catch//file", "my_test.cc"]
    )
    

    测试文件 my_test.cc 再简单不过了:

    #include "catch.hpp"
    

    但是,我得到以下错误:

    $ bazel test --config=opt -s //...
    WARNING: [...]/BUILD:25:10: in srcs attribute of cc_test rule //test:my_test: please do not import '@catch//file:catch.hpp' directly. You should either move the file to this package or depend on an appropriate rule there
    SUBCOMMAND: # //test:my_test [action 'Compiling test/my_test.cc']
    (cd [...] && \
      exec env - [...] \
      /usr/bin/gcc
     -U_FORTIFY_SOURCE -fstack-protector -Wall -B/usr/bin -B/usr/bin -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer '-std=c++0x' -MD -MF [...].d '-frandom-seed=[...].o' -fPIC
     -iquote .
     -iquote bazel-out/k8-fastbuild/genfiles
     -iquote bazel-out/k8-fastbuild/bin
     -iquote external/bazel_tools
     -iquote bazel-out/k8-fastbuild/genfiles/external/bazel_tools
     -iquote bazel-out/k8-fastbuild/bin/external/bazel_tools
     -fno-canonical-system-headers -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -c test/my_test.cc
     -o [...].o)
    ERROR: [...]/BUILD:23:1: C++ compilation of rule '//test:my_test' failed (Exit 1)
    test/my_test.cc:1:28: fatal error: catch.hpp: No such file or directory
    compilation terminated.
    [...]
    FAILED: Build did NOT complete successfully
    

    创建 cc_library 包装,或包括 catch/catch.hpp ,catch/file/catch.hpp会产生相同的错误。

    1 回复  |  直到 6 年前
        1
  •  1
  •   erenon    6 年前

    默认情况下,文件下载者 http_file 可包括:

    #include "external/<name>/file/<file_name>"
    

    在这种情况下:

    #include "external/catch/file/catch.hpp"
    

    但是,这个包含路径很难看,应该用 cc_library . 此外,为每个测试编译完整的catch头文件将使生成速度变慢。根据 catch docs , the 实施 catch头的一部分应该单独编译。这样地:

    测试/生成:

    cc_library(
      name = "catch",
      hdrs = ["@catch//file"],
      srcs = ["catch.cpp"],
      visibility = ["//visibility:public"],
      strip_include_prefix = "/external/catch/file",
      include_prefix = "catch",
      linkstatic = True,   # otherwise main() will could end up in a .so
    )
    
    cc_test(
      name = "my_test",
      deps = ["//test:catch"],
      srcs = ["my_test.cc"],
    )
    

    测试/catch.cpp:

    #define CATCH_CONFIG_MAIN
    #include "catch/catch.hpp"
    

    测试/my_test.cc:

    #include "catch/catch.hpp"
    
    TEST_CASE("my_test", "[main]") { /* ... */ }
    

    这种方式 catch.cpp 如果只有 my_test.cc 改变,节省宝贵的时间。