如果补丁跳过补丁,如何不中断makefile?

kri*_*mas 5 linux patch makefile

我想在Makefile中应用补丁。如果尚未应用修补程序,则此方法工作正常。但是,如果我尝试在对原始文件进行修补之后进行制作,则会导致制作文件在完成之前退出。

Makefile-

all:
        echo "starting patch"
        patch -N < patchfiles/foo.patch
        echo "patched"
Run Code Online (Sandbox Code Playgroud)

在文件已修补后尝试运行后的结果-

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
Run Code Online (Sandbox Code Playgroud)

我认为使用-N选项只会跳过补丁,不会导致任何错误。显然我错了。关于如何修复Makefile以便不将跳过的补丁解释为错误的任何想法吗?

谢谢!

编辑:

如果我想在修补程序之前进入cd目录,则无法使用-patch。结果如下:

生成文件:

all:
        echo "starting..."
        cd tmp && \
                -patch -N < ../patchfiles/Makefile.linux-p3041-3_0.patch
        echo "finished."
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

Tom*_*ale 5

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

我不是一个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
Run Code Online (Sandbox Code Playgroud)


tri*_*eee 1

在命令前面添加减号会使 Make 忽略其退出状态

-patch -N < patchfiles/foo.patch
Run Code Online (Sandbox Code Playgroud)

不过,你确实必须想清楚这一点;如果该命令也可能因您确实想要检测的原因而失败怎么办?也许在实际的 patch 命令之前或之后添加一些健全性检查。