如果补丁跳过补丁,如何不破坏makefile?

我想在makefile中应用一个补丁。 如果补丁还没有被应用,这工作正常。 但是,如果我试图在原始文件已经被打补丁之后,它会导致makefile在完成之前退出。

Makefile –

all: echo "starting patch" patch -N < patchfiles/foo.patch echo "patched" 

试图在文件之后运行后的结果已经被修补 –

 usr-mbp:makefile usr$ make echo "starting patch" starting patch patch -N < patchfiles/foo.patch patching file foo Reversed (or previously applied) patch detected! Skipping patch. 1 out of 1 hunk ignored -- saving rejects to file foo.rej make: *** [all] Error 1 

我想通过使用-N选项可以简单地跳过这个补丁并且不会导致任何错误。 显然我错了。 任何想法如何修复生成文件,因此它不会将跳过的修补程序解释为错误?

谢谢!

编辑:

如果我想要在修补程序之前进入一个目录,那么使用-patch不起作用。 这是结果:

Makefile文件:

 all: echo "starting..." cd tmp && \ -patch -N < ../patchfiles/Makefile.linux-p3041-3_0.patch echo "finished." 

结果:

 usr-mbp:makefile usr$ make echo "starting..." starting... cd tmp && \ -patch -N < ../patchfiles/Makefile.linux-p3041-3_0.patch /bin/sh: line 1: -patch: command not found make: *** [all] Error 127 

在命令前添加减号会导致Make忽略退出状态 。

 -patch -N < patchfiles/foo.patch 

不过,你真的必须考虑这一点。 如果命令也可能由于您想检测的原因而失败,该怎么办? 也许在实际的补丁命令之前或之后添加一些完整性检查。

我遇到了你的问题,试图做一个类似的事情,但不与make

我不是一个人,但这是你想要的逻辑:

  • 检查修补程序是否已被完全应用
    • 如果已经应用,则跳过它
    • 否则应用

 # If we could reverse the patch, then it has already been applied; skip it if patch --dry-run --reverse --force < patchfiles/foo.patch >/dev/null 2>&1; then echo "Patch already applied - skipping." else # patch not yet applied echo "Patching..." patch -Ns < patchfiles/foo.patch || echo "Patch failed" >&2 && exit 1 fi