Memeriksa pada saat configure / kompilasi untuk fitur yang tergantung pada kode Anda adalah cara yang harus dilakukan. Memeriksa perangkat tertentu bermasalah karena menghindari kesalahan positif hampir tidak mungkin (seseorang bisa berbohong kepada Anda dengan sengaja bahkan dengan sedikit usaha) dan tujuan pemeriksaan tersebut adalah untuk menjawab pertanyaan: "bisakah saya membangun di sini? Jika ya, jalur kode apa yang seharusnya Saya menggunakan? " , bukan "apakah ini perangkat yang saya suka namanya?"
Menurut referensi ini (sumber informasi hebat tentang makro yang telah ditentukan secara umum) Anda dapat menggunakan makro:
__arm__
Untuk mendeteksi kombinasi GCC / Arm.
Saya memeriksa ini pada milik saya dengan:
#include <stdio.h>
int main() {
#ifdef __arm__
printf("Why yes it is, thank you\n");
#endif
return 0;
}
Yang memang mencetak pesan.
Perhatikan bahwa ini juga akan menangkap semua perangkat Arm, jadi rekomendasi saya adalah menggunakan bagian dari alat build Anda (mis. cmake/autoconf
) Untuk memeriksa keberadaan /opt/vc/include/bcm_host.h
juga.
Misalnya dengan
AC_CHECK_HEADERS
dalam autoconf:
AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)
penyebab:
HAVE__OPT_VC_INCLUDE_BCM_HOST_H
didefinisikan dalam config.h
Atau untuk CMake:
include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)
Saya tidak berpikir ada cara yang lebih baik untuk mendeteksi ini benar-benar - Anda bisa mengkonfigurasi / CMake mencari hal-hal khusus perangkat keras, tetapi akan ada platform lain di luar sana dengan SoC yang sama sehingga bahkan itu tidak benar-benar dapat diandalkan dan apa yang sebenarnya Anda pedulikan adalah keberadaan file header itu, karena itu memberi tahu Anda bagaimana membangun untuk target yang diberikan. Bahkan jika Anda dapat membuktikannya adalah Raspberry Pi tetapi tidak dapat menemukan file header yang tepat Anda masih macet dan kesalahan sejak awal lebih baik daripada miss-build.
Jika Anda benar-benar ingin memeriksanya adalah Pi (atau cukup serupa), Anda dapat menggunakan sesuatu yang sederhana seperti:
grep -o BCM2708 /proc/cpuinfo
atau (untuk raspberrypi 2 dan 3):
grep -o BCM2709 /proc/cpuinfo
pada saat mengkonfigurasi, yang akan cocok dengan SoC Raspberry Pi didasarkan pada.
Anda dapat melakukan beberapa tes lagi (mis. USB akan membantu Anda mengetahuinya sedikit lebih banyak dan bahkan memberi petunjuk apakah itu perangkat Model A atau B), tetapi tidak ada yang cukup untuk mengatakan dengan pasti.
Anda dapat memeriksa hash file di / boot terhadap daftar yang diketahui, tetapi kemudian Anda tidak akan dapat membangun jika ada pembaruan firmware atau yang tidak resmi yang tidak Anda ketahui. (Atau perangkat non-Pi serupa lainnya dengan pengaturan booting yang sama)
__ARMEL__
cara mendefinisikannya persis seperti milik Anda__arm__
. Saya hanya tidak repot-repot menemukan makro terbaik./opt/vc/include/bcm_host.h
- bagaimana cara kompilasi silang karena file tidak mungkin berada di tempat itu di mesin host (kompilasi)? Demikian pulagrep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo
akan mendeteksi host kompilasi bukan target ...?