2016-05-18 3 views
5

पर स्पष्टीकरण के लिए अनुरोध मैंने हाल ही में लिनक्स आधारित एम्बेडेड सिस्टम बनाने में एक प्रयास किया है, जो मेरी सामान्य एम्बेडेड सामग्री से बहुत रोना है जहां मेरे पास कुल सबकुछ पर नियंत्रण है।योक्टो विरासत

उस के हिस्से के रूप में, मैं योको/बिटबेक/ओपनएम्बेड बिल्ड सिस्टम में देख रहा हूं।

एक चीज है जिसके साथ मैं पकड़ रहा हूं और यह लेयरिंग अवधारणा है, इसलिए मैं दोनों परतों का उपयोग करने/अन्य परतों को प्रभावित करने के तरीके को समझने की कोशिश कर रहा हूं।

तारीख करने के लिए मेरी समझ से, एक .bb नुस्खा फ़ाइल require का उपयोग करता है बस एक फ़ाइल, सी #include "myheader.h" जो आम तौर पर स्थानीय स्तर पर लग रहा है के लिए इसी तरह शामिल करने के लिए।

.bbappend फ़ाइल "ऊपरी" परत में ऑटो-जादुई रूप से बेस फ़ाइल को शामिल करेगी, फिर इसमें अंतर्निहित require की तरह परिवर्तन करें।

इसके विपरीत, inherit कीवर्ड ठीक उसी तरह एक .bbclass वर्ग फ़ाइल के रूप में यह .bb फ़ाइलें स्थित के लिए लग रहा है, और (एक तरह से #include <stdio.h> जो, फिर आम तौर पर की तरह उनमें से सभी detials विरासत, में लग रहा है सिस्टम क्षेत्र (ए))।

तो मेरे प्रश्न का पहला भाग यह है: क्या मेरी समझ सही है? या मैं बहुत सरल हूँ?

मेरे प्रश्न के दूसरे भाग में मेरी वर्तमान समझ के प्रकाश में BBEXTENDS का उपयोग शामिल है। यदि हमारे पास require का उपयोग करके नुस्खा का विस्तार करने की क्षमता पहले से मौजूद है, तो BBEXTENDS चर में व्यंजनों को सूचीबद्ध करने का उद्देश्य क्या है?


(क) हाँ, मुझे पता है वे दोनों पूरी तरह से जहां हेडर से आते हैं के संदर्भ में निर्भर कार्यान्वयन कर रहे हैं हूँ, मैं सिर्फ अपने आम उपयोग के बारे में बात कर रहा हूँ।

उत्तर

7

योक्टो के लिए सीखना वक्र अन्य भवन प्रणाली से अलग है, इसलिए मैं आपके भ्रम को क्यों समझता हूं लेकिन मेरा विश्वास करता हूं, यह इसके लायक है। आपके प्रश्न बिटबैक से संबंधित हैं इसलिए मैं BitBake User Manual की अनुशंसा करता हूं। बस यह सुनिश्चित करें कि आप अपने पॉकी संशोधन के समान संस्करण पढ़ रहे हैं।

requireinclude के समान है और इसकी तुलना सी और सी ++ से #include से की जा सकती है जैसा आपने लिखा है। हालांकि आम तौर पर उनमें से दोनों को नुस्खा (* .bb) में कुछ एक्सटेंशन जोड़ने के लिए उपयोग किया जाना चाहिए जो कि कुछ मात्रा में व्यंजनों (बस - पुन: उपयोग किया जा सकता है) के लिए आम हैं। उदाहरण के लिए: पथों की परिभाषाएं, दो व्यंजनों द्वारा उपयोग किए जाने वाले कस्टम कार्यों। सामान्य उद्देश्य नुस्खा क्लीनर बनाना और फिर से उपयोग के लिए कुछ स्थिरांक अलग करना है।

बहुत महत्वपूर्ण बात यह है ->include और के बीच अंतर require (BitBake मैनुअल से):

निर्देश शामिल एक त्रुटि का उत्पादन नहीं करता है जब फ़ाइल नहीं पाया जा सकता है।नतीजतन, यह अनुशंसा की जाती है कि यदि आपके द्वारा शामिल की गई फ़ाइल में मौजूद होने की उम्मीद है, तो आपको शामिल करने के बजाय आवश्यकता का उपयोग करना चाहिए। ऐसा करने से यह सुनिश्चित हो जाता है कि फ़ाइल नहीं मिल पाई जाने पर त्रुटि उत्पन्न होती है।

नतीजतन: जब आप * .bb और यह नहीं पाया गया है, BitBake नहीं एक त्रुटि यह नुस्खा पार्स करने के दौरान बढ़ा देंगे के लिए एक फ़ाइल में शामिल हैं। यदि आप require का उपयोग करेंगे, तो त्रुटि उठाई जाएगी। जब आपको निर्देशित फ़ाइल मौजूद होनी चाहिए तो आपको आवश्यकता का उपयोग करना चाहिए क्योंकि इसमें महत्वपूर्ण चर/कार्य शामिल हैं जो प्रक्रिया के लिए अनिवार्य हैं।

*.bbappend के मामले में - यह बहुत शक्तिशाली है। सामान्य मामला यह है कि आप *.bbappend द्वारा अन्य परत से नुस्खा में कुछ कस्टम संशोधन जोड़ रहे हैं क्योंकि (उदाहरण के लिए): आप मूल नुस्खा के रखरखाव नहीं हैं या संशोधनों का उपयोग केवल आपके प्रोजेक्ट में किया जाता है (फिर यह आपके मेटा में स्थित होना चाहिए परत)। लेकिन आप एक ही परत पर नुस्खा bbappend भी कर सकते हैं। बिटबैक सभी परतों को पार करता है और फिर 'आउटपुट बनाता है' और इसे निष्पादित करता है। अध्याय Execution from BitBake man में अधिक।

inherit तंत्र ताकि आप उन्हें अपने खुद के, जैसे पर लिखने की जरूरत नहीं है कुछ विशेष उद्देश्य के लिए *.bbclass जहां सामान्य कार्यों के वारिस के लिए इस्तेमाल किया जा सकता परिभाषित कर रहे हैं: जब यह जरूरत है कि आप अपने नुस्खा के लिए inhert cmake या inherit autotools का उपयोग प्रदान करने के लिए उन स्रोतों के लिए आउटपुट जो सीएमके द्वारा संगत रूप से निर्मित होते हैं (और आपके पास CMakeLists.txt परिभाषित किया गया है) या autotools (Makefile.am आदि)। ओपनएम्बेड द्वारा प्रदान की गई कक्षाओं की परिभाषाएं/मेटा/कक्षाओं के अंतर्गत स्थित हैं/यदि आप पोकी के साथ योक्टो रिलीज का उपयोग कर रहे हैं। आप उन्हें देख सकते हैं और आप देखेंगे कि उदाहरण के लिए autotools.bbclass ने परिभाषित किया है (दूसरों के बीच) कार्य: autotools_do_configure() इसलिए आपको इसे स्क्रैच से लिखने की आवश्यकता नहीं है। हालांकि आप इसे अपने नुस्खा में फिर से परिभाषित कर सकते हैं (केवल इस फ़ंक्शन की अपनी परिभाषा प्रदान करके)। यदि नुस्खा को बदला नहीं जा सकता है, तो आप आसानी से *.bbappend फ़ाइल बना सकते हैं और अपना स्वयं का फ़ंक्शन do_configure() लिख सकते हैं जो *.bbclass से फ़ंक्शन को ओवरराइड कर देगा। सीओ ++ या जावा जैसे ओओ भाषाओं की तरह।

संबंधित मुद्दे