gnu-make - 如何使用 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 变量并稍后在 GNU make 文件中使用它们,因为 GNU make 首先解析整个文件然后运行配方
- 你不能
ifeq
在食谱中使用 GNU make %
在命令行中可能会导致 Windows 出现问题,因此我在以下代码中添加了一个解决方法(如果您的 Makefile 仅适用于类 Unix 系统,请跳过它)'
不应在ifeq
s 常量中使用(GNU make 从字面上理解)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
每次运行时都会计算。make
src/version2.txt
推荐阅读
- python - 我可以在单个数据框中有 2 个索引吗?
- java - Java:从内部类访问受保护的字段
- mysql - php准备好的语句多个可能的查询
- mysql - MYSQL - 获取两个日期(从,到)之间的所有月份以及本月的数据
- c# - 如何在 Unity 中创建“移动”边界?
- deep-learning - 使用从磁盘加载的 CNN 模型进行预测后出错
- asp.net-core - JWT 令牌在 asp.net core 3.1 中强制过期
- ionic-framework - Ionic React:如何集成自定义字体和图标集
- amazon-web-services - Amazon Cognito 用户池 - 使用“用户名”属性存储自定义用户 ID
- excel - 具有表头过滤值的单元格验证列表