我将软件的 tarball 版本放在一起,其中包括来自几个不同项目的输出。这些 tarball 本身被认为是一个版本。发布的 tarball 包含一个 BOM( Material list ),其中详细列出了其中的所有项目及其相关的 SHA1 (git) 签名。
为了更容易地重新创建这些 tarball,我建立了一个 make 系统,它逐行解析 BOM,将存储库克隆到一个子目录中,检查指定的版本,然后执行构建。假设我的 BOM 中有一行:
prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://git-user@localhost/~/prog-a
存储库(如果尚未克隆)将放置在 repos/prog-a
中,然后完成 checkout (cd repos/prog-a; git checkout b5286f27d6
),最后完成制作(make -C repos/prog-a
)。
我还没有想出如何让 gnu make 决定代码的 checkout 版本是否已经构建了我需要的二进制文件。目前,每个子项目都被迫检查和重建。
我如何向 GNU make 提供 git 存储库的 SHA1,以便它可以确定项目是否已过时并需要更新(通过执行 git checkout
)?
[编辑] 这是我的模式文件:
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 $@
最佳答案
这将是我的模式:
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 规则中做任何你想做的事情。
对于更动态的 make 脚本,至少看看 .SECONDEXPANSION
, .PHONY
, .PRECIOUS
关于git - 我如何向 gnu make 提交 git SHA1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7265356/