Raspberry Pi用にコンパイルしていることを検出するにはどうすればよいですか?


24

Raspberry Piには、C/C++いくつかのハードウェア機能(例:への呼び出し)にアクセスするために、少し特別なコード(私が話している)が必要ですbcm_host_init()。これを自動的に検出するための信頼できるエレガントな方法を探しています。私が悪用できる#definesようなコンパイラはないと思う_WIN32ので、CMake(シェルスクリプトを実行できる)からそれを検出するだけで十分です。また、すべてではないにしても、ほとんどのディストリビューションでこのメソッドが機能することを望んでいます。

私が考えることができる1つの方法は、たとえば/opt/vc/include/bcm_host.hファイル(これは難しくありません)を探し、またアーキテクチャがARMであることを確認できることです(#defineたとえば__arm__、そのためのマクロがあるのでコンパイル時に簡単です__ARMEL__)。この追加のアーチチェックは、別のマシンでクロスコンパイル環境を使用しているが、現在クロスコンパイルしていない場合の誤検知を防ぐためのものです。これとは異なる、より良い方法はありますか?

回答:


20

構成/コンパイル時にコードが依存している機能を確認する方法があります。特定のデバイスのチェックは、誤検知を回避することは事実上不可能であるため(ほとんど労力をかけなくても故意に嘘をつくことができます)そのようなチェックの目的は次の質問に答えることです「ここでビルドできますか?使っていますか?」ではなく、「これは、の名前のようなデバイスの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__です。まだ最高のマクロを見つけようとはしませんでした。
タピオ

ファイルを探すことも問題ではないことを明確にするために、アイデアの説明を修正しました。提示したアイデアを実装する方法ではなく、これを行うための別のより良い方法を探しています。
タピオ

@Tapio-私はそれが正しい問題だとは思いません-ヘッダーファイルなしでは情報が役に立たないことがPiであると証明したとしても、Pi固有のコードを構築する必要があります。BCM非Piデバイスを見つけたとしても、同じSoCに基づいている場合、Pi用に記述したコードはおそらくそれでうまく動作します。
フレキソ

あなたが正しいです。その考えは頭をよぎったが、私はそれについて十分に考えなかった。とにかく、あなたの編集はこれを受け入れる価値のある優れた答えにします。
タピオ

2
チェック/opt/vc/include/bcm_host.h-ファイルが(コンパイル中の)ホストマシン上のその場所にある可能性は低いので、クロスコンパイルではどのように機能しますか?同様にgrep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo、ターゲットではなくコンパイルホストを検出しようとしています...?
-SlySven
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.