Bazel: cc_binary не может найти заголовки в зависимой cc_library - PullRequest
1 голос
/ 05 мая 2020

Этот особый аспект строительства чего-то, что Базель должен сделать намного проще, чем есть на самом деле. Google пытается прояснить это, но, похоже, это не работает. Примерно на 1/3 пути вниз по do c написано:

foo.cc  can include both foo.h bar.h

, потому что cc_binary для «foo. cc» зависит от библиотеки «bar», а в библиотеке «bar» конкретно перечислены bar.h в разделе hdrs. См. https://docs.bazel.build/versions/master/be/c-cpp.html.

Значение, которое я рисую, следующее:

  • , если библиотека здесь, bar строится
  • , если двоичный файл правильно вызывает здесь библиотечную зависимость bar
  • если заголовки, необходимые для двоичного файла, появляются в разделе hdrs библиотеки
  • если библиотека видна для двоичного файла

, тогда код в двоичном файле (при условии отсутствия других несвязанных проблем) может включить заголовки библиотеки.

Мой случай удовлетворяет всем четырем предварительным условиям. Но когда я собираю двоичный файл, Bazel даже не удосуживается поставить -I в командной строке , а затем жалуется, что заголовок не найден! Что дает?

-----------------
load("@rules_cc//cc:defs.bzl", "cc_library")
cc_library(
    name = "hello-time",
    srcs = ["mylib/src/hello-time.cc"],
    hdrs = glob(
            ["mylib/include/**/*.h"],
        ),
    copts = ["-Ilib/mylib/include"],
    visibility = ["//visibility:public"],
)
-----------------
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
cc_binary(
    name = "hello-world",
    srcs = ["test/src/hello-world.cc"],
    deps = [
       "//lib:hello-time",
    ],
    stamp = 1,
)

Что нужно для того, чтобы Bazel действительно использовал зависимость для поиска правильных путей включения?

tasks/test/src/hello-world.cc:1:10: fatal error: hello-time/hello-time.h: No such file or directory
#include <hello-time/hello-time.h>
      ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Правильный, лучший ответ: в записи cc_library добавьте:

# note bazel will add dir prefix from root to
# the directory w/ BUILD in it for you.
includes = ["<dir>"...],

do c https://docs.bazel.build/versions/master/be/c-cpp.html конкретно указывает, что Базель добавит пути -I для вас для it и другие цели, которые зависят от него.

0 голосов
/ 05 мая 2020

copts не влияет на то, как cc_binary строится согласно docs :

Флаги действуют только для компиляции этой цели, а не ее зависимостей, поэтому будьте осторожны с файлами заголовков, включенными в другие места.

Из того, что я вижу, проблема будет в том, что внутри вашего //lib пакета у вас есть что-то вроде:

.
├── BUILD
└── mylib
    ├── include
    │   └── hello-time
    │       └── hello-time.h
    └── src
        └── hello-time.cc

Но с test/src/hello-world.cc вы ожидаете включить hello-time/hello-time.h без префикса mylib/include. Тем не менее, и при условии, что макет более или менее исправлен, вы можете использовать атрибут strip_include_prefix в своей цели cc_library, чтобы он выглядел так (на основе вашего примера; я бы, вероятно, предпочел не использовать glob() и заголовки списка):

cc_library(
    name = "hello-time",
    srcs = ["mylib/src/hello-time.cc"],
    hdrs = glob(
            ["mylib/include/**/*.h"],
        ),
    strip_include_prefix = "mylib/include",
    visibility = ["//visibility:public"],
)
...