如何在 makefile 中将我的 git 提交附加到我的 bin 中?

How can I append my git commit to my bin within makefile?

我正在尝试在 make 文件中创建一个规则来读取 git 提交并追加到二进制文件的名称中,到目前为止,我正在努力解决将保存提交的变量这一事实似乎是空的,

append_git_commit: $(preName)/FLASH.bin
    GIT_COMMIT=$(git log -1 --pretty=format:%h)
    echo "$(info GIT_COMMIT="$(GIT_COMMIT)")"

显示这个

GIT_COMMIT=
echo ""

这是为什么?我希望 GIT_COMMIT 像 GIT_COMMIT=62f9926a

一样保存我的哈希

其次,如何将此 GIT_COMMIT 内容附加到我的 FLASH.bin 以便结果为

FLASH_62f9926a.bin

谢谢

您当前的Makefile存在多个问题。

GIT_COMMIT=$(git log -1 --pretty=format:%h)

没有按照您的预期执行,因为它是 make 变量扩展而不是 shell 中的命令扩展。要将其传递给基础 shell,您必须转义 $:

GIT_COMMIT=$$(git log -1 --pretty=format:%h)

在下一行,$(GIT_COMMIT) 指的是 GIT_COMMIT 变量而不是 shell 变量。

然后遇到一个问题:

    从 make 执行的
  • setting variable in shell 不会设置 make 变量(也意味着 info 无法访问上面 shell 命令中发生的事情); shell 是 make
  • 的子进程
  • 并且配方的每一行都在其自己的 shell 实例中运行(因此一行中的变量在下一行中不可见)

如果我明白你在追求什么,我可能会这样做:

GIT_COMMIT := $(shell git log -1 --pretty=format:%h)

append_git_commit: $(preName)/$(GIT_COMMIT)_FLASH.bin

$(preName)/$(GIT_COMMIT)_FLASH.bin: $(preName)/FLASH.bin
        cp "$<" "$@"

使用 make 变量并引入中间目标,只要没有新的修订并且 $(preName)/FLASH.bin 没有更新,也不需要为 append_git_commit 做任何事情,因为它现在知道它需要从 $(preName)/FLASH.bin 创建 $(preName)/$(GIT_COMMIT)_FLASH.bin 并且在评估 Makefile 时所有细节都知道。