如何检测到我正在为Raspberry Pi进行编译?


24

由于Raspberry Pi需要一些特殊的代码(我正在谈论C/C++)来访问某些硬件功能(例如的调用bcm_host_init())。我正在寻找一种可靠且优雅的方法来自动检测到此情况。我认为没有#defines_WIN32我这样会滥用的编译器,因此从CMake(可以执行Shell脚本)对其进行检测就足够了。我也希望该方法在大多数发行版中都可以使用。

我能想到的一个办法是,我可以找如/opt/vc/include/bcm_host.h文件(这并不困难),并检查该架构是ARM(这是很容易在编译的时候,因为有#define该宏,如__arm____ARMEL__)。当您在另一台计算机上具有交叉编译环境但当前尚未交叉编译时,此额外的arch检查是为了防止错误肯定。有没有比这更好的方法呢?

Answers:


20

在配置/编译时检查代码所依赖的功能是正确的方法。检查特定设备是有问题的,因为避免假阳性几乎是不可能的(即使不费吹灰之力也可能有人故意骗您)而此类检查的目的是回答以下问题:“我可以在这里构建吗?如果可以,应该使用什么代码路径我在用吗?” ,而不是“这是我喜欢这个名称的设备吗?”


根据此参考(通常,有关预定义宏的大量信息来源),您可以使用该宏:

__arm__

检测GCC /手臂组合。

我通过以下方法在我的网站上进行了检查:

#include <stdio.h>

int main() {
  #ifdef __arm__
  printf("Why yes it is, thank you\n");
  #endif
  return 0;
}

确实确实打印了消息。

请注意,这还将捕获所有 Arm设备,因此我的建议是也使用构建工具的一部分(例如cmake/autoconf)来检查是否存在/opt/vc/include/bcm_host.h

例如与

AC_CHECK_HEADERS
在autoconf中:

AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)

原因:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

在config.h中定义

或对于CMake:

include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)

我认为没有更好的方法可以真正检测到这一点-您可以配置/ CMake查找硬件特定的东西,但是会有其他具有相同SoC的平台,所以即使这不是真的可靠,您真正关心的是什么该头文件的存在,因为它会告知您如何为给定目标进行构建。即使您可以证明它是Raspberry Pi,但找不到正确的头文件,仍然会卡住,而且早期出错比未完成编译要好。

如果您真的想检查它是否是Pi(或足够相似),可以采用以下简单方法:

grep -o BCM2708 /proc/cpuinfo

或(对于raspberrypi 2和3):

grep -o BCM2709 /proc/cpuinfo

在配置时,它将与Raspberry Pi所基于的SoC相匹配。

您可以进行更多测试(例如,USB将帮助您弄清楚它的位置,甚至暗示它是A型还是B型设备),但还不能肯定地说。

您可以对照已知列表检查/ boot中文件的哈希值,但是如果有固件更新或您不知道的非正式更新,则无法构建。(或其他具有相同启动设置的类似非Pi设备)


也许对我的想法的描述不够清楚,但是__ARMEL__定义方式与您的完全一样__arm__。我只是没有去寻找最好的宏。
Tapio 2012年

我修改了我的想法描述,以澄清寻找文件也不是问题-我正在寻找不同的,更好的方法来做到这一点,而不是如何实现我提出的想法。
Tapio 2012年

@Tapio-我认为这不是正确的问题-即使您证明是Pi,没有头文件的信息也无用,您需要构建特定于Pi的代码。即使您找到了BCM非Pi器件,但是如果您为Pi编写的代码基于同一SoC,也可能会很好地运行。
Flexo 2012年

你是对的。这个想法让我念念不忘,但我想得还不够。无论如何,您的编辑使它成为一个很好的答案,非常值得接受。
Tapio 2012年

2
检查/opt/vc/include/bcm_host.h-交叉编译如何工作,因为文件不太可能位于(编译)主机上的那个位置?同样grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo会检测到编译主机不是目标...?
SlySven
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.