`custom_target` 的 `command` 中星号 (*) 的介子语法解析器问题 - Linux

meson syntax parser problem with ASTERISK(*) in `command` of `custom_target` - Linux

我在 运行Linux 上使用 ASTERISK *.ocommand of custom_target 上使用 ar 命令时遇到问题。 当 运行 执行此命令时:

  target_build_cmd = [
    'ar', '-qcs', '/home/bassem/meson/lib.a', meson.project_build_root() + '/tmp/*.o',
  ]
target_dma_lib = custom_target (
  'target_lib', 
  output: lib.a,  
  build_by_default: true,
  command: target_build_cmd,
)

我收到错误:

/usr/bin/ar -qcs /home/bassem/meson/lib.a '/home/bassem/meson/crono_dma_driver/tools/meson/bf5/tmp/*.o'                                                                                                                                        /usr/bin/ar: /home/bassem/meson/tmp/*.o: No such file or directory 

它附加了单引号,原因不明。 虽然,当我 运行 手动执行没有单引号的命令时,它会起作用:

ar -qcs /home/bassem/meson/lib.a /home/bassem/meson/crono_dma_driver/tools/meson/bf5/tmp/*.o                                                                                                   

此外,当我写其中一个文件而不是 ASTRISK 时,它可以工作,例如

  target_build_cmd = [
    'ar', '-qcs', '/home/bassem/meson/lib.a', meson.project_build_root() + '/tmp/sysfs.o',
  ]

我尝试使用 unicode 转义 /tmp/\N{ASTERISK}.o,得到了同样的错误。

如何在命令中传递*.o

介子版本:0.60.3

Linux: 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

首先,你用 custom_target 构建库有点奇怪 - 对于这样的标准操作,有 static_libary 函数,你检查过了吗如果它不能满足您的需求?

现在,问题本身:介子不支持通配符语法,原因在 reference FAQ:

Meson does not support this syntax and the reason for this is simple. This can not be made both reliable and fast. By reliable we mean that if the user adds a new source file to the subdirectory, Meson should detect that and make it part of the build automatically. ... The main backend of Meson is Ninja, which does not support wildcard matches either, and for the same reasons.

因此,按照本书的规定,您应该构建目标文件数组并将它们作为 input 参数传递,而不是在 command 中传递。 (顺便说一句,最好不要重复并明确指定输出,有占位符:@INPUT@,@OUTPUT@ - 签入the reference)。

然而,正如 next FAQ chapter 所解释的那样,有一个解决方法:将所有内容包装到自己的脚本中并将其作为命令执行(然后介子失去对正在发生的事情的控制,代价是性能、重复、隐藏路径等等,在这种情况下看起来不合理)。