如何通过Starlark从usr / bin“适当”调用可执行文件?

时间:2018-11-05 22:25:50

标签: bazel

根据我的一条规则,我想通过unzip -d解压缩文件,以便可以访问某些标头。

当前,我是通过使用PATH上的任何解压缩来实现的。

ctx.actions.run(
      ...
      executable = "unzip",
)

或者,我可以使用/usr/bin/unzip来避免依赖我的PATH。但是,尚不清楚应采用哪种惯用方法。根据我对文档的阅读,理想情况下,我会为unzip设置某种规则会调用的Bazel二进制目标。不过,还不清楚我将如何定义该二进制目标,也许是sh_binary

1 个答案:

答案 0 :(得分:1)

正确的解决方案是在您的存储库中包含一个解压缩实用程序。 (要么在源树中,要么作为外部存储库导入。)

否则,我认为最原则的方法是编写一个存储库规则,使用unzip从PATH中查找repository_ctx.which(或者只是希望存在“ / usr / bin / unzip”)并使用包含封装sh_binary工具的unzip创建一个BUILD文件(repository_ctx.file)。

在两种情况下,您都必须向使用规则添加标签属性“ _unzip_tool”:

"_unzip_tool": attr.label(
                   executable = True,
                   cfg = "host",
                   default = Label("@unzip//:unzip_tool"),
               ),

并像这样使用它:

ctx.actions.run(
    ...,
    executable = ctx.executable._unzip_tool,
)