Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向gnu make提交git SHA1?_Git_Build_Gnu Make - Fatal编程技术网

如何向gnu make提交git SHA1?

如何向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

我把tarball发布的软件放在一起,其中包括几个不同项目的输出。这些柏油球本身被认为是一种释放。发布的tarball包括一个BOM(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 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中。感谢您花时间回复,我已经在做类似的事情了(请参阅我即将进行的编辑)。我的问题仍然是“我如何才能决定是否继续使用模式规则进行签出?”