2011-09-01 95 views
6

我把包含來自幾個不同項目的輸出的tarball'd版軟件放在一起。這些tarball本身被認爲是一個釋放。發佈的tarball包含一個BOM(物料清單),它詳細列出了其中的所有項目及其相關的SHA1(git)簽名。我該如何提供一個git SHA1來gnu make?

爲了更容易地重新創建這些tarball,我將一個make系統放在一起,該系統逐行解析BOM,將資源庫克隆到子目錄中,檢出指定的版本,然後執行構建。說,在我的BOM行有:

prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://[email protected]/~/prog-a 

庫,如果尚未克隆,將被放置在repos/prog-a,那麼檢出完成(cd repos/prog-a; git checkout b5286f27d6),最後一個make(make -C repos/prog-a)。

我還沒弄清楚如何讓gnu決定檢出的代碼版本是否已經構建了我需要的二進制文件。目前,每個子項目都被迫結賬和重建。

如何向GNU make提交git repo的SHA1,以便它可以決定項目是否過期並需要更新(通過執行git checkout)?

[編輯] 這是我的特徵碼文件:

REPO_DIR=materials 
BOM=$(shell sed -r 's/([^ ]+).+/\1/' bom) 
BOM_DIR=$(shell sed -r 's_([^ ]+).+_$(REPO_DIR)/\1_' bom) 
BOM_BLD=$(shell sed -r 's_([^ ]+).+_$(REPO_DIR)/\1/\1_' bom) 

.PHONY: clean dist-clean 

all: $(BOM) 

clean: 
    @rm $(BOM) $(BOM_BLD) -rf 

dist-clean: clean 
    @rm $(REPO_DIR) 

.SECONDEXPANSION: 

$(BOM): % : $(REPO_DIR)/$$*/$$* 
    @echo " CP $< [email protected]" 
    @cp $< [email protected] 

$(BOM_BLD): % : $$(*D) 
    @echo " GIT CHECKOUT" 
    @cd $<; git checkout -q $(shell sed -rn '/$(shell echo [email protected] | sed -r 's_.+/__')/ s/.+ (.+) .+ .+ .+/\1/p' bom) 
    @echo " MAKE [email protected]" 
    @make -w -C $< $(@F) 

$(BOM_DIR): | materials 
    @echo " GIT CLONE [email protected]" 
    @cd $(REPO_DIR); git clone $(shell sed -rn '/$(shell echo [email protected] | sed -r 's_.+/__')/ s/.+ (.+) .+ .+/\1/p' bom) 

materials: 
    @echo " MKDIR [email protected]" 
    @mkdir [email protected] 
+0

如果結帳僅替換需要替換的文件,則可以無條件地執行結賬。你是說它取代了比它需要的更多嗎? – ikegami

+0

不,結賬工作正常,子項目也如此。我想要的是最高級別查看哪個子項目已簽出版本,並確定它是否爲BOM行所需/指定的版本。 – Jamie

+1

只需結賬即可。 'make'將根據文件時間戳確定是否需要完成任何事情。 – ikegami

回答

0

最後我做一個無條件退房,只是把命中時間,如果它實際上有操縱在工作的事情bom項目的目錄。

1

這將是我的模式:

TARGETS=prog-a prog-b prog-c 

all: $(TARGETS) 

prog-a: SHA1=123fa 
prog-b: SHA1=234ab 
prog-c: SHA1=345bc 

$(TARGETS): 
    make -C "[email protected]" -e PARAM=$(SHA1) 

在你的子目錄的makefile,想象一下這樣的事情:

all: 
    git checkout $(PARAM) -- ./ 
    # ... other build rules 

屁股在子目錄中生成文件;你當然可以在make規則中做任何你想要的。

可以獲得更加動態的化妝腳本,至少看看.SECONDEXPANSION.PHONY.PRECIOUS

+0

更新:顯示了git checkout適合在哪裏的示例;您當然可以將所有/部分邏輯解壓到頂層makefile中。 – sehe

+0

感謝您花時間回覆,我已經在做類似的事情(請參閱我即將發表的編輯)。我的問題仍然是'我該如何決定是否繼續使用模式規則來執行結賬?' – Jamie