Controllare al momento della configurazione / compilazione per le funzionalità da cui dipende il codice è la strada da percorrere. Il controllo di dispositivi specifici è problematico perché evitare falsi positivi è praticamente impossibile (qualcuno potrebbe mentirti deliberatamente anche con poco sforzo) e lo scopo di tali controlli è rispondere alla domanda: "posso costruire qui? Se sì quale percorso di codice dovrebbe Sto usando? " , non "è un dispositivo a cui mi piace il nome?"
Secondo questo riferimento (una grande fonte di informazioni sulle macro predefinite in generale) è possibile utilizzare la macro:
__arm__
Per rilevare la combinazione GCC / Arm.
Ho verificato questo sul mio con:
#include <stdio.h>
int main() {
#ifdef __arm__
printf("Why yes it is, thank you\n");
#endif
return 0;
}
Che ha davvero stampato il messaggio.
Nota che questo catturerà anche tutti i dispositivi Arm, quindi la mia raccomandazione sarebbe quella di utilizzare parte del tuo strumento di costruzione (ad es. cmake/autoconf
) Per verificare anche la presenza di /opt/vc/include/bcm_host.h
.
Ad esempio con
AC_CHECK_HEADERS
in autoconf:
AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)
cause:
HAVE__OPT_VC_INCLUDE_BCM_HOST_H
da definire in config.h
O per CMake:
include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)
Non penso che ci sia un modo migliore di rilevarlo davvero: potresti avere configurato / CMake alla ricerca di cose specifiche per l'hardware, ma ci saranno altre piattaforme là fuori con lo stesso SoC, quindi anche questo non è davvero affidabile e ciò che ti interessa davvero è l'esistenza di quel file di intestazione, poiché ti informa su come costruire per il target indicato. Anche se puoi provare che è un Raspberry Pi ma non riesci a trovare il file di intestazione giusto, sei ancora bloccato e un errore all'inizio è meglio di un miss-build.
Se vuoi davvero verificare che sia un Pi (o sufficientemente simile) puoi ricorrere a qualcosa di semplice come:
grep -o BCM2708 /proc/cpuinfo
oppure (per raspberrypi 2 e 3):
grep -o BCM2709 /proc/cpuinfo
al momento della configurazione, che corrisponderà al SoC su cui si basa Raspberry Pi.
Potresti lanciare qualche altro test (ad esempio USB ti aiuterà a capirlo un po 'di più e persino suggerire se si tratta di un dispositivo Modello A o B), ma nulla è sufficiente da dire con certezza.
Potresti verificare gli hash dei file in / boot rispetto a un elenco noto, ma non sarai in grado di creare se c'è un aggiornamento del firmware o uno non ufficiale di cui non sapevi. (O altri dispositivi simili non Pi con la stessa configurazione di avvio)
__ARMEL__
modo definito è esattamente come il tuo__arm__
. Non mi sono ancora preoccupato di trovare la migliore macro.