Как создать структуру каталогов в Базеле

Я хочу создать следующую структуру в 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 показывает, как именно его использовать.

Здесь вы можете найти более подробную информацию о предопределенных выходных путях.

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