Как создать структуру каталогов в Базеле
Я хочу создать следующую структуру в bazel.
dir1
|_ file1
|_ file2
|_ dir2
|_file3
Создание определенной структуры не кажется тривиальным. Я надеюсь, что есть простое и многократно используемое правило. Что-то вроде:
makedir(
name = "dir1",
path = "dir1",
)
makedir(
name = "dir2",
path = "dir1/dir2",
deps = [":dir1"],
)
Что я пробовал:
- Я мог бы создать макрос со скриптом Python, но хотел бы что-нибудь чище.
- Я пытался создать жанру с
mkdir -p path/to/directoy
который не работал
РЕДАКТИРОВАТЬ:
Случай использования - я хочу создать squashfs, используя bazel.
Важно отметить, что Bazel предоставляет некоторые функции упаковки.
Для создания squashfs команде требуется структура каталогов, заполненная артефактами.
3 ответа
В моем случае я хочу создать структуру каталогов и запустить mksquashfs для создания файла squashfs.
Чтобы добиться этого, я изменил базовый пример из документации Базеля по упаковке.
load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
genrule(
name = "file1",
outs = ["file1.txt"],
cmd = "echo exampleText > $@",
)
pkg_tar(
name = "dir1",
strip_prefix = ".",
package_dir = "/usr/bin",
srcs = [":file1"],
mode = "0755",
)
pkg_tar(
name = "dir2",
strip_prefix = ".",
package_dir = "/usr/share",
srcs = ["//main:file2.txt", "//main:file3.txt"],
mode = "0644",
)
pkg_tar(
name = "pkg",
extension = "tar.gz",
deps = [
":dir1",
":dir2",
],
)
Если есть более простой способ создать tar или структуру каталогов без необходимости использования промежуточных tars, я сделаю лучший ответ.
Вы можете создать такой макрос Bazel, который использует genrule:
def mkdir(name, out_dir, marker_file = "marker"):
"""Create an empty directory that you can use as an input in another rule
This will technically create an empty marker file in that directory to avoid Bazel warnings.
You should depend on this marker file.
"""
path = "%s/%s" % (out_dir, marker_file)
native.genrule(
name = name,
outs = [path],
cmd = """mkdir -p $$(dirname $(location :%s)) && touch $(location :%s)""" % (path, path),
)
Затем вы можете использовать выходные данные, сгенерированные этим макросом, в определении pkg_tar:
mkdir(
name = "generate_a_dir",
out_dir = "my_dir",
)
pkg_tar(
name = "package",
srcs = [
# ...
":generate_a_dir",
],
# ...
)
Вы всегда можете создать цель genrule или цель shell_binary, которая будет выполнять команду bash, или сценарий оболочки (соответственно), который создает эти каталоги.
с genrule
Вы можете использовать Базель $(location)
это гарантирует, что созданная вами структура dir будет находиться в выходном пути внутри среды песочницы bazel. Пример genrule показывает, как именно его использовать.
Здесь вы можете найти более подробную информацию о предопределенных выходных путях.