在Makefile目标中定义局部变量



如何在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/$<"

最新更新