私はいくつかの異なるプロジェクトからの出力を含む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]
置き換えが必要なファイルのみをチェックアウトで置き換えた場合は、無条件にチェックアウトするだけで済みます。あなたはそれが必要以上に置き換わると言っていますか? – ikegami
いいえ、チェックアウトはうまくいきます。サブプロジェクトもそうです。私が望むのは、トップレベルがサブプロジェクトのバージョンをチェックし、それがBOMラインで必要/指定されているものかどうかを判断することです。 – Jamie
ちょうどチェックアウトをしてください。 'make'はファイルのタイムスタンプに基づいて何かをする必要があるかどうかを決定します。 – ikegami