我把包含來自幾個不同項目的輸出的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]
如果結帳僅替換需要替換的文件,則可以無條件地執行結賬。你是說它取代了比它需要的更多嗎? – ikegami
不,結賬工作正常,子項目也如此。我想要的是最高級別查看哪個子項目已簽出版本,並確定它是否爲BOM行所需/指定的版本。 – Jamie
只需結賬即可。 'make'將根據文件時間戳確定是否需要完成任何事情。 – ikegami