如何在Makefile目标中定义局部变量?
我想避免重复文件名,如:
zsh:
FILENAME := "text.txt"
@echo "Copying ${FILENAME}...";
scp "${FILENAME}" "user@host:/home/user/${FILENAME}"
但我得到了一个错误:
FILENAME := "text.txt"
/bin/sh: FILENAME: command not found
与$(FILENAME)
相同
尝试
zsh:
export FILENAME="text.txt"
@echo "Copying ${FILENAME} to $(EC2)";
给我一个空值:
Copying ...
您不能在配方中定义make变量。配方在shell中运行,并且必须使用shell语法。
如果你想定义一个make变量,可以在配方之外定义它,比如:
FILENAME := text.txt
zsh:
@echo "Copying ${FILENAME}...";
scp "${FILENAME}" "user@host:/home/user/${FILENAME}"
请注意,在将值分配给make变量时,在值周围添加引号实际上是不正确的。Make不关心引号(在变量值或扩展中(,也不会以任何方式对它们进行特殊处理。
目标的规则由shell执行,因此可以使用shell语法设置变量:
zsh:
@FILENAME="text.txt";
echo "Copying $${FILENAME}...";
scp "$${FILENAME}" "user@host:/home/user/$${FILENAME}"
注意:
- 我正在使用
转义行尾,以便在同一个外壳
- 我正在通过写入
$$
来转义shell变量中的$
(否则make
将尝试将它们解释为make
变量(
对于这个显然依赖于名为text.txt
的文件的规则,您也可以将text.txt
声明为显式依赖项,然后编写:
zsh: text.txt
@echo "Copying $<...";
scp "$<" "user@host:/home/user/$<"