2

例如:

# 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. 这是为了在最终用户系统上的现有源代码树上部署我的补丁。我做错了吗?

4

1 回答 1

7

您可以使用所谓的“哨兵”文件来表明补丁已经被应用。

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.cfoo.c取决于foo.c.patched,这取决于补丁文件。所以 beforefoo被构建,foo.c.patched如果它不存在或者foo.diff是新的,将被构建。应用补丁的规则foo.c.patched,然后保存它的副本。

所以:

  • 如果您尚未应用补丁,它将自动应用
  • 如果你修改foo.c,它将被重建
  • 如果您修改补丁,构建系统将在必要时恢复以前应用的补丁,然后应用新补丁

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

于 2012-11-22T17:45:57.153 回答