makefile 将命令分配给

Pet*_*ete 3 freebsd makefile

我可能很愚蠢,但我无法在我的 Makefile 中进行最基本的变量分配。

TEST = $(pwd);

all:
    echo $(TEST)
Run Code Online (Sandbox Code Playgroud)

当我在 FreeBSD (v9.1) 中从 Bash (v4.2.42) 运行“make all”时,我得到:

echo
Run Code Online (Sandbox Code Playgroud)

不知道我搞砸了什么。我还尝试使用 $(shell ...) 分配变量,结果相同。

如果我使用反引号(`),则基本赋值可以工作,但它不存储结果,而是存储命令。这在下面的示例 Makefile 中中断:

SERVERIP = `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}'`

all:
    echo $(SERVERIP)
    sed -e 's/%LISTENIP%/${SERVERIP}/g' test.conf > work/test.conf.tmp
Run Code Online (Sandbox Code Playgroud)

结果是:

[pete@pete] ~/make
echo `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $2}'`
10.128.28.151
sed -e 's/%LISTENIP%/`ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $2}'`/g' test.conf > work/test.conf.tmp
sed: 1: "s/%LISTENIP%/`ifconfig  ...": unescaped newline inside substitute pattern
*** [all] Error code 1
Run Code Online (Sandbox Code Playgroud)

您可以看到基本的变量赋值似乎可以工作,但是当您将结果插入 sed 时,它会插入整个命令而不是结果,这会破坏!

有任何想法吗?

皮特.

uzs*_*olt 5

也许答案为时已晚,但我希望我可以帮助(其他人)。

如果你不想安装 GNU,make你可以使用!=

TEST!=pwd
all:
    echo ${TEST}
Run Code Online (Sandbox Code Playgroud)

将工作。解释很简单,请仔细阅读FreeBSD 的 man make,特别是“VARIABLE ASSIGNMENTS”部分中的“Variable赋值修饰符”

变量赋值修饰符

可用于给变量赋值的五个运算符如下:...

!= 展开该值并将其传递给 shell 执行,并将结果赋给变量。结果中的任何换行符都将替换为空格。