git - 我如何向 gnu make 提交 git SHA1?

标签 git build gnu-make

我将软件的 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/

相关文章:

git - 如何删除 merge 提交

ANT:按优先级顺序复制具有相同文件的多个文件集的内容

compiler-errors - 由于无法识别的选项,无法在 MingW 上制作

git remote show origin 什么都不返回

git - 是否可以不显示 git status 的特定文件夹中的更改?

macos - 在没有管理员权限的情况下在 OS X 上安装 Git 客户端

svn - Jenkins - 在构建之前查看 SVN 更改

grails - 如何从grails Controller 触发gradle构建?

makefile - 在 makefile 目标的先决条件中出现分号是什么意思?

gnu-make - gnumake.RECIPEPREFIX问题