为什么 %autosetup 在提取源之前执行修补?
Why does %autosetup perform patching BEFORE extracting sources?
我有一个非常简单的安排 -- 一个源代码压缩包,一个补丁:
Source: http://...../foo-%{version}.tar.gz
Patch: my-patch-for-foo.diff
...
%prep
%autosetup -v -n bar-%{version}
但是,当我尝试在 %prep
步骤中使用 %autosetup
时,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
}
我真的发现了一个错误,还是我做错了什么奇怪的事情?
我在 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
表明它被向后移植 "recently":
* Mon Feb 08 2016 Lubos Kardos <lkardos@redhat.com> - 4.8.0-52
- Add %autosetup macros (#1265021)
显然,该实现似乎已被破坏。
The EPEL packaging guidelines says that "The %autosetup macro is available in all EPEL releases (via epel-rpm-macros for EPEL5 and EPEL6)" (emphasis mine), so I tried installing that package. After installing epel-rpm-macros-6-16.noarch
(instructions for adding the EPEL YUM repository if you haven't already done this), /etc/rpm/macros.zzz-epel-autosetup
包含 %apply_patch
的不同定义(被 %autopatch
使用,%autosetup
使用)。这解决了问题 - 现在在提取源后应用补丁。
我有一个非常简单的安排 -- 一个源代码压缩包,一个补丁:
Source: http://...../foo-%{version}.tar.gz
Patch: my-patch-for-foo.diff
...
%prep
%autosetup -v -n bar-%{version}
但是,当我尝试在 %prep
步骤中使用 %autosetup
时,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
}
我真的发现了一个错误,还是我做错了什么奇怪的事情?
我在 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
表明它被向后移植 "recently":
* Mon Feb 08 2016 Lubos Kardos <lkardos@redhat.com> - 4.8.0-52
- Add %autosetup macros (#1265021)
显然,该实现似乎已被破坏。
The EPEL packaging guidelines says that "The %autosetup macro is available in all EPEL releases (via epel-rpm-macros for EPEL5 and EPEL6)" (emphasis mine), so I tried installing that package. After installing epel-rpm-macros-6-16.noarch
(instructions for adding the EPEL YUM repository if you haven't already done this), /etc/rpm/macros.zzz-epel-autosetup
包含 %apply_patch
的不同定义(被 %autopatch
使用,%autosetup
使用)。这解决了问题 - 现在在提取源后应用补丁。