Как использовать сценарий оболочки, который генерирует выходные файлы перед последующими целями сборки Bazel

У меня есть несколько файлов protobuf, которые я создаю с помощью сценария оболочки, например:

прото.ш

      #!/usr/bin/env bash

rm -rf ./proto-out
mkdir -p proto-out
protoc -Iproto --cpp_out=./proto-out ./proto/*.proto

Однако я не понимаю, что делать в моем файле BUILD, чтобы получить выходные классы и заголовки С++. Позже мне нужно будет также использовать заголовки в других зависимых библиотеках. Я пробовал с genrule так:

      genrule(
    name = "proto-build",
    srcs = glob(["proto/*.proto"]),
    outs = [
        "proto-out/point.pb.h",
        "proto-out/point-geodetic.pb.h",
        "proto-out/point-ned.pb.h",
        "proto-out/point.pb.cc",
        "proto-out/point-geodetic.pb.cc",
        "proto-out/point-ned.pb.cc",
    ],
    cmd = "$(location proto.sh)",
    tools = ["proto.sh"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "protobuf-common",
    srcs = [
        "proto-out/point.pb.cc",
        "proto-out/point-geodetic.pb.cc",
        "proto-out/point-ned.pb.cc",
    ],
    hdrs = [
        "proto-out/point.pb.h",
        "proto-out/point-geodetic.pb.h",
        "proto-out/point-ned.pb.h",
    ],
    copts = ["--std=c++17"],
    data = [":proto"],
    includes = ["proto-out"],
    visibility = ["//visibility:public"],
)

но от выполнения этого никогда не будет никакого результата, и сборка cc_library, конечно же, завершится ошибкой. Это мой первый день, когда я оцениваю Bazel как потенциальную замену CMake в моей команде, поэтому любая помощь будет оценена по достоинству.

Спасибо

1 ответ

Хотя вы, безусловно, можете заставить работать подход genrule + cc_library, существуют наборы правил для proto, которые сделают все это за вас:

      cc_library(
    name = "your_code",
    srcs = ["your_code.cc"],
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Видеть:

https://bazel-contrib.github.io/SIG-rules-authors/proto-grpc.html

https://docs.bazel.build/versions/main/be/c-cpp.html#cc_proto_library

https://github.com/bazelbuild/rules_proto

https://github.com/bazelbuild/bazel/blob/45f462893df4d55cee19c05ab01e051e229597a3/src/main/protobuf/BUILD#L172-L175

Другие вопросы по тегам