在 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 不关心引号(在变量值或扩展中)并且不以任何方式特殊对待它们。