1

我正在开发一个项目,该项目需要我修补 3rd 方开源库以在我的应用程序中使用。为了简单起见,我只使用 Makefile 和一个简单的配置脚本来构建应用程序。我有多个需要应用的补丁,因此我使用 Makefile 依赖项进行补丁:

all: patch1 patch2 patch3
    do-build-stuff-here
patch1:
    patch -p0 < patch1.patch && touch patch1
patch2:
    patch -p0 < patch2.patch && touch patch2
patch3:
    patch -p0 < patch3.patch && touch patch3

我知道 Quilt,Debian 打包系统用于维护者补丁。我用过,真的很管用。然而,它引入了不必要的依赖,特别是对于那些没有 Debian 的人。

有时,并非所有补丁都被应用以允许我(和其他开发人员)在某些条件下重新测试建筑物和应用程序。当我调用“clean”或“distclean”时,我通常会反转补丁:

clean: rmpatch1 rmpatch2 rmpatch3
    do-clean-stuff-here
rmpatch1:
    patch -p0 -R < patch1.patch
rmpatch2:
    patch -p0 -R < patch2.patch
rmpatch3:
    patch -p0 -R < patch3.patch

(忽略我可以删除原始来源并重新开始的事实。)

但是,如果不应用补丁#3,补丁可能会失败,而补丁#1 和#2 是。因此,我依赖于每个 rmpatch 的对应补丁:

rmpatch1: patch1
    patch -p0 -R < patch1.patch
rmpatch2: patch2
    patch -p0 -R < patch2.patch
rmpatch3: patch3
    patch -p0 -R < patch3.patch

但这仍然不能解决我的问题,并且“make clean”最终会先修补源代码,然后再次取消修补!

我想我的问题是:有什么方法可以检测是否应用了补丁?我知道补丁在交互式运行时会告诉您它找到了以前应用的补丁。这种行为可以以非交互方式重现吗?

另一个问题(有点相关)是这种修补方法是否有效,如果不是,我可以使用哪种顺序修补方法(仅通过 Makefiles)。

4

1 回答 1

0

你可以用这样的东西欺骗 Makefile:

all: patch1 patch2 patch3
    do-build-stuff-here
patch1:
    patch -p0 < patch1.patch && touch patch1
    touch $@
patch2:
    patch -p0 < patch2.patch && touch patch2
    touch $@
patch3:
    patch -p0 < patch3.patch && touch patch3
    touch $@

这样,一旦应用了补丁,就会为每个规则创建一个文件。您可以测试它在规则中的存在以取消应用补丁,或者使用它来决定是否需要重新应用补丁。

于 2014-10-14T09:40:50.790 回答