Почему Bazel не находит мой файл включения, несмотря на использование коптов для добавления дополнительного каталога включения? - PullRequest
0 голосов
/ 25 октября 2018

Я изменил пример stage3 cpp bazelbuild, чтобы использовать дополнительные пути включения через copts

https://github.com/mnieber/examples/commit/a8b784ddf5698563a31401b9ac3531636b3536ef

Однако это приводит к ошибке компилятора (обратите внимание, что -Ilib/foo используется как опция для gcc):

bazel build --verbose_failures //main:hello-world
INFO: Analysed target //main:hello-world (1 packages loaded).
INFO: Found 1 target...
ERROR: /home/maarten/sources/examples/cpp-tutorial/stage3/lib/BUILD:1:1: C++ compilation of rule '//lib:hello-time' failed (Exit 1): gcc failed: error executing command 
  (cd /home/maarten/.cache/bazel/_bazel_maarten/62d72ea3bd73864cf884808e7d850715/execroot/__main__ && \
  exec env - \
    LD_LIBRARY_PATH=/usr/local/lib \
    PATH=/home/maarten/projects/xmlparser/dodo_commands/env/bin:/home/maarten/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dodo/env/bin:/home/maarten/.dodo_commands/bin \
    PWD=/proc/self/cwd \
  /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 bazel-out/k8-fastbuild/bin/lib/_objs/hello-time/hello-time.pic.d '-frandom-seed=bazel-out/k8-fastbuild/bin/lib/_objs/hello-time/hello-time.pic.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 -Ilib/foo -fno-canonical-system-headers -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -c lib/hello-time.cc -o bazel-out/k8-fastbuild/bin/lib/_objs/hello-time/hello-time.pic.o)

Use --sandbox_debug to see verbose messages from the sandbox
lib/hello-time.cc:2:21: fatal error: bar/baz.h: No such file or directory
compilation terminated.
Target //main:hello-world failed to build

Может кто-нибудь объяснить, почему bar/baz.h не найден?

Ответы [ 2 ]

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

Я получил этот ответ в списке рассылки Bazel (короткая версия: этот заголовочный файл нужно добавить в srcs, что несколько удивительно):

Проблема в том, что вы не объявляете заголовочный файл baz.h любым способом среди источников cc_library.Таким образом, когда выполнение происходит в песочнице (по умолчанию), файл не виден.Сборка уже работает без песочницы (попробуйте запустить ее с --spawn_strategy = автономный флаг).

Итак, объявите baz.h в источниках:

cc_library(
    name = "hello-time",
    srcs = [
        "foo/bar/baz.h",
        "hello-time.cc",
    ],
    hdrs = ["hello-time.h"],
    copts = ["-Ilib/foo"],
    visibility = ["//main:__pkg__"],
)
0 голосов
/ 15 ноября 2018

cc_library в cpp-tutorial/stage3/lib/BUILD не объявляет зависимость от заголовочного файла, поэтому Bazel не помещает этот файл в песочницу, поэтому компиляция завершается неудачно (как и должно быть).

Вы неНе нужно лишних copts.Вместо этого вам нужно либо добавить bar/baz.h к hdrs правила "hello-time", либо, если "bar" является отдельным пакетом (в нем есть файл BUILD), затем добавить правило "cc_library", чье hdrs включает в себя baz.h и зависит от этой библиотеки из "hello-time".

...