我正在开发一个项目,要求我修补第三方开源库,以便在我的应用程序中使用。为简单起见,我只使用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: 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”最终会先修补源代码,然后再打开补丁!
我想我的问题是:我有什么方法可以检测是否应用了补丁?我知道补丁,当以交互方式运行时,会告诉你它找到了以前应用的补丁。这种行为可以非交互式再现吗?
另一个问题(有些相关)是这种修补方法是否有效,如果没有,我可以使用哪种顺序修补方法(仅通过Makefile)。
答案 0 :(得分: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 $@
这样,一旦应用补丁,将创建每个规则的文件。您可以测试其在规则中的存在以取消应用补丁,或者使用它来决定是否需要重新应用补丁。