【问题标题】:Shell wildcard/glob for optional string in a makefile用于生成文件中的可选字符串的 Shell 通配符/glob
【发布时间】:2019-07-19 12:27:55
【问题描述】:

我正在尝试在多平台 Makefile 中“优化”我的“干净”目标,因此我正在寻找一种方法来删除带有或不带有 Windows 扩展名 .exe 的可执行文件。

当然可以

rm file file.exe

但我正在寻找类似的东西

rm file(.exe)?

我也试过

rm file{,.exe}

这也不起作用。

我很惊讶地发现我尝试过的方法不起作用,所以我主要发布这个来了解更多关于 globing 的信息,因为具有两个显式文件名的版本可以正常工作。

【问题讨论】:

  • 修改了标题和标签以指定使用make,因为为makefile编写代码即使它最终将由shell执行往往与编写有很大不同用于直接 shell 解释的内容。
  • @CharlesDuffy 谢谢你。虽然我在想我也可以学习一些关于一般 shell globing 的知识。但最好让问题直截了当。

标签: shell makefile glob


【解决方案1】:

Make 默认使用/bin/sh 执行命令,它对通配符的支持有限。

$ cat Makefile 
test:
    echo foo{bar,baz}
$ make
echo foo{bar,baz}
foo{bar,baz}

如果您想使用花括号等花哨的功能,您需要通过设置 SHELL 来切换 shell。

$ cat Makefile 
SHELL = /bin/bash

test:
    echo foo{bar,baz}
$ make
echo foo{bar,baz}
foobar foobaz

我不一定建议这样做,因为它会降低您的 Makefile 的可移植性。

不管怎样,GNU Automake 的策略是根据平台设置一个EXEEXT 变量。那么干净的规则是:

rm -f file$(EXEEXT)

【讨论】:

  • 同意,我不想切换 shell。所以这有点表明我不能按照我想的方式做我想做的事。您对 Automake 的评论是在 Makefile 中寻求更好解决方案的触发因素。我已经在另一个项目中实现了 EXEEXT,但没有考虑它。我会接受这个作为答案,因为这帮助我找到了“问题”的“解决方案”。
猜你喜欢
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多