Windows下Makefile获取Git短哈希命名hex文件失效问题
问题原因
你的配置有3个核心错误,导致功能完全没按预期运行:
- 变量根本没被赋值:你写的
@echo GIT_TAG = call ./getGitTag.sh只是用echo打印了一行文本,既没有执行getGitTag.sh脚本,也没有把脚本的输出存入GIT_TAG变量,所以这个变量从始至终都是空值。 - Windows环境兼容性问题:你手动运行.sh脚本正常,一般是因为你本地装了Git Bash、WSL之类的环境做了脚本关联,但Make在Windows下默认调用cmd.exe作为命令执行环境,cmd本身不识别.sh脚本,直接call根本跑不起来。
- 复制命令没有实际执行:你写的cp行前面也加了
@echo,同样只是打印了cp这行文字,没有真的执行文件复制操作,从你贴的运行输出里也能看到,cp那行是直接打印出来的内容,不是命令执行的反馈。
修正方案
完全不需要单独维护getGitTag.sh脚本,直接在Makefile里通过内置的shell函数调用git命令取短哈希即可,同时适配Windows cmd环境的命令习惯,修改后的配置如下:
- 首先在Makefile中所有用到
GIT_TAG的规则之前,提前定义变量,直接抓取8位长度的Git短提交哈希:
# 获取当前HEAD对应的8位短Git提交哈希 GIT_TAG := $(shell git rev-parse --short=8 HEAD) # 你原有的BUILD_DIR、BINARY、prebuild、postbuild等配置保持不变即可 tag : prebuild postbuild addtag addtag : $(BUILD_SDIR)/$(BINARY).hex @echo ---------------------------------------- @echo Getting Git tag @echo ---------------------------------------- @echo GIT_TAG = $(GIT_TAG) @echo ---------------------------------------- @echo Adding GIT tag to hex file @echo ---------------------------------------- # Windows cmd环境原生支持copy命令,兼容性比cp更好 copy $(BUILD_DIR)\$(BINARY).hex $(BUILD_DIR)\$(BINARY)_$(GIT_TAG).hex
注意事项
- Makefile规则下的所有命令行必须用Tab键缩进,不能用空格替代,否则Make无法识别为待执行命令。
- 命令前加
@的作用是「执行命令但不在终端打印命令本身」,如果前面加了@echo,就只会打印后面的文本,不会执行文本对应的操作。 - 如果确实要保留独立的sh脚本,需要在调用时明确指定sh脚本的解释器路径(比如你本地Git安装路径下的bash.exe),示例写法:
GIT_TAG := $(shell "C:\Program Files\Git\bin\bash.exe" ./getGitTag.sh),需要把路径替换为你本地的实际Git安装路径,这种方式依赖本地固定安装路径,可移植性比直接内联git命令差,不推荐使用。
内容的提问来源于stack exchange,提问作者bogdan.bodnarescu
相关产品推荐
相关产品推荐

