2011-09-01 2 views
6

몇 가지 다른 프로젝트의 출력물을 포함하는 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] 
+0

체크 아웃이 필요한 파일 만 교체하는 경우 무조건 체크 아웃하면됩니다. 당신이 필요로하는 것보다 더 많이 대체한다고 말하는 것입니까? – ikegami

+0

아니요, 체크 아웃은 잘 작동하며 서브 프로젝트도 마찬가지입니다. 내가 갖고 싶은 것은 최상위 레벨이 하위 프로젝트의 버전을 체크 아웃하고, BOM 라인에 의해 요구되거나 지정된 것인지를 결정하는 것입니다. – Jamie

+1

체크 아웃하십시오. 'make '는 파일 타임 스탬프에 기반하여 아무것도 할 필요가 없는지를 결정할 것이다. – ikegami

답변

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) 

이 같은 상상 :

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

엉덩이 subdirs에 메이크 파일 만들기 물론 make 규칙에서 원하는 것은 무엇이든 할 수 있습니다.

더욱 동적으로 만들 스크립트를 들어, 적어도 내가 무조건 체크 아웃을하고 끝내었고, 실제로 작업으로 사물을 조작해야한다면 제 시간에 타격을 받았다 .PRECIOUS

+0

업데이트 : git checkout이 어디에 들어 있는지 예제를 보여줍니다. 물론 논리의 전부 또는 일부를 최상위 메이크 파일로들 수 있습니다. – sehe

+0

응답 할 시간을내어 주셔서 감사합니다. 이미 저와 비슷한 일을하고 있습니다. 내 질문은 '체크 아웃을 수행하기 위해 패턴 규칙을 진행하겠다는 결정을 내릴 수 있습니까?'입니다. – Jamie