Bazel:genrule触摸(创建)两个文件

Bazel:genrule触摸(创建)两个文件,bazel,Bazel,我正在尝试创建一个既适用于windows又适用于unix的genrule,如果它们还不存在,它将创建两个文件 对于单个文件,以下操作有效: genrule( name = "create_files", outs = ["path/file1.h"], cmd_bat = "echo. >> $@", cmd = "touch $@", ) 但现在我想创建两个文件,以下文件似乎不起作用: genrule( name = "create_files", out

我正在尝试创建一个既适用于windows又适用于unix的genrule,如果它们还不存在,它将创建两个文件

对于单个文件,以下操作有效:

genrule(
  name = "create_files",
  outs = ["path/file1.h"],
  cmd_bat = "echo. >> $@",
  cmd = "touch $@",
)
但现在我想创建两个文件,以下文件似乎不起作用:

genrule(
  name = "create_files",
  outs = ["path/file1.h",
          "path/file2.h"],
  cmd_bat = "echo. >> $(OUTS)[0] && echo. >> $(OUTS)[1]",
  cmd = "touch $(OUTS)[0] && touch $(OUTS)[1]",
)
我发现了错误

declared output '...path/file2.h' was not created by genrule.

如何才能正确地做到这一点?

问题在于变量替换的工作方式以及数组在shell中的工作方式

cmd=touch$OUTS[0]&touch$OUTS[1]

Bazel将$out替换为输出文件的路径,使用空格作为分隔符。看

因此,命令变为

触摸路径/file1.h路径/file2.h[0]&触摸路径/file1.h路径/file2.h[1]

因此,您将两次接触path/file1.h和两个无关的文件

要实现这一目标,您只需:

cmd=触碰$OUTS

不过,我不知道如何在Windows上为cmd_bat执行此操作。我不知道有什么内置工具可以像touch那样创建多个空文件。您可能需要循环$OUTS并键入NUL>file或类似的内容。

我想在执行cmd批处理时,可以在$OUTS中运行多个项目。