如果补丁被跳过,如何避免破坏Makefile?

5

我希望在makefile中应用一个补丁。如果补丁尚未应用,则这样做没有问题。但是,如果原始文件已经被打了补丁,那么在进行make后,它会导致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选项只是跳过补丁而不会导致任何错误。显然我错了。有什么想法可以修复makefile,使其不会将跳过的补丁解释为错误吗?

谢谢!

编辑:

如果我想在打补丁之前进入一个目录,则使用-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
2个回答

6

我看到了你的问题,尝试做类似的事情,但不是使用 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

1
在命令前添加一个减号会使Make忽略其退出状态
-patch -N < patchfiles/foo.patch

你真的需要仔细考虑这个问题,因为如果命令失败了,可能是你想要检测到的原因。也许在实际修补命令之前或之后添加一些健全性检查会更好。

谢谢!确实很好的关于“清醒检查”的建议。我一定会做到的。再次感谢! :) - krisharmas
如果在文件的副本上使用 patch -R 命令成功了,那么你就可以跳过真正的操作了。 - tripleee
进行了一次编辑。似乎如果我想在打补丁之前进入目录,-patch就不起作用了。 - krisharmas
你需要先在 cd 前面放上减号。 - tripleee
@Hi-Angel,你能解释一下PKGBUILDs的特殊之处吗?这是一个通用的Makefile工具,因此适用于任何使用标准Makefile的东西。 - tripleee
1
@tripleee 不用在意,我正在搜索如何让“patch”忽略已打补丁的文件,没有注意到这个问题是特定于“Makefile”的。顺便说一下,PKGBUILD 是相当于 Bash 脚本的。 - Hi-Angel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接