2012-11-22 36 views
2

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

# 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

为什么你想补丁依赖于foo.c?理想情况下,只有存在新的差异时才会打补丁。 – Kamath

+0

@AUZKamath,我不太明白你的意思。编辑一下。关于'foo.dif':它始终可用作我的“非官方”补丁的一部分,以便在终端用户从其他地方获得的现有源代码树上应用。 – OnTheFly

+0

工作流程:我修正了'foo.c'中的错误,生成了一个'diff',重新生成并测试过了,现在我想分发我的编辑而不等待我的补丁合并到“官方”源代码树中。这里出现混乱。 – OnTheFly

回答

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 [email protected] ]; then patch -R foo.c [email protected]; fi 
    patch foo.c $< 
    cp foo.diff [email protected] 

foo取决于foo.c,并foo.c取决于foo.c.patched,这取决于补丁文件。因此在构建foo之前,如果它不存在或者foo.diff较新,则将构建foo.c.patchedfoo.c.patched的规则应用该修补程序,然后保存该修补程序的副本。

所以:

  • 如果您尚未应用的补丁已经,它会自动应用
  • 如果修改foo.c,它会重建
  • 如果修改了补丁,构建系统如有必要,将恢复先前应用的修补程序,然后应用新补丁

您可以编辑或者foo.cfoo.diff并且,只要您在编辑期间不会产生冲突,构建系统就会处理剩下的问题。

相关问题