2016-05-18 28 views
5

Kısa bir süre önce Linux tabanlı gömülü sistemler inşa etmeye başladım, her zamanki gibi gömülü olan her şeyden dolayı toplam kontrolüm var.Yocto kalıtım hakkında açıklama isteme

Bunun bir parçası olarak, Yocto/bitbake/OpenEmbedded derleme sistemine bakıyorum.

Çektiğim bir şey var ve bu katman kavramı, bu yüzden hem katmanların diğer katmanları nasıl kullandığını/etkilediğini anlamaya çalışıyorum. Bugüne kadar Benim anlayış

, bir .bb reçete dosyası basitçe C'ler #include "myheader.h"genellikle lokal olarak görünüyor ki benzer başka bir dosya içerecek şekilde require kullanır. Bir "üst" katmanda bulunan bir .bbappend dosyası, temel dosyayı otomatik olarak dahil edecek ve ardından, kendisinde bir değişiklik olan require türünde bir değişiklik yapacaktır. Buna karşılık

bakar, inherit kelime o .bb dosyaları bulur hemen hemen aynı şekilde bir .bbclass sınıf dosyasını arar ve çeşit #include <stdio.h> genellikle yine gibi (onlardan bütün detials devralır sistem alanı (a)).

Bu yüzden benim sorumun ilk kısmı: Benim anlayışım doğru mu? Yoksa çok basit miyim?

Sorunun ikinci kısmı, şimdiki anlayışımın ışığında BBEXTENDS kullanımını içerir. require kullanarak bir tarifi genişletme imkanımız varsa, söz konusu tarifleri BBEXTENDS değişkeninde listelemenin amacı nedir?


(a) Evet, onlar başlıkları nereden geldiğini açısından bağımlı hem tamamen uygulama konum farkındayım, ben sadece onların ortak kullanım bahsediyorum.

cevap

7

Yocto için öğrenme eğrisi diğer bina sistemlerinden farklıdır, bu yüzden neden karışıklığınızı anladığımı, ancak bana güvendiğime, buna değecektir. Sorularınız BitBake ile ilgilidir, bu yüzden BitBake User Manual'u tavsiye ederim. Sadece poky revizyonunuzla aynı sürümü okuduğunuzdan emin olun.

requireinclude ile benzerdir ve yazdığınız gibi C ve C++ 'dan #include ile karşılaştırılabilir. Genel olarak her ikisi de bir miktar reçete eklemek için kullanılmalıdır (* .bb), bazı tariflerde yaygındır (basitçe - yeniden kullanılabilir). Örneğin: yol tanımları, çift tarifleri tarafından kullanılan özel görevler. Genel amaç, numaralı temizleyiciyi numaralı temizlemeyi yapmak ve yeniden kullanım için bazı sabitleri ayırmaktır.

çok önemli bir şey -> fark include ila require (BitBake manuel):

dosyası bulunamadığı zaman bir hata üretmez yönergesi bulunur.Sonuç olarak, dahil ettiğiniz dosyanın var olması bekleniyorsa, içerme yerine gereksinim kullanmanız önerilir. Bu, dosya bulunamazsa bir hata üretildiğinden emin olur. Bunun sonucunda

: Eğer * .bb ve bulunamamıştır, BitBake değil bu tarifi ayrıştırma sırasında bir hata yükseltecektir bir dosyayı eklediğinizde. require kullanırsanız, hata yükseltilir. İşaretlenecek dosya gerektiğinde, işlemek için zorunlu olan önemli değişkenler/görev içerdiği için kullanmalısınız.

*.bbappend durumunda - çok güçlüdür. Tipik durum, *.bbappend tarafından diğer katmandan reçete için bazı özel değişiklikler eklemenizdir, çünkü (örn.): Orijinal reçetenin koruyucusu değilsiniz veya değişiklikler sadece projenizde kullanılıyor (o zaman metaunuzda yer almalıdır) -layer). Ancak aynı katmandaki tarifi de bbappend yapabilirsiniz. BitBake tüm katmanları ayrıştırır ve daha sonra bir çıktı oluşturur ve çalıştırır. Daha fazla bölüm Execution from BitBake man. Eğer örneğin, sizin yeniden yazmaya gerek kalmaz

inherit yöntemi tanımlanmıştır bazı belirli bir amaç için *.bbclass ortak görevleri devralmak için kullanılabilir: ihtiyacı ne zaman reçeteye inhert cmake veya inherit autotools kullanmak sağlamak CMake (ve CMakeLists.txt tanımlı) veya autotools (Makefile.am vb.) tarafından karşılık gelen şekilde oluşturulan kaynaklar için çıktı. OpenEmbedded tarafından sağlanan sınıfların tanımları, poky ile Yocto yayınını kullanıyorsanız,/meta/sınıfları altında bulunur. Onları kontrol edebilir ve örneğin autotools.bbclass'un (diğerleri arasında) görev tanımladığını göreceksiniz: autotools_do_configure() bu yüzden sıfırdan yazmanız gerekmez. Bununla birlikte, tarifinizde yeniden tanımlayabilirsiniz (sadece bu işlevin kendi tanımını vererek). Eğer tarif değiştirilemezse, sadece *.bbappend dosyasını oluşturabilir ve do_configure() kendi fonksiyonunuzu yazabilir, bu da *.bbclass işlevini geçersiz kılacaktır. Tıpkı C++ veya Java gibi OO dillerinde olduğu gibi.