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)
__ARMEL__
forma definida es exactamente como la tuya__arm__
. Simplemente no me molesté en encontrar la mejor macro todavía./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 ...?