在 BitBake 配方中可靠地确定机器架构

问题描述

我正在为需要了解底层机器微体系结构的包编写配方。换句话说,对于 64 位 Arm 系统,我想要一个诸如 aarch64arm64 之类的字符串,对于 64 位 Intel 系统,我想要一个字符串。

到目前为止,我已经确定:

  • x86_64 - 这似乎是 MACHINE 层作者决定命名他们的机器并且可能包含架构的任何内容,也可能不包含。例如,Meta-* 没有用。

  • beaglebone - 这似乎与我正在寻找的很接近。但是,以this BSP 层为例,快速搜索一下,好像没有设置这个变量。仅从几个包中读取。

  • MACHINE_ARCH - 可能是目前最好的选择。但是,这个变量是什么格式的?使用了哪些架构命名约定?此外,前面提到的 BSP 层似乎也没有在任何地方设置它。

我会认为以明确定义的格式了解机器架构很重要,但似乎并没有那么简单。有什么建议吗?

解决方法

我习惯于用 uname -m 来做这件事(Windows 粉丝可以使用 SET processor 的输出),所以对我来说在 Yocto 中它最终是一个折腾:

  1. 根据 TARGET_ARCH 的超级手册条目:
TARGET_ARCH

The target machine's architecture. The OpenEmbedded build system supports many
architectures. Here is an example list of architectures supported. This list is by
no means complete as the architecture is configurable:

     arm
     i586
     x86_64
     powerpc
     powerpc64
     mips
     mipsel

uname -m 会好一些,因为您还可以获得子架构信息。从我现在可以访问的机器:

Intel-based Nuc build system:  x86_64
ARM embedded system:           armv7l
Raspberry Pi 4B:               aarch64
  1. 我发现 GNU automake(本机)和 libtool(可用于目标)包计算一个名为 UNAME_MACHINE_ARCH 的有用变量。如果您已经在使用 libtool 或者只是为了为您完成这项工作而愿意使用它 :-@),您可以通过这种方式解决。在构建的树中查找名为 config.guess 的文件。

  2. 使用 Yocto BUILD_ARCH 可能比 libtool 更通用:

BUILD_ARCH

Specifies the architecture of the build host (e.g. i686). The OpenEmbedded build
system sets the value of BUILD_ARCH from the machine name reported by the uname
command.

因此,请根据您的项目情况自行选择。

如果此答案对您有帮助,请考虑将其标记为已接受。祝你的项目好运!