몇 가지 다른 프로젝트의 출력물을 포함하는 tarball'd 릴리스의 소프트웨어를 함께 넣었습니다. 이 tarball 자체는 릴리스로 간주됩니다. 릴리스 된 타르볼에는 BOM (Bill of Material)과 그 안에있는 모든 프로젝트를 항목별로 분류 한 SHA1 (git) 서명이 들어 있습니다.gnu에 git SHA1을 어떻게 표시 할 수 있습니까?
이러한 tarball을 쉽게 재생성하기 위해 BOM을 한 줄씩 서브 디렉토리로 복제하고 지정된 버전을 체크 아웃 한 다음 빌드를 수행하는 make 시스템을 작성했습니다. 내 BOM에 줄을 가지고 말 :
prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://[email protected]/~/prog-a
저장소, 이미 복제하지 않을 경우, 마지막으로 메이크업 (make -C repos/prog-a
를) 후 체크 아웃 (cd repos/prog-a; git checkout b5286f27d6
)를 수행, repos/prog-a
에 배치 될 것입니다.
코드의 체크 아웃 된 버전이 이미 필요한 바이너리를 빌드했는지 여부를 gnu가 결정하게하는 방법을 알지 못했습니다. 현재 모든 단일 하위 프로젝트는 체크 아웃하고 다시 작성해야합니다.
git repo의 SHA1을 GNU make에 어떻게 표시하여 프로젝트가 오래되어 업데이트해야하는지 (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