構成/コンパイル時にコードが依存している機能を確認する方法があります。特定のデバイスのチェックは、誤検知を回避することは事実上不可能であるため(ほとんど労力をかけなくても故意に嘘をつくことができます)、そのようなチェックの目的は次の質問に答えることです:「ここでビルドできますか?使っていますか?」ではなく、「これは、の名前のようなデバイスのIですか?」
このリファレンス(事前定義されたマクロに関する一般的な情報源)に従って、マクロを使用できます。
__arm__
GCC / Armの組み合わせを検出します。
私はこれを私のものでチェックアウトしました:
#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__
です。まだ最高のマクロを見つけようとはしませんでした。