Как я могу представить git SHA1 для gnu make? - PullRequest
6 голосов
/ 01 сентября 2011

Я собрал 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 $@

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Это будет мой шаблон:

TARGETS=prog-a prog-b prog-c

all: $(TARGETS)

prog-a: SHA1=123fa
prog-b: SHA1=234ab
prog-c: SHA1=345bc

$(TARGETS):
    make -C "$@" -e PARAM=$(SHA1)

В вашем make-файле subdir представьте что-то вроде этого:

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

, предполагая make-файлы в subdir;Конечно, вы можете делать все, что хотите, в правиле make.

Для еще более динамичных сценариев make, по крайней мере, взгляните на .SECONDEXPANSION, .PHONY, .PRECIOUS

0 голосов
/ 30 апреля 2014

Я закончил делать безусловную проверку и просто вовремя принял удар, если он действительно должен был манипулировать вещами в рабочем каталоге элемента bom.

...