Как создать пользовательские местоположения 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
Любая идея / подсказка будет высоко ценится.