首页 > 解决方案 > 如何使用 GNU-make 变量保护文件中的 git 信息

问题描述

我想将一些 git 信息保存在一个文本文件中,我想将其放入项目的 src 文件夹中。

如果分支 Master 被签出,我只想要最新提交的日期。如果签出任何其他分支,我想要分支的日期和名称,如下所示:

date-branchname

这是我的代码:

src/version2.txt:
    DATE=$(shell git log -1 --date=format:"%Y.%m.%d" --format="%ad")
    BRANCH=$(shell git rev-parse --abbrev-ref HEAD)
    
ifeq ($(BRANCH), 'Master')
    $(DATE) > $@
else
    DATE+='-'
    DATE+=$(BRANCH)
    $(DATE) > $@
    
endif

我是 GNU make 的新手,对它的语法很困惑。我假设我的 ifeq/else 块工作正常,因为我在version.txt签出 Master 或其他一些分支时检查了将虚拟文本打印到文件中。我还看到获取日期或分支的命令没问题,因为我可以像这样将它们放到文本文件中:

git log -1 --date=format:"%Y.%m.%d" --format="%ad" > $@

只有当我想使用变量时,变量似乎是空的,例如

$(DATE) > $@ 

似乎在文本文件中打印了一个空字符串。另外,我不知道我创建 DATE-BRANCH 输出的方式是否正确。我花了很长时间尝试,非常感谢一些帮助。谢谢

标签: gnu-make

解决方案


  1. 您不能在配方中创建 GNU make 变量并稍后在 GNU make 文件中使用它们,因为 GNU make 首先解析整个文件然后运行配方
  2. 你不能ifeq在食谱中使用 GNU make
  3. %在命令行中可能会导致 Windows 出现问题,因此我在以下代码中添加了一个解决方法(如果您的 Makefile 仅适用于类 Unix 系统,请跳过它)
  4. '不应在ifeqs 常量中使用(GNU make 从字面上理解)
  5. src/version2.txt不依赖于任何东西,因此不会被 GNU make 重新生成(如果它已经存在),.PHONY请考虑目标

尝试这个:

BRANCH:=$(shell git rev-parse --abbrev-ref HEAD)

ifeq ($(OS),Windows_NT)
  P:=%%
else
  P:=%
endif

.PHONY : src/version2.txt

ifeq ($(BRANCH),master)
src/version2.txt :
    git log -1 --date=format:"$PY.$Pm.$Pd" --format="$Pad" >$@
else
src/version2.txt :
    git log -1 --date=format:"$PY.$Pm.$Pd" --format="$Pad-$(BRANCH)" >$@
endif

请注意,即使不应重新生成,BRANCH每次运行时都会计算。makesrc/version2.txt


推荐阅读