8

我想在 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类型

用例是我想使用 bazel创建一个squashfs 。

需要注意的是,Bazel 提供了一些打包功能。

创建 squashfs,该命令需要一个包含工件的目录结构。

4

3 回答 3

3

就我而言,我想创建一个目录结构并运行 mksquashfs 来生成一个 squashfs 文件。

为了做到这一点,我最终修改了bazel 的包装文档中的基本示例。

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 或目录结构而无需中间 tar,我将给出最佳答案。

于 2019-02-20T17:54:50.843 回答
1

您可以创建这样一个使用 genrule 的 Bazel 宏:

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",
    ],
    # ...
)
于 2021-10-27T14:18:53.653 回答
0

您始终可以创建一个genrule目标或一个shell_binary目标来执行 bash 命令或创建这些目录的 shell 脚本(分别)。

您可以使用genrulebazel$(location)来确保您创建的 dir 结构将位于 bazel沙箱环境中的输出路径下。genrule示例显示了如何准确地使用它。

在这里,您可以找到有关预定义输出路径的更多详细信息。

于 2019-02-21T09:53:22.673 回答