Проблема в том, что ваш 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
.