如何使用 GNU-make 变量保护文件中的 git 信息

How do I safe git information in a file using GNU-make variables

我想将一些 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 块工作正常,因为我检查了在检查 Master 或其他一些分支时将虚拟文本打印到 version.txt 文件。 我还看到了获取日期或分支的命令没问题,因为我可以像这样将它们放入文本文件:

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

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

$(DATE) > $@ 

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

  1. 您不能在配方中创建 GNU make 变量并稍后在 GNU make 文件中使用它们,因为 GNU make 首先解析整个文件然后 运行s 配方
  2. 您不能在食谱中使用 GNU make ifeqs
  3. 命令行中的
  4. % 可能会导致 Windows 出现问题,因此我在以下代码中为其添加了一个解决方法(如果您的 Makefile 只适用于类 Unix 系统,请跳过它)
  5. ' 不应在 ifeqs 常量中使用(GNU make 按字面意思读取)
  6. 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

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