2011-09-01 5 views
6

私はいくつかの異なるプロジェクトからの出力を含むtarballのリリースのソフトウェアをまとめました。これらのタールボール自体はリリースと見なされます。リリースされたtarballには、その中のすべてのプロジェクトと関連するSHA1(git)シグネチャを箇条書きするBOM(BOM)が含まれています。gnuにgit SHA1を表示するにはどうしたらいいですか?

これらのtarballを簡単に再作成するために、BOMを1行ずつサブディレクトリにクローニングし、特定のバージョンをチェックアウトしてビルドを実行するmakeシステムをまとめました。私のBOMの行が持つと言う:既にクローニングされていない場合

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

リポジトリ、チェックアウトが行われ(cd repos/prog-a; git checkout b5286f27d6)、最後にメイク(make -C repos/prog-a)され、その後、repos/prog-aに置かれることになります。

コードのチェックアウト済みバージョンがすでに必要なバイナリを構築しているかどうかをgnuが判断させる方法はわかりませんでした。現在、すべての単一のサブプロジェクトは、チェックアウトと再構築を余儀なくされています。

git repoのSHA1をGNU makeに提示して、プロジェクトが古くて更新が必要かどうかを(git checkoutを実行して)判断できるようにするにはどうすればよいですか?

[EDIT] これは私のパターンファイルである:これは私のパターンになり

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

:あなたのサブディレクトリのmakefileで

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 

お尻サブディレクトリにmakefileを書き込む。もちろん、メイクルールで何でもしても構いません。

は、さらにダイナミックなメイクスクリプトの場合、少なくとも私は無条件のチェックアウトをやってしまったし、それが実際の作業で物事を操作しなければならなかった場合は時間だけで打撃を受けた.PRECIOUS

+0

update:git checkoutがどこに収まるかの例を示しました。もちろん、ロジックのすべて/一部をトップレベルのmakefileに持ち込むことができます。 – sehe

+0

時間を割いてくれてありがとう、私はすでにそのようなことをしています(私の今後の編集を参照)。私の質問は、「チェックアウトを行うためのパターンルールを進める決断を下すことができますか? – Jamie

関連する問題