如何编写将应用可选补丁的makefile后缀规则

如何编写将应用可选补丁的makefile后缀规则,makefile,patch,Makefile,Patch,在makefile(我有GNU Make 3.82)中,假设我有如下设置的后缀规则: .a.b: a_to_b $< .a.b: a到b$< 现在,假设我想对生成的.b文件应用补丁。我可以这样做: .a.b: a_to_b $< patch -p0 < $*.patch .a.b: a到b$< 补丁-p0

在makefile(我有GNU Make 3.82)中,假设我有如下设置的后缀规则:

.a.b:
    a_to_b $<
.a.b:
a到b$<
现在,假设我想对生成的.b文件应用补丁。我可以这样做:

.a.b:
    a_to_b $<
    patch -p0 < $*.patch
.a.b:
a到b$<
补丁-p0<$*。补丁

但是,如果没有针对每个.b的修补程序,如何使修补程序步骤以.patch文件的存在为条件,以便任何具有修补程序的.b都可以应用修补程序,而任何其他.b都可以在a\u to\u b完成后保持不变?

如果您只想应用存在的修补程序,您可以将规则更改为以下内容:

.a.b:
        a_to_b $<
        [ ! -f $*.patch ] || patch -p0 < $*.patch
.a.b:
a到b$<
[!-f$*.patch]| | patch-p0<$*.patch
但是,如果修补程序文件已更改,即使.a文件未更改,也可能希望触发规则。在这种情况下,您必须切换到模式规则,并编写两个:一个使用补丁先决条件,另一个不使用:

%.b : %.a %.patch
        a_to_b $<
        patch -p0 < $*.patch

%.b : %.a
        a_to_b $<
%.b:%.a%.修补程序
a到b$<
补丁-p0<$*。补丁
%.b:%
a到b$<

如果您只想应用补丁(如果存在),您可以将规则更改为:

.a.b:
        a_to_b $<
        [ ! -f $*.patch ] || patch -p0 < $*.patch
.a.b:
a到b$<
[!-f$*.patch]| | patch-p0<$*.patch
但是,如果修补程序文件已更改,即使.a文件未更改,也可能希望触发规则。在这种情况下,您必须切换到模式规则,并编写两个:一个使用补丁先决条件,另一个不使用:

%.b : %.a %.patch
        a_to_b $<
        patch -p0 < $*.patch

%.b : %.a
        a_to_b $<
%.b:%.a%.修补程序
a到b$<
补丁-p0<$*。补丁
%.b:%
a到b$<

我实际上是在寻找你的第一个答案,但我更喜欢你的第二个答案。我已经实现了它,效果很好。我实际上是在寻找你的第一个答案,但我更喜欢你的第二个答案。我已经实现了它,效果非常好。