Создание файлов C++ с помощью py_binary и genrule
У меня есть скрипт Python с именемblob_to_cpp.py
(находится вscirpts/blob_to_cpp.py
относительноWORKSPACE.bazel
файл). Сценарий Python принимает входной файл (например,weights/rt_alb.tza
) и генерирует из него заголовок C++ (.h
) и исходный файл (.cpp
), который я хочу добавить в файл .
Исходный код моего минимально воспроизводимого примера можно найти здесь.
Сценарий Python можно вызвать через:
bazel run //:blob_to_cpp -- -o weights/rt_alb.cpp -H weights/rt_alb.h weights/rt_alb.tza
я пытаюсь использоватьgenrule
для вызова скрипта Python (базелизованного черезpy_binary
как//:blob_to_cpp
)
базель/odin_generate_cpp_from_blob.bzl:
"""
SPDX-FileCopyrightText: 2023 Julian Amann <dev@vertexwahn.de>
SPDX-License-Identifier: Apache-2.0
"""
def generate_cpp_from_blob_cc_library(name, **kwargs):
native.genrule(
name = "%s_weights_gen" % name,
srcs = ["weights/" + name],
outs = [
"weights/" + name[0:-4] + ".cpp",
"weights/" + name[0:-4] + ".h",
],
cmd = "./$(location //:blob_to_cpp) weights/%s -o weights/%s.cpp -H weights/%s.h" % (name, name[0:-4], name[0:-4]),
tools = ["//:blob_to_cpp"],
)
native.cc_library(
name = name,
srcs = ["weights/" + name[0:-4] + ".cpp"],
hdrs = ["weights/" + name[0:-4] + ".h"],
**kwargs
)
Когдаgenerate_cpp_from_blob_cc_library
Вызывается макрос Bazel. Я получаю следующие сообщения об ошибках (bazel build //:Demo
):
ERROR: /Users/vertexwahn/dev/Piper/BazelDemos/intermediate/Cpp/BlobToCpp/BUILD.bazel:14:34: declared output 'weights/rt_alb.cpp' was not created by genrule. This is probably because the genrule actually didn't create this output, or because the output was a directory and the genrule was run remotely (note that only the contents of declared file outputs are copied from genrules run remotely)
ERROR: /Users/vertexwahn/dev/Piper/BazelDemos/intermediate/Cpp/BlobToCpp/BUILD.bazel:14:34: declared output 'weights/rt_alb.h' was not created by genrule. This is probably because the genrule actually didn't create this output, or because the output was a directory and the genrule was run remotely (note that only the contents of declared file outputs are copied from genrules run remotely)
ERROR: /Users/vertexwahn/dev/Piper/BazelDemos/intermediate/Cpp/BlobToCpp/BUILD.bazel:14:34: Executing genrule //:rt_alb.tza_weights_gen failed: not all outputs were created or valid
Target //:Demo failed to build
Моя цель - сгенерировать файлыweights/rt_alb.cpp
иweights/rt_alb.h
. Мне нужно, чтобы они были в папке, так как мойcc_binary
ожидает, что заголовочный файл находится в пределахweights
папка (#include "weights/rt_alb.h"
).
МойBUILD.bazel
файл выглядит так:
load("//bazel:odin_generte_cpp_from_blob.bzl", "generate_cpp_from_blob_cc_library")
py_binary(
name = "blob_to_cpp",
srcs = ["scripts/blob_to_cpp.py"],
data = ["weights/rt_alb.tza"]
)
generate_cpp_from_blob_cc_library(
name = "rt_alb.tza"
)
cc_binary(
name = "Demo",
srcs = ["main.cpp"],
deps = [":rt_alb.tza"],
)
Приветствуются любые подсказки, чтобы заставить эту работу работать!
1 ответ
Проблемаdeclared output 'weights/rt_alb.cpp' was not created by genrule
обычно означает, что команда в genrule помещает файлы в другое место, а не туда, где их ожидает bazel. Вы можете использовать$(location target)
для входов и выходов, а также для инструментов:
# Copyright 2023 Google LLC.
# SPDX-License-Identifier: Apache-2.0
def generate_cpp_from_blob_cc_library(name, **kwargs):
src = "weights/" + name
cpp_out = "weights/" + name[0:-4] + ".cpp"
header_out = "weights/" + name[0:-4] + ".h"
native.genrule(
name = "%s_weights_gen" % name,
srcs = [src],
outs = [
cpp_out,
header_out,
],
cmd = ("./$(location //:blob_to_cpp) $(location {src}) " +
"-o $(location {cpp_out}) " +
"-H $(location {header_out})").format(
src = src,
cpp_out = cpp_out,
header_out = header_out),
tools = ["//:blob_to_cpp"],
)
native.cc_library(
name = name,
srcs = [cpp_out],
hdrs = [header_out],
**kwargs
)