Как создать пользовательские местоположения bazel-bin (bazel-bin /<var1>/<subpackage>/<var2>) для каждого подпакета?

Вкратце, как мы можем настроить: 1. расположение "bazel-bin" с помощью "bazel-bin / opt" и 2. "bazel-bin/subpackage-A/" с помощью "bazel-bin/opt/subpackage-A/bin" / "любыми техническими средствами?

По аналогии с концепцией "output_to_bindir=1", любой пакет Bazel на корневом уровне позволяет расширять / использовать любой универсальный ctx.actions/genrule/plugin для определения пути вывода для каждого отдельного пакета для конкретного субпакета "bazel-bin/opt/subpackage-A/bin/"местоположение?

Мы не очень уверены, что проблема заключается в использовании нашей реализации API или ограничении спецификации Bazel ( Declare_Directory, Genrule)?

Предположим, что сборка имеет базовые структуры как встроенные:

root/BUILD, root/build_rules.bzl
|
|--subpackage-A/BUILD
|    |--name
|    |--bins
|    |--etcs
|    |--deps
|    ...
|
|--subpackage-B/BUILD
|    |--name
|    |--bins
|    |--etcs
|    |--deps
...  ...

----

Default generation with "output_to_bindir=1" under ctx.actions.run_shell():

    ctx.actions.run_shell(
      # COMMENTED CODES DOES NOT WORK EVEN ON BAZEL 0.13.0
      #arguments = ["-p", ctx.bin_dir, ],
      #arguments=[ output1.path, ctx.outputs.out.path, ],
      #inputs=[ctx.files.deps[a]],
      #outputs = ["opt/"+ctx.label.name+"/bin/"+file_name],
      #outouts=[":bazel-bin" + "/opt/" + file_name + "/bin/"],
      progress_message="run_shell.....",
      command="cp -vf $< $@",
      local = 1,
      output_to_bindir=1
    )

default output structure:

bazel-bin
|--root_app1
|
|--sub-pkg-A
|    |--childA_app1
|--sub-pkg-B
|    |--childB_app1


----

Now, the desired generation structure would looks like:

bazel-bin
|--opt
|   |--root_app1
|   |
|   |--sub-pkg-A
|   |    |--bin
|   |        |--childA_app1
|   |
|   |--sub-pkg-B
|   |    |--bin
|   |        |--childB_app1

Если вышеуказанная структура ожидаемого поколения технически выполнима с использованием спецификации Bazel, root / build_rules.bzl верхнего уровня может выполнять следующие задачи:

Бины параметров из [subpackage-A|subpackage-B|...] должны принимать только метки cc_binary, а эти цели должны копироваться в "bazel-bin/opt/[subpackage-A|subpackage-B|...]/ бен /"

Параметр etcs должен принимать только файловую группу, и эти файлы в файловой группе должны копироваться в "bazel-bin/opt/[subpackage-A|subpackage-B|...]/etc/"

Попытка сгенерированной ошибкой genrule(): genrule() не может быть вызвана на этапе анализа.


Дальнейшая попытка с пользовательскими развертываниями ctx.actions.declare_directory(), также сталкивающимися с ошибками компиляции, даже с последней меткой Bazel 0.13.0.

 root/build_rules.bzl

    def _extrule(ctx):
    dir = ctx.actions.declare_directory("opt/child1/bin")
    ctx.actions.run_shell(
    #outputs = [dir, ctx.outputs.out],
    outputs = [dir],
    command = "mkdir -p " + dir.path + "; cp -vf $< $@",
    progress_message="run_shell.....",
    output_to_bindir=1
    )

    extrule = rule(
    implementation = _extrule,
    outputs = {
    "out": outputs.dir(default="opt/child1/bin"),
    },
    output_to_genfiles = False,
    attrs = {
    # Do not declare "name": It is added automatically.
    # https://github.com/bazelbuild/examples/blob/master/rules/attributes/printer.bzl
    "number": attr.int(default = 1),
    "bins": attr.label_list(),
    "deps": attr.label_list(),
    "etcs": attr.label_list(),
    },
    )

    $ bazel clean; bazel build -s ...
    INFO: Starting clean (this may take a while).
    ERROR: /home/user/root_pkg/build_rules.bzl:line:xx: name 'outputs' is not defined
    ERROR: error loading package '': Extension 'build_rules.bzl' has errors
    INFO: Elapsed time: 0.090s
    INFO: 0 processes.
    FAILED: Build did NOT complete successfully (0 packages loaded)
    currently loading: ... (2 packages)


    $ bazel version
    Build label: 0.13.0
    Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
    Build time: Mon Oct 18 21:33:40 +50297 (1525078013620)
    Build timestamp: 1525078013620
    Build timestamp as int: 1525078013620

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 16.04.3 LTS
    Release:    16.04
    Codename:   xenial
    user@hostname $ uname -a
    Linux hostname 4.13.0-38-generic #43~16.04.1-Ubuntu SMP Wed Mar 14 17:48:43 
    UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Любая идея / подсказка будет высоко ценится.

0 ответов

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