我在尝试将命令中的值分配给 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。
不,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 都必须进行转义。