2014-06-20 36 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] 

然後,如果分支或提交更改,則將構建目標。