我的目标是将 Debian 软件包转换为 RPM 软件包,以将其安装在 CentOS Linux 7 (Red Hat) 上。我用外星人来完成它:alien --to-rpm --scripts --keep-version --generate debian_pkg.deb
。我使用该--generate
标志创建一个用于构建包的目录,因为我想将运行时依赖项添加到规范文件中。为此,我添加了这一行:Requires: nodejs tomcat8 java-1.8.0-openjdk java-1.8.0-openjdk-devel
。然后我尝试创建 package: rpmbuild -ba <package_name>.spec
,但它突然结束并出现以下错误:
Processing files: <package_name>
error: Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv
error: Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp/file.tar.gz
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/README.Debian
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/changelog.Debian.gz
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/copyright
RPM build errors:
Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv
Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp
File not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp/file.tar.gz
File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/README.Debian
File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/changelog.Debian.gz
File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/copyright
我在互联网上搜索,发现它与该%install
部分链接,更具体地说%{buildroot}
,但我无法解决这个问题并解决它。有人可以帮我吗?
谢谢!
更新
这是规范文件的本质:
Buildroot: /home/<package_dir>
Version: 1.0
Release: 849
Distribution: Debian
Group: Converted/misc
Requires: nodejs tomcat8 java-1.8.0-openjdk java-1.8.0-openjdk-devel
%define _rpmdir ../
%define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
%define _unpackaged_files_terminate_build 0
%pre
# some shell script
%post
# some shell script
%install
mkdir -p %{buildroot}/usr/share/doc/
mkdir -p %{buildroot}/usr/share/doc/frontend/
%files
%dir "/srv/"
%dir "/srv/tmp/"
"/srv/tmp/file.tar.gz"
%dir "/usr/"
%dir "/usr/share/"
%dir "/usr/share/doc/"
%dir "/usr/share/doc/frontend/"
"/usr/share/doc/frontend/README.Debian"
"/usr/share/doc/frontend/changelog.Debian.gz"
"/usr/share/doc/frontend/copyright"
答案1
更新:您遇到的问题是Buildroot:
规范文件中的标签。
在现代系统(也许包括您的系统)中,Buildroot:
规范文件不再受支持,并且现在已被忽略。
看这篇关于 Linux 问题的文章关于那个:
Fedora(从 F-10 开始)不要求规范中存在 BuildRoot 标记,如果定义了该标记,它将被忽略。
您可以通过向 rpmbuild 传递一个参数来解决此问题,--buildroot
以便它使用/home/<package_dir>
. (这可能会产生不利的副作用,例如在构建完成后删除这些内容,这显然也是现在的默认设置。)
事实上,自 rpm 4.7.0 开始忽略以来,传递 rpmbuild 和explicit--buildroot
就是开始做的事情,如您所见alien
Buildroot:
这次提交。
规范文件并没有真正安装任何源或创建任何文件。
该部分中唯一发生的事情%install
是创建一个(空)/usr/share/doc/frontend/
目录。
由于specfile以指定开始Buildroot: /home/<package_dir>
,我想它期望之前填充该目录,以便rpmbuild步骤能够简单地从那里获取已经暂存的内容并打包它们。
如果您alien
再次从同一个 .deb 运行(换句话说,重新开始),您是否会得到一个/home/<package_dir>
填充有 eg 的文件srv/tmp/file.tar.gz
?如果是这样,那么当您此时运行 rpmbuild 时,它就会起作用。
在构建 rpm 后,您的 rpmbuild 中的某些宏可能会被清理%{buildroot}
(尽管我想说这很不寻常,因为通常需要%clean
在您的规范文件中包含一个部分。)检查是否是这种情况,如果是在第一个(成功的)rpmbuild 之后,下面的文件/home/<package_dir>
消失了,在这种情况下,进一步运行 rpmbuild 将失败,正如您所描述的......