Сгенерированный заголовок не найден - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь использовать Bazel для создания проекта cpp, который использует Flatbuffers.Но мой map_schema_generated.h, созданный с помощью flatc, не найден.

Мое дерево:

|
|_ data
|  |_ maps
|     |_ BUILD
|     |_ map_schema.fbs
|
|_ src
|  |_ map
|     |_ BUILD
|     |_ map.hpp
|     |_ map.cpp
|
|_ tools
|  |_ BUILD
|  |_ generate_fbs.bzl
|
|_ WORKSPACE

tools/generate_fbs.bzl:

def _impl(ctx):
  output = ctx.outputs.out
  input = ctx.files.srcs
  print("generating", output.basename)
  ctx.action(
      use_default_shell_env = True,
      outputs = [output],
      inputs = input,
      progress_message="Generating %s with %s" % (output.path, input[0].path),
      command="flatc -o %s --cpp %s" % (output.dirname, input[0].path)
  )

generate_fbs = rule(
  implementation=_impl,
  output_to_genfiles = True,
  attrs={
       "srcs": attr.label_list(allow_files=True, allow_empty=False),
       "out": attr.output()
       },
)

data/maps/BUILD:

load("//tools:generate_fbs.bzl", "generate_fbs")

generate_fbs(
  name = "schema",
  srcs = ["map_schema.fbs"],
  out = "map_schema_generated.h",
  visibility = ["//visibility:public"]
)

src/map/BUILD:

cc_library(
  name = "map",
  srcs = [
    "//data/maps:map_schema_generated.h",
    "map.hpp",
    "map.cpp"
  ]
)

src/map/map.cc имеет #include "map_schema_generated.h".

Командная строка, которую я использую для построения: bazel build //src/map.

Если я find в bazel-*, я получил:

bazel-genfiles/data/maps/map_schema_generated.h
bazel-out/k8-fastbuild/genfiles/data/maps/map_schema_generated.h
bazel-my-workspace-name/bazel-out/k8-fastbuild/genfiles/data/maps/map_schema_generated.h

И если я cat, эти файлы, я вижу, что они хорошо сгенерированы.

Всеинформация, которую я нашел, о Tensorflow и не очень полезна.

С уважением,

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вместо #include "map_schema_generated.h" в src/map/map.cpp я мог бы написать `#include" data / maps / map_schema_generated.h ".

Я думаю, что это самый чистый способ заставить это работать.

0 голосов
/ 25 июня 2018

Проблема в том, что ваш cc_library на самом деле не распознает сгенерированный заголовок как требующий каких-либо специальных действий (например, добавление флага -I для местоположения, в котором он находится). Он генерирует и живет в дереве сборки, но не везде, где компилятор (препроцессор) будет искать его, работающий на map.cpp. (Выполните сборку с -s, чтобы немного больше понять, что и как произошло).

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

В data/maps/BUILD я добавил библиотеку «только заголовок» следующим образом:

cc_library(
  name = "map_schema_hdr",
  hdrs = [":map_schema_generated.h"],
  include_prefix = ".",  # to manipulate -I of dependenices
  visibility = ["//visibility:public"]
)

В src/map/BUILD Я бы затем использовал эту библиотеку только для заголовков в качестве зависимости map:

cc_library(
  name = "map",
  srcs = [
    "map.cpp"
    "map.hpp"
  ],
  deps = [
     "//data/maps:map_schema_hdr",
  ]
)

Чтобы поиграть с идеей иметь одно правило (макрос) для удобства, я внес следующие изменения:

tools/generate_fbs.bzl теперь читает:

def _impl(ctx):
  output = ctx.outputs.out
  input = ctx.files.srcs
  print("generating", output.basename)
  ctx.action(
      use_default_shell_env = True,
      outputs = [output],
      inputs = input,
      progress_message="Generating %s with %s" % (output.path, input[0].path),
      command="/bin/cp %s %s" % (input[0].path, output.path)
  )

_generate_fbs = rule(
  implementation=_impl,
  output_to_genfiles = True,
  attrs={
       "srcs": attr.label_list(allow_files=True, allow_empty=False),
       "out": attr.output()
       },
)


def generate_fbs(name, srcs, out):
  _generate_fbs(
    name = "_%s" % name,
     srcs = srcs,
     out = out
  )

  native.cc_library(
    name = name,
    hdrs = [out],
    include_prefix = ".",
    visibility = ["//visibility:public"],
  )

С этим я мог бы получить data/maps/BUILD:

load("//tools:generate_fbs.bzl", "generate_fbs")

generate_fbs(
  name = "schema",
  srcs = ["map_schema.fbs"],
  out = "map_schema_generated.h",
)

А src/map/BUILD содержит:

cc_library(
  name = "map",
  srcs = [
    "map.cpp",
    "map.hpp",
  ],
  deps = [
     "//data/maps:schema",
  ]
)

И bazel build //src/map строит bazel-bin/src/map/libmap.a и bazel-bin/src/map/libmap.so.

...