我怎样才能将git SHA1呈现给gnu make?

时间:2011-09-01 01:47:24

标签: git build gnu-make

我将tarball的软件版本放在一起,其中包含来自几个不同项目的输出。这些tarball本身被认为是一个版本。发布的tarball包含一个BOM(物料清单),用于逐项列出其中的所有项目及其关联的SHA1(git)签名。

为了更轻松地重新创建这些tarball,我将一个make系统放在一起,逐行解析BOM,将存储库克隆到一个子目录中,检查指定的版本,然后执行构建。在我的BOM中说一行:

prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://git-user@localhost/~/prog-a

存储库(如果尚未克隆)将放在repos/prog-a中,然后结帐(cd repos/prog-a; git checkout b5286f27d6),最后一个make(make -C repos/prog-a)。

我还没弄明白如何让gnu决定代码的签出版本是否已经构建了我需要的二进制文件。目前,每个子项目都被迫结账和重建。

如何向GNU make提供git repo的SHA1,以便它可以决定项目是否已过期并需要更新(通过执行git checkout)? < / p>

[编辑] 这是我的模式文件:

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 个答案:

答案 0 :(得分: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 "$@" -e PARAM=$(SHA1)

在你的subdir makefile中,想象一下这样的东西:

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

在子目录中假设makefile;你当然可以在制作规则中做任何你想做的事。

对于更具动态性的make脚本,至少要查看.SECONDEXPANSION.PHONY.PRECIOUS

答案 1 :(得分:0)

我最终做了一个无条件的结账,如果实际上必须操纵bom项目的工作目录中的东西,就按时点击。