为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Makefile目标中使用Bash语法?

/ 猿问

如何在Makefile目标中使用Bash语法?

慕仙森 2019-11-26 14:43:11

我经常发现Bash语法非常有用,例如像中的流程替换diff <(sort file1) <(sort file2)。


是否可以在Makefile中使用此类Bash命令?我在想这样的事情:


file-differences:

    diff <(sort file1) <(sort file2) > $@

在我的GNU Make 3.80中,这将产生错误,因为它使用shell而不是bash执行命令。


查看完整描述

3 回答

?
慕妹3242003

从GNU Make文档中,


5.3.1 Choosing the Shell

------------------------


The program used as the shell is taken from the variable `SHELL'.  If

this variable is not set in your makefile, the program `/bin/sh' is

used as the shell.

因此,将其放在SHELL := /bin/bashmakefile的顶部,您应该一切顺利。


顺便说一句:您也可以针对一个目标执行此操作,至少对于GNU Make而言。每个目标可以有自己的变量分配,如下所示:


all: a b


a:

    @echo "a is $$0"


b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only

b:

    @echo "b is $$0"

打印:


a is /bin/sh

b is /bin/bash

有关更多详细信息,请参见文档中的“特定于目标的变量值”。该行可以在Makefile中的任何地方进行,而不必紧接在目标文件之前。


查看完整回答
反对 回复 2019-11-26
?
慕慕森

您可以bash直接调用,使用-c标志:


bash -c "diff <(sort file1) <(sort file2) > $@"

当然,您可能无法重定向到变量$ @,但是当我尝试执行此操作时,我收到-bash: $@: ambiguous redirect一条错误消息,因此您可能想在深入了解它之前先进行研究(尽管我使用bash 3.2.something,所以也许您的工作原理有所不同)。


查看完整回答
反对 回复 2019-11-26
?
森栏

无需显式将SHELL变量设置为指向bash,就可以执行此操作。如果您有许多makefile,这将很有用,因为SHELL不会被后续的makefile继承或从环境中获取。您还需要确保任何编译您的代码的人都以这种方式配置他们的系统。


如果运行sudo dpkg-reconfigure dash并对提示回答“否”,则系统将不使用破折号作为默认外壳程序。然后它将指向bash(至少在Ubuntu中)。请注意,虽然使用破折号作为系统外壳会更有效。


查看完整回答
反对 回复 2019-11-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信