在 Makefile 目标中定义局部变量
Defining local variable in Makefile target
如何在 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 ...
目标的规则由 shell 执行,因此您可以使用 shell 语法设置变量:
zsh:
@FILENAME="text.txt"; \
echo "Copying $${FILENAME}..."; \
scp "$${FILENAME}" "user@host:/home/user/$${FILENAME}"
注意:
- 我正在使用
\
转义行尾,以便一切都在
同样的shell
- 我通过编写
$$
来转义 shell 变量中的 $
(否则
make
将尝试将它们解释为 make
个变量)。
对于这个显然依赖于名为 text.txt
的文件的规则,
您也可以将 text.txt
声明为显式依赖项,然后编写:
zsh: text.txt
@echo "Copying $<..."; \
scp "$<" "user@host:/home/user/$<"
您不能在配方中定义 make 变量。食谱在 shell 中 运行 并且必须使用 shell 语法 .
如果要定义 make 变量,请在配方之外定义它,如下所示:
FILENAME := text.txt
zsh:
@echo "Copying ${FILENAME}...";
scp "${FILENAME}" "user@host:/home/user/${FILENAME}"
请注意,在将值分配给 make 变量时,在值周围添加引号实际上是不正确的。 Make 不关心引号(在变量值或扩展中)并且不以任何方式特殊对待它们。
如何在 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 ...
目标的规则由 shell 执行,因此您可以使用 shell 语法设置变量:
zsh:
@FILENAME="text.txt"; \
echo "Copying $${FILENAME}..."; \
scp "$${FILENAME}" "user@host:/home/user/$${FILENAME}"
注意:
- 我正在使用
\
转义行尾,以便一切都在 同样的shell - 我通过编写
$$
来转义 shell 变量中的$
(否则make
将尝试将它们解释为make
个变量)。
对于这个显然依赖于名为 text.txt
的文件的规则,
您也可以将 text.txt
声明为显式依赖项,然后编写:
zsh: text.txt
@echo "Copying $<..."; \
scp "$<" "user@host:/home/user/$<"
您不能在配方中定义 make 变量。食谱在 shell 中 运行 并且必须使用 shell 语法 .
如果要定义 make 变量,请在配方之外定义它,如下所示:
FILENAME := text.txt
zsh:
@echo "Copying ${FILENAME}...";
scp "${FILENAME}" "user@host:/home/user/${FILENAME}"
请注意,在将值分配给 make 变量时,在值周围添加引号实际上是不正确的。 Make 不关心引号(在变量值或扩展中)并且不以任何方式特殊对待它们。