将 env 发送到 makefile 目标

将 env 发送到 makefile 目标

我正在尝试为 makefile 目标设置一个环境变量,即 git sha1 commit。我设置了很多环境变量,但只有这个失败,没有这样的文件或目录错误。我真是糊涂了。请帮我将其作为环境变量传递给我的 makefile 目标。这是我在 Makefile 开头所做的。

SHA1 := $(shell git log | head -1 | awk '{print $2}')
BUILD_STAMP := $(shell date +%s)
export SHA1
export BUILD_STAMP

其中一个 makefile 目标是这样的。

target: dep-target
     env \
              VAR1=$(VAR1) \
              GIT_SHA1=$(SHA1) \
     my-command for the target

这失败了

env: a6d23d14b0fbb613e567cc647ebfe2808ce47af1: No such file or directory

请帮我将其设置为环境变量。

答案1

VAR1=$(VAR1)
 GIT_SHA1=$(SHA1)

以这种方式使用的圆括号(圆括号)与$它们前面的 a 一起使用将导致括号之间的文本作为命令行发送到 Bash 以尝试执行。

用花括号代替,即GIT_SHA1=${SHA1},您将获得预期的变量赋值。

答案2

我没有足够的代表来评论@Hannu 的错误答案(花括号和圆括号在 Make 中是等效的)。

要调试此类事情,请创建一个单独的简短 Makefile 并尝试执行以下操作:

SHA1 := $(shell git log | head -1 | awk '{print $2}')
all:
        echo "$(SHA1)"

这表明 SHA1 被分配了整个 git log 输出的第一行,而不仅仅是 SHA,其中包括空格。扩展的 env 命令将具有无效语法。

在这种情况下,awk 命令中的美元符号需要加倍(打印 $$2),以便扩展为文字美元符号而不是空变量 $(2)。

相关内容