如何在 x86-64 机器上构建 i386 目标的 rpm?

如何在 x86-64 机器上构建 i386 目标的 rpm?

我正在使用以下命令构建 rpm rpmbuild

rpmbuild -bb --root <DIRECTORY> --target i386 --define "_topdir <DIRECTORY>" <specfile>.spec

当我使用我的 SLED 10 SP3 x86 机器时,它运行成功。但在我的 SLES 10 SP3 x64 虚拟机上,出现以下错误:

error: No compatible architectures found for build

最初我没有使用--target选项,它仍然在 x86 机器上运行,但在 x64 机器上也存在同样的错误。

请帮我解决这个错误

答案1

既然你正在使用“-bb”标志,这意味着您正在构建二进制所以你不需要安装其他架构的编译器。

只需删除规范文件中的“Buildarch”行并从命令行传递它即可

--target i386

或者

--target x86_64

它应该为您创建转速。

答案2

来自 rpm、spec 文件和 rpmbuild 的 Fedora 文档:

The --target option sets the target architecture at build time. Chapter 3,
Using RPM covers how you can use the --ignoreos and --ignorearch options 
when installing RPMs to ignore the operating system and architecture that 
is flagged within the RPM. Of course, this works only if you are installing 
on a compatible architecture.

On the surface level, the --target option overrides some of the macros in 
the spec file, %_target, %_target_arch, and %_target_os. This flags the RPM 
for the new target platform.

Under the covers, setting the architecture macros is not enough. You really 
cannot create a PowerPC executable, for example, on an Intel-architecture 
machine, unless you have a PowerPC cross compiler, a compiler that can make 
PowerPC executables.

http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-rpmbuild.html

因此,正如它所说,请确保您安装了附加编译器(例如gcc.i686& gcc.x86_64)。

答案3

最简单的方法是启动 x86 VM 并在其上进行构建,然后将 i386 或 i686 rpm 复制到 x86_64 计算机。

答案4

你要:--target i386-redhat-linux

glibc.i686但是,只有当您安装了和glibc-devel.i686且必须有一个能够同时生成 32 位和 64 位代码的多架构编译器时,这才有效。

Red Hat 提供的 GCC 被故意阉割为无法做到这一点,尽管 GCC 完全有能力做到这一点,并且在真正的 UNIX 操作系统(如 AIX、Solaris、IRIX 甚至 PPC)上毫不费力地做到这一点。基于红帽系统。

因此,为了能够做到这一点,并且如果(且仅当!)您希望使用 GCC 能够做到这一点,您必须构建并打包您自己的 GCC 版本,并显式启用多架构构建,GCC./configure如果(且仅当!)它检测到 GCC 是在 GNU/Linux 上构建的,则默认情况下脚本不会执行此操作。

另一种选择是安装和使用适用于 GNU/Linux 的 Intel、PGI 或 Sun Studio 编译器,但这些编译器更加迂腐且符合标准,并且不能容忍许多 GCC 不可移植的语法结构。

相关内容