如何向gnu make提交git SHA1?
我把tarball发布的软件放在一起,其中包括几个不同项目的输出。这些柏油球本身被认为是一种释放。发布的tarball包括一个BOM(BOM),其中列出了其中的所有项目及其相关的SHA1(git)签名 为了更容易地重新创建这些tarball,我构建了一个make系统,它逐行解析BOM表,将存储库克隆到一个子目录中,签出指定的版本,然后执行构建。假设我的BOM表中有一行:如何向gnu make提交git SHA1?,git,build,gnu-make,Git,Build,Gnu Make,我把tarball发布的软件放在一起,其中包括几个不同项目的输出。这些柏油球本身被认为是一种释放。发布的tarball包括一个BOM(BOM),其中列出了其中的所有项目及其相关的SHA1(git)签名 为了更容易地重新创建这些tarball,我构建了一个make系统,它逐行解析BOM表,将存储库克隆到一个子目录中,签出指定的版本,然后执行构建。假设我的BOM表中有一行: prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://git-u
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 make决定代码的签出版本是否已经构建了我需要的二进制文件。目前,每个子项目都必须签出和重建
我如何向GNU make提交git回购协议的SHA1,以便GNU make能够决定该项目是否过期,是否需要更新(通过执行git签出)?
[编辑]
这是我的模式文件:
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 $@
REPO\u DIR=物料
BOM=$(shell sed-r的/([^]+)。+/\1/'BOM)
BOM_DIR=$(shell sed-r的_uu([^]+).+$(REPO_DIR)/\1_u'BOM)
BOM_BLD=$(shell sed-r的uu([^]+)。+$(REPO_DIR)/\1/\1_u'BOM)
.冒牌货
全部:$(物料清单)
清洁:
@rm$(物料清单)$(物料清单)-rf
清洁区:清洁区
@rm$(回购董事)
.第二次扩展:
$(BOM):%:$(回购目录)/$$*/$$*
@回显“CP$<$@”
@cp$<$@
$(BOM_BLD):%:$$(*D)
@echo“GIT签出”
@cd$这将是我的模式:
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脚本,至少看一看,.PHONY
,.PRECIOUS
我最终进行了无条件签出,如果它实际上必须操作bom项的工作目录中的内容,我就准时完成了操作。如果签出只替换需要替换的文件,你可以无条件结帐。你是说它取代了它需要的更多吗?不,结帐工作得很好,就像子项目一样。我想要的是顶层,让我看看子项目是哪个签出版本,并确定它是否是BOM行所要求/指定的版本。只需执行签出即可make
将根据文件时间戳确定是否需要执行任何操作。我明白你的意思。我说的不清楚。我试图避免的是为子项目完全运行,正如你指出的,如果我检查同一版本的子项目,就不会花太长时间。为了简化事情,你可以考虑每个‘子文件夹’(PRO-A,PROF-B)的标签。引用提交将变得容易得多。您还可以求助于git子模块(共享回购协议),并从git的子模块handlingupdate中获利:显示了git结账适合的示例;当然,您可以将所有/部分逻辑提升到顶级makefile中。感谢您花时间回复,我已经在做类似的事情了(请参阅我即将进行的编辑)。我的问题仍然是“我如何才能决定是否继续使用模式规则进行签出?”