Выполнение native_binary внутри правила bazel

#bazel #bazel-rules

#bazel #базовые правила

Вопрос:

@bazel_skylib//rules:native_binary.bzl определяет native_binary правило, которое может использоваться для переноса собственных исполняемых файлов внутри целевого объекта bazel. Я использовал его для упаковки инструмента упаковки, вызываемого packfolder.exe из Sciter SDK.

Я поместил двоичный файл в свое дерево исходных third_party/sciter/packfolder.exe текстов и записал этот BUILD файл.

 # third_party/sciter/BUILD
native_binary(name = "packfolder",
              src = "packfolder.exe",
              out = "packfolder.exe"
)
 

bazel run third_party/sciter:packfolder выполняется без проблем. Теперь я хочу использовать эту цель внутри моего пользовательского cc_sciter_resource правила.

 # third_party/sciter/sciter_rules.bzl

def _impl(ctx):
    in_files = ctx.files.srcs
    output_file = ctx.actions.declare_file(ctx.label.name)
    ctx.actions.run(
        outputs = [output_file],
        inputs = in_files,
        arguments = [],
        executable = ctx.executable.packfolder.path)
    return DefaultInfo(files = depset([output_file]))

cc_sciter_resource = rule(
    implementation = _impl,
    attrs = {
        "srcs": attr.label_list(),
        "packfolder": attr.label(
            default = Label("//third_party/sciter:packfolder"),
            executable = True,
            cfg = "exec"
        ),        
    }
)
 

Проблема в том, что когда я пытаюсь создать цель, которая использует это правило, скажем

 cc_sciter_resource(
    name = "hello_world_resource.cpp"
    srcs = [...]
)
 

Я получаю следующую ошибку.

 ERROR: C:/users/marki/sciter-bazel/examples/BUILD:12:19: Action examples/hello_world_resource.cpp failed (Exit -1): packfolder.exe failed: error executing command
  cd C:/users/marki/_bazel_marki/kiodv2fz/execroot/sciter_bazel
bazel-out/x64_windows-opt-exec-2B5CBBC6/bin/third_party/sciter/packfolder.exe
Execution platform: @local_config_platform//:host. Note: Remote connection/protocol failed with: execution failed
Action failed to execute: java.io.IOException: ERROR: src/main/native/windows/process.cc(202): CreateProcessW("C:usersmarki_bazel_markikiodv2fzexecrootsciter_bazelbazel-outx64_windows-opt-exec-2B5CBBC6binthird_partysciterpackfolder.exe"): The system cannot find the file specified.
 (error: 2)
Target //examples:hello_world_resource.cpp failed to build
 

Каталог C:usersmarki_bazel_markikiodv2fzexecrootsciter_bazelbazel-outx64_windows-opt-exec-2B5CBBC6 не существует на моем компьютере. Таким образом, ошибка является точной, но я не знаю, как решить проблему.

Ответ №1:

 --- sciter_rules.bzl
    sciter_rules.bzl
@@ -6,7  6,7 @@
         outputs = [output_file],
         inputs = in_files,
         arguments = [],
-        executable = ctx.executable.packfolder.path)
         executable = ctx.executable.packfolder)
     return DefaultInfo(files = depset([output_file]))
 
 cc_sciter_resource = rule(
 

ctx.executable.packfolder.path это просто строка, поэтому Bazel не знает, что packfolder исполняемый файл необходимо добавить в качестве входных данных для действия.