为什么%autosetup在提取源之前执行修补?

时间:2016-11-21 06:41:04

标签: linux rpmbuild rpm-spec

我有一个非常简单的安排 - 一个源tarball,一个补丁:

Source: http://...../foo-%{version}.tar.gz
Patch: my-patch-for-foo.diff
...
%prep
%autosetup -v -n bar-%{version}

但是,当我尝试在%autosetup步骤中使用%prep时,rpmbuild尝试首先修补 - 然后解压缩:

/bin/cat ..../SOURCES/my-patch-for-foo.diff | 
/usr/bin/patch  
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.8PV0PY
+ umask 022
+ cd /....
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /....
+ rm -rf bar-0.12.18
+ /bin/tar -xvvf -
+ /usr/bin/gzip -dc ..../SOURCES/foo-0.12.18.tgz

出于某种原因,patch没有报告错误 - 但是提取的代码最终未修补,我的构建稍后失败。

使用普通的%setup后跟%patch0可以正常工作,但%autosetup出了什么问题?

我在CentOS-6.8上,如果重要的话,RPM是4.8.0版本。谢谢!

更新,将%autosetup拆分为%setup%autopatch也不起作用 - %autopatch没有做任何有用的事情。因为我的补丁都是默认格式,所以我将使用%autopatch的重新实现:

%prep
%setup -n bar-%{version}
%{lua:
    for i, p in ipairs(patches) do
        print("%patch"..i)
    end
}

我是否真的发现了一个错误,或者我做了一些奇怪的错误?

1 个答案:

答案 0 :(得分:2)

我在CentOS 6.7上发现了同样的问题。

如上所述,RPM 4.8据称不支持%autosetup; http://rpm.org/user_doc/autosetup.html也确认从4.11开始支持它。

但是,我发现/usr/lib/rpm/macros(从rpm-4.8.0-55.el6.x86_64安装)确实包含%autosetup宏的定义,而rpm -q --changelog rpm表示它已向后移植&#34 ;最近":

* Mon Feb 08 2016 Lubos Kardos <lkardos@redhat.com> - 4.8.0-52
- Add %autosetup macros (#1265021)

显然,实施似乎已被打破。

The EPEL packaging guidelines表示&#34;%autosetup宏可用于所有EPEL版本(通过epel-rpm-macros 用于EPEL5和EPEL6)&​​#34; (强调我的),所以我尝试安装该包。安装epel-rpm-macros-6-16.noarchinstructions for adding the EPEL YUM repository if you haven't already done this)后,/etc/rpm/macros.zzz-epel-autosetup包含%apply_patch的不同定义(由%autopatch使用,由%autosetup使用)。这解决了问题 - 现在在提取源后应用补丁。