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

OnT*_*Fly 2 patch makefile

例如:

# 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
Run Code Online (Sandbox Code Playgroud)

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


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

and*_*otn 6

您可以使用所谓的"sentinel"文件来指示已应用该修补程序.

foo.c:

#include <stdio.h>

int main() {
    printf("hi!\n");
}
Run Code Online (Sandbox Code Playgroud)

foo.diff:

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

 int main() {
-    printf("hi!\n");
+    printf("goodbye.\n");
 }
Run Code Online (Sandbox Code Playgroud)

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 $@
Run Code Online (Sandbox Code Playgroud)

foo取决于foo.c,foo.c取决于foo.c.patched,这取决于补丁文件.所以在foo构建之前,foo.c.patched如果它不存在或者foo.diff更新则将被构建.foo.c.patched应用修补程序的规则然后保存它的副本.

所以:

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

您可以编辑任何foo.cfoo.diff和,只要你不你在编辑过程中制造矛盾,构建系统将处理其余部分.