如何告诉`make`补丁`现有文件避免循环依赖错误?

时间:2012-11-22 09:44:56

标签: makefile patch

例如:

# patched foo.c depends on original foo.c and couple of my edits in foo.dif
foo.c: foo.c foo.dif
  patch foo.c foo.dif

我想避免文件名和目录混乱,只是就地应用编辑,并准备好由原始源代码树提供的原始makefile(对文件名和目录非常复杂和敏感)所促成的重建。


@AUZKamath,我的编辑包含在foo.dif中。这是为了在最终用户系统上的现有源树上部署我的补丁。我做错了吗?

1 个答案:

答案 0 :(得分:6)

您可以使用所谓的“sentinel”文件来指示补丁已经应用。

foo.c

#include <stdio.h>

int main() {
    printf("hi!\n");
}

foo.diff

--- foo.c
+++ foo.c
@@ -1,5 +1,5 @@
 #include <stdio.h>

 int main() {
-    printf("hi!\n");
+    printf("goodbye.\n");
 }

Makefile

foo: foo.c

foo.c: foo.c.patched

foo.c.patched: foo.diff
    if [ -e $@ ]; then patch -R foo.c $@; fi
    patch foo.c $<
    cp foo.diff $@

foo取决于foo.c,而foo.c取决于foo.c.patched,这取决于补丁文件。因此,在构建foo之前,如果foo.c.patched不存在或foo.diff更新,则会构建foo.c.patchedfoo.c的规则应用补丁,然后保存它的副本。

所以:

  • 如果您尚未应用该修补程序,则会自动应用
  • 如果修改foo.c,则会重建
  • 如果修改补丁,构建系统将在必要时还原先前应用的补丁,然后应用新补丁

您可以编辑foo.diff或{{1}},只要您在编辑过程中不会产生冲突,构建系统就会处理其余部分。