Як я можу виявити, що я компілюю для Raspberry Pi?


24

Оскільки Raspberry Pi потребує трохи спеціального коду (я говорю про це C/C++) для доступу до деяких апаратних функцій (наприклад, дзвінка до bcm_host_init()). Я шукаю надійний та елегантний спосіб визначити це автоматично. Я не думаю, що є такий компілятор #defines, як _WIN32я міг би зловживати, тому виявлення його з CMake(який може виконувати сценарії оболонки) було б достатньо. Я також хотів би, щоб метод працював у більшості, якщо не у всіх дистрибутивах.

Один з способів я можу думати про те , що я міг би знайти , наприклад , /opt/vc/include/bcm_host.hфайл (який не важко), а також перевірити , що архітектура ARM (що легко під час компіляції є #defineмакроси для цього, наприклад , __arm__в __ARMEL__). Ця додаткова перевірка арки призначена для запобігання помилковим спрацьовуванням, коли у вас є середовище перехресного компілювання на іншій машині, але в даний час ви не перехресно компілюєте. Чи є інший, кращий спосіб, ніж цей?

Відповіді:


20

Перевірка часу конфігурації / компіляції функцій, від яких залежить ваш код, - це шлях. Перевірка конкретних пристроїв є проблематичною, оскільки уникнути помилкових спрацьовувань практично неможливо (хтось може навмисно брехати вам, навіть не докладаючи зусиль), а мета таких перевірок - відповісти на питання: "чи можу я тут побудувати? Якщо так, який шлях коду повинен бути Я використовую? " , не "це пристрій, який мені подобається ім'я?"


Відповідно до цієї посилання (чудове джерело інформації про заздалегідь задані макроси) ви можете використовувати макрос:

__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
в автоконку:

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

або (для малинових 2 і 3):

grep -o BCM2709 /proc/cpuinfo

в час налаштування, який буде відповідати SoC, заснований Raspberry Pi.

Ви можете скористатися ще кількома тестами (наприклад, USB допоможе вам розібратися в цьому трохи більше і навіть натякнути, якщо це пристрій моделі А або В), але нічого не достатньо сказати напевно.

Ви можете перевірити хеші файлів у / boot на відомий список, але тоді ви не зможете створити, якщо є оновлення мікропрограмного забезпечення чи неофіційне, про яке ви не знали. (Або інші подібні пристрої, які не належать до Pi, з тією ж установкою завантаження)


Можливо, опис моєї ідеї виявився недостатньо зрозумілим, але __ARMEL__спосіб визначення точно такий, як ваш __arm__. Я просто не намагався знайти найкращий макрос поки.
Тапіо

Я вніс зміни до опису своєї ідеї, щоб уточнити, що також шукати файл не є проблемою - я шукаю різні, кращі способи зробити це, а не як реалізувати представлену ідею.
Тапіо

@Tapio - Я не думаю, що це правильна проблема - навіть якщо ви докажете, що це Pi, інформація є марною без файлів заголовка, необхідних для створення вашого конкретного коду Pi. Навіть якщо ви знайдете пристрій BCM не-Pi, код, який ви пишете для Pi, ймовірно, буде спрацьовувати добре, якщо він базується на тому ж SoC.
Flexo

Ти правий. Ця думка перехрестила мені думку, але я не думав про це достатньо. У будь-якому разі, ваші правки роблять це чудовою відповіддю, яку варто прийняти.
Тапіо

2
Перевірка на /opt/vc/include/bcm_host.hте, як це працює для перехресного компіляції, оскільки файл навряд чи буде в цьому місці на (компілюючій) хост-машині? Аналогічно grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfoзбирається виявити хост компіляції не цільовий ...?
SlySven
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.