【发布时间】:2020-06-23 00:17:31
【问题描述】:
场景
我在尝试将命令中的值分配给 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;
如您所见,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;
我真的对 BIM 抱有希望。但遗憾的是,它只返回我想运行的命令。我尝试向其添加另一层$() 和/或``,但结果却是空输出。
我想要的输出是在 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'`
这可能看起来有点复杂,但我这样做有两个主要原因:我希望它具有高度可配置性,无需自己编辑命令,还因为我想学习如何制作 Makefile正确。
【问题讨论】: