make 不支持反引号符号吗?

maz*_*nki 3 bash makefile

设想

我在尝试将命令中的值分配给 makefile 中的变量时遇到了一些麻烦。使用反引号表示法似乎工作得很好,但是一旦我使用更现代的$(pwd)表示法,变量的值就不会返回任何内容。

$ cat Makefile
FOO=moo
BAR=$(pwd)
BAZ=`pwd`

all: foo bar baz

foo: 
    @echo foo:$(FOO)';'
bar:
    @echo bar:$(BAR)';'
baz:
    @echo baz:$(BAZ)';'
$ make all
foo:moo;
bar:;
baz:/home/mazunki;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,FOO 和 BAZ 按预期工作。但酒吧不是。

问题

现在让我们通过添加更多示例来看看我的问题。当你明白我的想法时,我将跳过回声。

$ cat Makefile
SHELL=/bin/env bash

FOO=dog
BAR=$(pwd)
BAZ=`pwd`
QUZ=`$(FOO)`/cat
ZOT=`\`FOO\``/owl
BIM=`$(BAZ)`/rat
BAM=`\`BAZ\``/pig
BUM=`BUM`/fox

all: foo bar baz quz zot bim bam bum
# targets for all the things

$ make
foo:dog;
bar:;
baz:/home/mazunki;
bash: dog: command not found
quz:/cat;
bash: FOO: command not found
zot:/owl;
bim:pwd/rat;
bash: BAZ: command not found
bam:/pig;
bash: BAZ: command not found
bum:/fox;

Run Code Online (Sandbox Code Playgroud)

我真的对 BIM 抱有希望。但遗憾的是,它只返回我想要运行的命令。我尝试添加另一层$()and/or ``,但结果是空输出。

我想要的输出是在 Bash 中运行得到的输出echo -n $(pwd)/rat。我的测试示例都不允许我这样做。我希望能够做到这一点,因为我用于前言变量的一些命令是基于初始设置的,如下所示:

# User settings
ROOT=`pwd`
SRCPATH=$(ROOT)/src/
OBJPATH=$(ROOT)/objects/

# Scripting
SRCFILES=`find $(SRCPATH) -name '*.ext' -printf '%p '`
OBJFILES=`find $(SRCPATH) -name '*.ext' -printf '$(OBJPATH)/%p ' | sed 's/^$(SRCPATH)/^$(OBJPATH)//g; s/.ext;/.obj;/g; s/;$//g'`
Run Code Online (Sandbox Code Playgroud)

它可能看起来有点复杂,但我这样做有两个主要原因:我希望它具有高度可配置性,而不必自己编辑命令,而且我想学习如何正确制作 Makefile。

tha*_*guy 7

不,Makefile 不支持这种方式的反引号。Makefile 不是 shell 脚本,并且根本不与 bash 共享语法。

您的示例BAZ似乎只能工作,因为反引号最终被逐字复制到 shell,因此 Make 变量BAZ包含`pwd`不是 /home/mazunki),并且当注入到 shell 命令中时,会导致 shell 运行echo `pwd`。Make 从未以任何方式解释反引号。

要从 make 调用 shell 命令,您可以使用$(shell ...)

var := $(shell pwd)
foo:
        @echo $(var)
Run Code Online (Sandbox Code Playgroud)

请注意,该命令也是一个 Make 表达式,而不是直接的 shell 命令,因此$您想要传递给底层 shell 的任何 s 都必须进行转义。