Я собрал tarball'd выпуски программного обеспечения, которые включают результаты нескольких разных проектов.Эти tarballs сами по себе считаются выпуском.Выпущенный архив содержит спецификацию (спецификацию), в которой перечислены все проекты в ней и связанные с ними сигнатуры SHA1 (git).
Чтобы упростить воссоздание этих тарболлов, я собрал систему make, которая анализирует спецификацию.построчное клонирование хранилища в подкаталог, проверка указанной версии и последующая сборка.Скажем, строка в моей спецификации имеет:
prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://git-user@localhost/~/prog-a
хранилище, если оно еще не клонировано, будет помещено в repos/prog-a
, затем проверка выполняется (cd repos/prog-a; git checkout b5286f27d6
) и, наконец, make (* 1008)*).
Я не выяснил, как позволить gnu принять решение о том, собрал ли уже проверенная версия кода бинарный файл, который мне нужен.В настоящее время каждый отдельный подпроект вынужден извлекать и перестраивать.
Как я могу представить SHA1 git-репозитория в 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 $< $@"
@cp $< $@
$(BOM_BLD): % : $$(*D)
@echo " GIT CHECKOUT"
@cd $<; git checkout -q $(shell sed -rn '/$(shell echo $@ | sed -r 's_.+/__')/ s/.+ (.+) .+ .+ .+/\1/p' bom)
@echo " MAKE $@"
@make -w -C $< $(@F)
$(BOM_DIR): | materials
@echo " GIT CLONE $@"
@cd $(REPO_DIR); git clone $(shell sed -rn '/$(shell echo $@ | sed -r 's_.+/__')/ s/.+ (.+) .+ .+/\1/p' bom)
materials:
@echo " MKDIR $@"
@mkdir $@