Включите файл, загруженный Bazel http_file - PullRequest
0 голосов
/ 14 ноября 2018

Я использую 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 Ответ

0 голосов
/ 14 ноября 2018

По умолчанию файлы, загруженные http_file, могут быть включены как:

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

В данном конкретном случае:

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

Однако этот путь включения уродлив, он долженбыть завернутым в cc_library.Кроме того, компиляция полного заголовочного файла catch для каждого теста замедлит сборку.Согласно документам catch , часть реализация реализации заголовка catch должна компилироваться отдельно.Вот так:

тест / BUILD:

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"],
)

test / catch.cpp:

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

test / my_test.cc:

#include "catch/catch.hpp"

TEST_CASE("my_test", "[main]") { /* ... */ }

Таким образом catch.cpp не будет перекомпилирован, если только my_test.cc изменится, сэкономив драгоценные секунды.

...