¿Cómo puedo detectar que estoy compilando para Raspberry Pi?

24

Como Raspberry Pi necesita un poco de código especial (estoy hablando C/C++) para acceder a algunas funciones de hardware (por ejemplo, una llamada a bcm_host_init()). Estoy buscando una forma confiable y elegante de detectar esto automáticamente. No creo que haya ningún compilador #definescomo el _WIN32que podría abusar, por lo CMakeque sería suficiente detectarlo (que puede ejecutar scripts de shell). También me gustaría que el método funcione en la mayoría, si no en todas las distribuciones.

Una forma en la que puedo pensar es que podría buscar, por ejemplo, un /opt/vc/include/bcm_host.harchivo (que no es difícil), y también verificar que la arquitectura sea ARM (que es fácil en el momento de la compilación, ya que hay #definemacros para eso, por ejemplo, __arm__de __ARMEL__). Esta comprobación de arco adicional es para evitar falsos positivos cuando tiene un entorno de compilación cruzada en otra máquina pero no está compilando actualmente. ¿Hay una forma diferente y mejor que esta?

Tapio
fuente

Respuestas:

20

Verificar el tiempo de configuración / compilación de las características de las que depende su código es el camino a seguir. Verificar dispositivos específicos es problemático porque evitar falsos positivos es prácticamente imposible (alguien podría mentirte deliberadamente incluso con poco esfuerzo) y el objetivo de tales controles es responder la pregunta: "¿puedo construir aquí? Si es así, ¿qué ruta de código debería Estoy usando? " , no "¿es este un dispositivo que me gusta el nombre?"


De acuerdo con esta referencia (una gran fuente de información sobre macros predefinidas en general) puede usar la macro:

__arm__

Para detectar la combinación GCC / Arm.

Lo comprobé en el mío con:

#include <stdio.h>

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

Lo que de hecho imprimió el mensaje.

Tenga en cuenta que esto también capturará todos los dispositivos Arm, por lo que mi recomendación sería utilizar parte de su herramienta de compilación (por ejemplo cmake/autoconf) para verificar la presencia de /opt/vc/include/bcm_host.h.

Por ejemplo con

AC_CHECK_HEADERS
en autoconf:

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

causas:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

a ser definido en config.h

O para CMake:

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

No creo que haya una mejor manera de detectar esto realmente: podría haber configurado / CMake para buscar cosas específicas de hardware, pero habrá otras plataformas con el mismo SoC, por lo que incluso eso no es realmente confiable y lo que realmente le importa es la existencia de ese archivo de encabezado, ya que le informa cómo construir para el objetivo dado. Incluso si puede probar que es una Raspberry Pi pero no puede encontrar el archivo de encabezado correcto, todavía está atascado y un error desde el principio es mejor que una compilación errónea.

Si realmente quieres comprobar que es un Pi (o suficientemente similar) puedes recurrir a algo simple como:

grep -o BCM2708 /proc/cpuinfo

o (para raspberrypi 2 y 3):

grep -o BCM2709 /proc/cpuinfo

en el tiempo de configuración, que coincidirá con el SoC en el que se basa la Raspberry Pi.

Podría realizar algunas pruebas más (por ejemplo, USB lo ayudará a descubrir un poco más e incluso insinuar si es un dispositivo Modelo A o B), pero nada es suficiente para decir con certeza.

Puede verificar los hash de archivos en / boot contra una lista conocida, pero luego no podrá compilar si hay una actualización de firmware o una no oficial que no conocía. (U otros dispositivos similares que no sean Pi con la misma configuración de arranque)

Flexografía
fuente
Quizás la descripción de mi idea no fue lo suficientemente clara, pero la __ARMEL__forma definida es exactamente como la tuya __arm__. Simplemente no me molesté en encontrar la mejor macro todavía.
Tapio
Modifiqué la descripción de mi idea para aclarar que también buscar el archivo no es el problema: estoy buscando diferentes y mejores formas de hacerlo, no cómo implementar la idea que presenté.
Tapio
@Tapio: no creo que sea el problema correcto, incluso si demuestras que es un Pi, la información es inútil sin los archivos de encabezado que necesitas para construir tu código específico de Pi. Incluso si encuentra un dispositivo BCM que no sea Pi, el código que escriba para Pi probablemente funcionará bien si se basa en el mismo SoC.
Flexo
Tienes razón. Ese pensamiento cruzó por mi mente, pero no lo pensé lo suficiente. De todos modos, sus ediciones hacen de esta una excelente respuesta que vale la pena aceptar.
Tapio
2
La comprobación de /opt/vc/include/bcm_host.h: ¿cómo funciona eso para la compilación cruzada ya que es poco probable que el archivo esté en ese lugar en la máquina host (compilación)? Del mismo modo, grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo¿va a detectar el host de compilación, no el objetivo ...?
SlySven