После просмотра в Интернете и открытия темы на bazel-Discussion кажется, что нет никакого способа объявить выходные данные вне вывода root.
Решение I выбрано создание сценария-оболочки, который cd
s в выходной каталог out_dir
, который оценивается как paths.join(ctx.bin_dir.path, ctx.label.package)
Обсуждается причина, по которой я выбрал cd
, а не mv
или cp
в обсуждении bazel.
После cd
в out_dir
пути файлов, передаваемых двоичному файлу в качестве аргументов, больше не действительны, и их можно исправить, добавив к ним ..
s. Если файлы, которые должны быть исправлены, находятся в depset
, и вам требуется исправить пути без преобразования depset
в список, вы можете добавить фиксированное значение пути, используя параметр format_each
args.add_all()
.
Это не самое элегантное решение, но, насколько я знаю, не ставит под угрозу функциональность. Вот пример кода:
# Inside implementation function:
out_dir = paths.join(ctx.bin_dir.path, ctx.label.package)
path_fix = "/".join(len(out_dir.split("/"))*[".."])
args = ctx.actions.args()
args.add_all(files_depset, format_each=path_fix+"/%s")
ctx.actions.run_shell(..., command = "cd {out_dir}; {binary} $@".format(
out_dir = out_dir,
binary = your_binary
))