Bagaimana saya bisa mendeteksi bahwa saya sedang mengkompilasi untuk Raspberry Pi?

24

Karena Raspberry Pi memerlukan sedikit kode khusus (saya bicarakan C/C++) untuk mengakses beberapa fitur perangkat keras (misalnya panggilan ke bcm_host_init()). Saya mencari cara yang andal dan elegan untuk mendeteksi ini secara otomatis. Saya tidak berpikir ada kompiler #definesseperti _WIN32saya dapat menyalahgunakan, jadi mendeteksi itu dari CMake(yang dapat menjalankan skrip shell) akan cukup. Saya juga ingin metode ini bekerja di sebagian besar jika tidak semua distro.

Salah satu cara yang dapat saya pikirkan adalah bahwa saya dapat mencari /opt/vc/include/bcm_host.hfile misalnya (yang tidak sulit), dan juga memeriksa apakah arsitekturnya adalah ARM (yang mudah dikompilasi karena ada #definemakro untuk itu, misalnya __arm__dari __ARMEL__). Pemeriksaan lengkung ekstra ini untuk mencegah kesalahan positif ketika Anda memiliki lingkungan kompilasi silang pada komputer lain tetapi saat ini tidak kompilasi silang. Apakah ada cara yang berbeda dan lebih baik dari ini?

Tapio
sumber

Jawaban:

20

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.hjuga.

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)

Flexo
sumber
Mungkin uraian ide saya tidak cukup jelas, tetapi __ARMEL__cara mendefinisikannya persis seperti milik Anda __arm__. Saya hanya tidak repot-repot menemukan makro terbaik.
Tapio
Saya mengubah uraian ide saya untuk mengklarifikasi bahwa juga mencari file bukanlah masalahnya - Saya mencari cara yang berbeda dan lebih baik untuk melakukan ini, bukan bagaimana mengimplementasikan ide yang saya sajikan.
Tapio
@ Tapio - Saya tidak berpikir itu masalah yang tepat - bahkan jika Anda membuktikan itu adalah Pi bahwa informasi tidak berguna tanpa file header Anda perlu membangun kode spesifik Pi Anda. Bahkan jika Anda menemukan perangkat BCM non-Pi, kode yang Anda tulis untuk Pi mungkin akan berjalan baik jika didasarkan pada SoC yang sama.
Flexo
Kamu benar. Pikiran itu terlintas di benak saya, tetapi saya tidak cukup memikirkannya. Bagaimanapun, suntingan Anda menjadikan ini jawaban yang sangat layak untuk diterima.
Tapio
2
Pemeriksaan untuk /opt/vc/include/bcm_host.h- bagaimana cara kompilasi silang karena file tidak mungkin berada di tempat itu di mesin host (kompilasi)? Demikian pula grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfoakan mendeteksi host kompilasi bukan target ...?
SlySven