2014-06-20 42 views
1

对于Makefile的目的,我怎么知道当前分支的HEAD已经改变了?Makefile的跟踪分支变化

我正在寻找这样的事情,但对于一个普通的当前分支:

all: report.txt 

report.txt: .git/refs/heads/master 
    touch report.txt 

回答

2

.git/HEAD给出了当前分支的裁判,这样你就可以反引用.git/HEAD,以获得实际当前分支参考。

all: report.txt 

current := $(shell cut -c6- .git/HEAD) 

report.txt: .git/${current} 
     touch report.txt 

请注意,如果您切换分支,你会发现一个变化即使新的分支是在同犯与以前的分支。

1
SHELL:=/bin/bash 

all: report.txt 

report.txt: up-to-date 
     @echo 'Updating [email protected]' 
     @touch report.txt 

up-to-date: force 
     @cmp -s '[email protected]' <(git rev-parse @{0}) || git rev-parse @{0} > '[email protected]' 

force: ; 

up-to-date目标靠在头部ref的当前修订向上最新文件的内容(@{0}是当前REF第0个先前引用日志条目)进行比较。

当比较结果显示不同时,它会将新修订版放入文件中,从而更新它并触发make以重建依赖于它的report.txt。当比较结果表明文件相同时,文件不会被更新,并且认为没有理由重建report.txt

力量目标力量总是认为需要被修造的最新。您可能曾想过使用.PHONY: up-to-date而不是强制,但在用作prereq时,假目标的语义会使其无法按预期运行(report.txt的规则将始终运行)。

+0

看起来不错,但解释会有帮助。 – Beryllium

+0

@Beryllium我在提交答案之前告诉自己要解释这些概念,但后来我忘记了/懒惰了。感谢刺激。 –

+0

这似乎不工作。 '最新'永远不会被'make report.txt'重新运行。你必须自己手动指定它,这其实并不比完全移除力更好。 – UpAndAdam

1

对@ndec的一个增强建议,它不关心“分离的HEAD”。

目标之前插入此

subdir := ./         # can be ./src in different location 
subdep := $(subdir)/.git/HEAD     # may have SHA-1 (detached HEAD) 
gitref := $(word 2, $(shell cat $(subdep)))  # may be a ref HEAD (for any branch/tag) 
ifneq "$(gitref)" ""       # append it if referenced HEAD 
    subdep += $(subdir)/.git/$(gitref)   # e.g. HEAD & refs/heads/master 
endif 

那么你可以添加$(subdep)为目标的依赖,例如

report.txt: $(subdep) 
    @touch [email protected] 

然后,如果分支或提交更改,则将构建目标。