2016-05-18 112 views
5

我最近進行了一個基於Linux的嵌入式系統的構建,與我平常嵌入的東西差不多,我有總計控制一切。關於Yocto繼承的澄清請求

作爲其中的一部分,我正在研究Yocto/bitbake/OpenEmbedded構建系統。

我有一件事情要解決,那就是分層概念,所以我試圖找出圖層使用/影響其他圖層的方式。

從我的理解至今,.bb配方文件使用require簡單地包含另一個文件,類似於C的#include "myheader.h"一般看起來本地。

A .bbappend文件在「上」層將自動奇蹟般地包含基本文件,然後對其進行更改,排序固有require

相比之下,inherit關鍵字查找在大致相同的方式.bbclass類文件,因爲它所處的.bb文件,並繼承了所有從他們的detials(有點像#include <stdio.h>這又一般,看在系統區域(a))。

所以我的問題的第一部分是:我的理解是否正確?還是我太簡單了?

我的問題的第二部分涉及到根據我目前的理解使用BBEXTENDS。如果我們已經有能力使用require擴展配方,那麼在BBEXTENDS變量中列出所述配方的目的是什麼?


(一)是的,我知道他們是完全取決於執行在其中標題來自而言,我只是講出自己共同使用。

回答

7

Yocto的學習曲線與其他建築系統不同,爲什麼我理解你的困惑,但相信我,這是值得的。您的問題與BitBake有關,所以我建議您使用BitBake User Manual。只要確保你閱讀的是與你的poky版本相同的版本。

requireinclude類似,可以與C和C++中的#include進行比較,就像您寫的一樣。 雖然通常它們都應該用來爲配方(* .bb)添加一些擴展,這些擴展對於一些配方是很常見的(簡單地說 - 可以重複使用)。例如:路徑的定義,幾個配方使用的自定義任務。通用目的是使配方更清潔並分開一些常量用於重新使用。

很重要的一點 - >差require之間include(從BitBake的手冊):

include指令不會產生一個錯誤,當文件不能被發現。因此,建議如果預計存在包含的文件,則應使用require而不是include。這樣做可以確保在找不到文件時產生錯誤。

其結果是:當你包括文件*的.bb,也沒有被發現,該BitBake的將解析這個配方中引發錯誤。如果您使用require,則會引發錯誤。當指向的文件必須存在時,您應該使用require,因爲它包含必須處理的重要變量/任務。

如果是*.bbappend - 它非常強大。典型的情況是,你在*.bbappend上爲其他圖層的配方添加了一些自定義修改,因爲(例如):你不是原始配方的維護者,或者修改只在你的項目中使用(那麼它應該位於你的元數據中-層)。但您也可以在同一圖層上使用bbappend配方。 BitBake解析所有圖層,然後'創建'輸出並執行它。更多內容見章節Execution from BitBake man

inherit機制可以用來繼承*.bbclass其中常見任務的一些特定目的的定義,所以你不必把它們寫在你自己的,比如:您使用inhert cmakeinherit autotools到你的食譜時,它需要提供輸出爲由CMake相應構建的源代碼(並定義了CMakeLists.txt)或自動工具(Makefile.am等)。 如果您使用Yocto版本和poky,則OpenEmbedded提供的類的定義位於/ meta/classes /下。 你可以檢查他們,你會看到,例如autotools.bbclass已經定義(除其他之外)任務:autotools_do_configure(),所以你不需要從頭開始寫它。 但是你可以在你的食譜中重新定義它(只需提供你自己定義的這個功能)。如果配方無法更改,您可以簡單地創建一個*.bbappend文件並編寫您自己的功能do_configure(),這將覆蓋*.bbclass中的功能。就像在C++或Java之類的OO語言中一樣。