Aleksandr Safronov Asked:2020-01-11 13:22:19 +0000 UTC2020-01-11 13:22:19 +0000 UTC 2020-01-11 13:22:19 +0000 UTC make:在编译选项更改时重建 772 编译的关键参数之一是 git commit hash: REPO_REV=0x$(shell git rev-parse --short=8 HEAD) 当然 make 不知道这个参数已经改变。在这种情况下如何使 make 重建项目? makefile 1 个回答 Voted Best Answer aleksandr barakin 2020-01-12T02:58:15Z2020-01-12T02:58:15Z 在这种情况下如何使 make 重建项目? 如果“重建项目”是指实现一些额外的目标(例如,clean等distclean),则需要替换目标。这原则上是可能的,但相当“脆弱”且完全“非通用”。 从我的角度来看,这样的处理最好在更高的层次上完成: 如果您手动运行make,那么您当然知道head存储库中发生了什么变化,并且您需要指定一个额外的目标; 如果你的make程序是自动运行的,那么git rev-parse HEAD你需要在调用它之前检查命令的输出,如果它已经改变,调用这个程序有一个额外的目标。 如果通过“重建项目”你的意思是你只需要更新一组目标,那么你可以这样做: 将该命令的先前输出保存git rev-parse HEAD在某个临时文件中,在调用make程序时,将该文件的内容与同一命令的当前输出进行比较,如果不匹配,则用新内容覆盖该文件,并为出于您需要的目的,请将此临时文件指定为先决条件。 我将举例说明。假设您现在有一个makefile具有两个真正目标的原始目标-file1并且file2: all: file1 file2 file1: touch $@ file2: touch $@ 添加到开始获取:a)将当前值保存head到变量repo_rev中,b)保存在具有名称的临时文件中,例如rev.save,保存到变量中rev_save: repo_rev = 0x$(shell git rev-parse --short=8 HEAD) rev_save = 0x$(shell cat rev.save 2>/dev/null) 以及rev.save在变量内容不匹配repo_rev的情况下更新文件内容:rev_save ifneq ($(repo_rev),$(rev_save)) $(shell echo $(repo_rev) > rev.save) endif 然后在默认目标之后(在这种情况下 - all)添加一个先决条件文件rev.save到更新此文件后需要更新的所有目标: file1 file2: rev.save 生成的文件将如下所示: repo_rev = 0x$(shell git rev-parse --short=8 HEAD) rev_save = 0x$(shell cat rev.save 2>/dev/null) ifneq ($(repo_rev),$(rev_save)) $(shell echo $(repo_rev) > rev.save) endif all: file1 file2 file1 file2: rev.save file1: touch $@ file2: touch $@ 现在即使命令返回一个新值,目标file1和file2(当调用make时)也会被更新。git rev-parse HEAD
如果“重建项目”是指实现一些额外的目标(例如,
clean等distclean),则需要替换目标。这原则上是可能的,但相当“脆弱”且完全“非通用”。从我的角度来看,这样的处理最好在更高的层次上完成:
head存储库中发生了什么变化,并且您需要指定一个额外的目标;git rev-parse HEAD你需要在调用它之前检查命令的输出,如果它已经改变,调用这个程序有一个额外的目标。如果通过“重建项目”你的意思是你只需要更新一组目标,那么你可以这样做:
将该命令的先前输出保存
git rev-parse HEAD在某个临时文件中,在调用make程序时,将该文件的内容与同一命令的当前输出进行比较,如果不匹配,则用新内容覆盖该文件,并为出于您需要的目的,请将此临时文件指定为先决条件。我将举例说明。假设您现在有一个
makefile具有两个真正目标的原始目标-file1并且file2:添加到开始获取:a)将当前值保存
head到变量repo_rev中,b)保存在具有名称的临时文件中,例如rev.save,保存到变量中rev_save:以及
rev.save在变量内容不匹配repo_rev的情况下更新文件内容:rev_save然后在默认目标之后(在这种情况下 -
all)添加一个先决条件文件rev.save到更新此文件后需要更新的所有目标:生成的文件将如下所示:
现在即使命令返回一个新值,目标
file1和file2(当调用make时)也会被更新。git rev-parse HEAD