मैं कैसे पता लगा सकता हूं कि मैं रास्पबेरी पाई के लिए संकलन कर रहा हूं?


24

जैसा कि रास्पबेरी पाई को C/C++कुछ हार्डवेयर सुविधाओं (जैसे एक कॉल bcm_host_init()) तक पहुंचने के लिए थोड़ा विशेष कोड (मैं बात कर रहा हूं ) की आवश्यकता है। मैं अपने आप इसका पता लगाने के लिए एक विश्वसनीय और सुरुचिपूर्ण तरीके की तलाश कर रहा हूं। मुझे नहीं लगता कि कोई भी संकलक हैं #definesजैसे कि _WIN32मैं दुरुपयोग कर सकता हूं, इसलिए इसका पता लगाना CMake(जो शेल स्क्रिप्ट को निष्पादित कर सकता है) पर्याप्त होगा। मैं भी सबसे अधिक नहीं तो सभी distros में काम करने के लिए विधि चाहते हैं।

एक तरह से मैं के बारे में सोच सकते हैं कि मैं जैसे देखने के लिए कर सकता है /opt/vc/include/bcm_host.hफ़ाइल (जो मुश्किल नहीं है), और यह भी जाँचें कि वास्तुकला एआरएम (जो संकलन समय पर आसान है के रूप में देखते हैं #defineकि के लिए मैक्रो, जैसे __arm__की __ARMEL__)। जब आप किसी अन्य मशीन पर क्रॉस-कंपाइलिंग वातावरण रखते हैं, लेकिन वर्तमान में क्रॉस-संकलन नहीं होते हैं, तो यह अतिरिक्त आर्च चेक झूठी-सकारात्मकता को रोकना है। क्या इससे अलग, बेहतर तरीका है?

जवाबों:


20

आपके कोड पर निर्भर करता है कि सुविधाओं के लिए कॉन्फ़िगर / संकलन समय पर जाँच करने का तरीका है। विशिष्ट उपकरणों के लिए जाँच करना समस्याग्रस्त है क्योंकि झूठी-सकारात्मकता से बचना लगभग असंभव है (कोई व्यक्ति जानबूझकर थोड़े प्रयास से भी आपसे झूठ बोल सकता है) और इस तरह के चेक का उद्देश्य इस सवाल का जवाब देना है: "क्या मैं यहां निर्माण कर सकता हूं? यदि हाँ कोड कोड क्या होना चाहिए? मैं उपयोग कर रहा हूँ? , नहीं "क्या यह एक उपकरण है जिसका नाम मुझे पसंद है?"


इस संदर्भ के अनुसार (सामान्य रूप से पूर्वनिर्धारित मैक्रो पर जानकारी का एक बड़ा स्रोत) आप मैक्रो का उपयोग कर सकते हैं:

__arm__

जीसीसी / शाखा संयोजन का पता लगाने के लिए।

मैंने इसके साथ खदान पर जाँच की:

#include <stdio.h>

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

जो वास्तव में संदेश को प्रिंट करता था।

ध्यान दें कि यह सभी शाखा उपकरणों को भी पकड़ लेगा , इसलिए मेरी सिफारिश आपके बिल्ड टूल (जैसे cmake/autoconf) के हिस्से का उपयोग करने के लिए /opt/vc/include/bcm_host.hभी होगी।

उदाहरण के लिए

AC_CHECK_HEADERS
ऑटोकॉनफ़ में:

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

का कारण बनता है:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

config.h में परिभाषित किया जाना है

या CMake के लिए:

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

मुझे नहीं लगता कि यह वास्तव में पता लगाने का एक बेहतर तरीका है - आप हार्डवेयर विशिष्ट चीजों के लिए कॉन्फ़िगर / सीएमके लुक दे सकते हैं, लेकिन एक ही एसओसी के साथ अन्य प्लेटफॉर्म भी होंगे ताकि यहां तक ​​कि वास्तव में विश्वसनीय न हो और आपको वास्तव में क्या परवाह है उस हेडर फ़ाइल का अस्तित्व है, क्योंकि यह आपको बताती है कि दिए गए लक्ष्य के लिए कैसे निर्माण करना है। भले ही आप साबित कर सकते हैं कि यह रास्पबेरी पाई है, लेकिन सही हेडर फ़ाइल नहीं मिल सकती है जो आप अभी भी अटके हुए हैं और जल्दी से एक त्रुटि एक मिस-बिल्ड से बेहतर है।

यदि आप वास्तव में यह जांचना चाहते हैं कि यह एक पाई (या पर्याप्त रूप से समान) है तो आप कुछ सरल का सहारा ले सकते हैं:

grep -o BCM2708 /proc/cpuinfo

या (रसभरी 2 और 3 के लिए):

grep -o BCM2709 /proc/cpuinfo

कॉन्फ़िगर समय पर, जो SoC से मेल खाता है रास्पबेरी पाई पर आधारित है।

आप कुछ और परीक्षणों में फेंक सकते हैं (उदाहरण के लिए USB आपको इसे थोड़ा और अधिक जानने में मदद करेगा और यदि यह एक मॉडल ए या बी डिवाइस है तो भी संकेत देगा), लेकिन कुछ भी निश्चित रूप से कहने के लिए पर्याप्त नहीं है।

आप किसी ज्ञात सूची के विरुद्ध / बूट में फ़ाइलों की हैश की जाँच कर सकते हैं, लेकिन तब आप निर्माण नहीं कर पाएंगे यदि कोई फर्मवेयर अद्यतन या अनौपचारिक है जिसके बारे में आपको जानकारी नहीं है। (या समान बूटिंग सेटअप वाले अन्य गैर-पाई डिवाइस)


शायद मेरे विचार का वर्णन पर्याप्त रूप से स्पष्ट नहीं था, लेकिन __ARMEL__परिभाषित तरीका बिल्कुल आपके जैसा है __arm__। मैं अभी तक सबसे अच्छा मैक्रो खोजने के लिए परेशान नहीं था।
तपो

मैंने अपने विचार वर्णन में यह स्पष्ट करने के लिए संशोधन किया कि फ़ाइल की तलाश भी समस्या नहीं है - मैं यह करने के लिए अलग, बेहतर तरीके की तलाश कर रहा हूं, न कि मेरे द्वारा प्रस्तुत विचार को कैसे लागू किया जाए।
तपो

@ टैपियो - मुझे नहीं लगता है कि यह सही समस्या है - भले ही आप यह साबित कर दें कि यह पीआई है कि हेडर फ़ाइलों के बिना जानकारी बेकार है, आपको अपना पीआई विशिष्ट कोड बनाने की आवश्यकता है। यहां तक ​​कि अगर आपको बीसीएम गैर-पाई डिवाइस मिल जाता है, तो आप जिस कोड को पाई के लिए लिखते हैं, शायद उसी पर ठीक चलेगा यदि यह उसी एसओसी पर आधारित हो।
Flexo

तुम सही हो। उस विचार ने मेरे दिमाग को पार कर दिया, लेकिन मैंने इसके बारे में पर्याप्त नहीं सोचा। वैसे भी, आपके संपादन इस उत्कृष्ट उत्तर को स्वीकार करने लायक बनाते हैं।
तपो

2
चेक के लिए /opt/vc/include/bcm_host.h- फ़ाइल को उस जगह पर रखने की संभावना नहीं है क्योंकि फ़ाइल मशीन पर (संकलन) उस जगह पर होने की संभावना नहीं है? इसी तरह grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfoसंकलन मेजबान का पता लगाने के लिए लक्ष्य नहीं है ...?
स्लीवेनवेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.