如何在bazel中创建目录结构

时间:2019-02-14 00:58:26

标签: linux build bazel squashfs skylark

我想在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 provides some packaging会起作用。

对于create a squashfs,该命令需要一个填充有工件的目录结构。

2 个答案:

答案 0 :(得分:2)

对于我来说,我想创建一个目录结构并运行mksquashfs来生成一个squashfs文件。

为此,我最终修改了bazel's docs on packaging中的基本示例。

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或目录结构的方法,我将为您提供最佳答案。

答案 1 :(得分:0)

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

通过genrule,您可以使用bazel的$(location),以确保您创建的目录结构位于bazel的sandbox环境内部的输出路径下。 genrule example显示了如何正确使用它。

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