天天看點

yocto recipe建構流程介紹

yocto recipe建構流程介紹

    • 1.recipe建構過程簡介
    • 2.查找日志和工作檔案
    • 3.設定配置參數
    • 4.recipes間共享檔案
    • 5.打包

1.recipe建構過程簡介

在使用devtool build指令建構recipe時,典型的建構過程如下:

  1. 擷取源代碼
  2. 解壓縮源代碼
  3. 配置源代碼
  4. 編譯源代碼
  5. 安裝建構輸出
  6. 打包已安裝的輸出

對于工作空間中的recipes,在源碼樹中已經禁用了擷取和解壓縮過程,因為這兩個過程是完備且可持續使用的,一般而言不需要進行修改。 這些建構步驟中的每一個都被定義為一個函數(任務),通常帶有一個“ do_”字首(例如do_fetch,do_unpack等)。 這些函數通常是shell腳本,但是可以用Python編寫。

如果檢視配方的内容,你不難會發現該配方不包含有關建構軟體的完整說明。取而代之的是,通用功能封裝在使用inherit指定的繼承類中。這個方式可以使配方僅用于描述特定軟體所需的建構内容。且存在一個所有配方隐式繼承的base類,并提供大多數配方通常都需要的功能。

以下部分介紹使用配方時的一些可用的資訊。

2.查找日志和工作檔案

在第一次運作devtool build指令之後,先前使用devtool add指令建立的配方或使用devtool modify指令修改的源碼的配方均包含在源碼樹中建立的符号連結:

  • oe-logs:該連結指向在其中建立每個建構步驟的日志檔案和運作腳本的目錄。
  • oe-workdir:該連結指向配方的臨時工作區。oe-workdir下的以下目錄位置十分有用:
    • image/:包含在do_install階段安裝的所有檔案。在recipe中,該目錄由表達式${D}引用。
    • sysroot-destdir/:包含do_install中安裝的已放入共享sysroot中的檔案的子集。有關更多資訊,請參見Sharing Files Between Recipes部分。
    • packages-split /:包含配方生成的每個軟體包的子目錄。 有關更多資訊,請參見packaging部分。

可以使用這些連結來擷取有關每個建構步驟中所完成的事情的更多資訊。

3.設定配置參數

如果使用GNU autoconf建構軟體,那麼會将固定的參數集傳遞給它,以啟用交叉編譯以及在recipe中通過EXTRA_OECONF或PACKAGECONFIG_CONFARGS設定的其他功能。如果你想傳遞其他選項,需要将它們添加到EXTRA_OECONF或PACKAGECONFIG_CONFARGS。其他受支援的建構工具具有類似的變量(例如,對于CMake,使用EXTRA_OECMAKE,對于Scons,則使用EXTRA_OESCONS,等等)。如果需要在make指令行上傳遞任何内容,則可以使用EXTRA_OEMAKE或PACKAGECONFIG_CONFARGS變量來執行此操作。

此外,可以使用devtool configure-help指令來幫助設定上述内容中列出的參數。該指令确定要傳遞的明确選項,并将它們與通過EXTRA_OECONF或PACKAGECONFIG_CONFARGS指定的任何自定義參數一起顯示出來。如果是可應用的,該指令還會顯示配置腳本的“DASHDASHhelp”選項的輸出作為參考。

4.recipes間共享檔案

recipes通常需要使用Build Host上其他recipe提供的檔案。例如,連結到公共庫的應用程式需要通路庫本身及其關聯的頭。在可擴充SDK中完成此通路的方式是通過sysroot。每一個需要建構SDK的“machine”都存在一個sysroot。實際上,這意味着目标機器存在一個sysroot,而建構主機存在一個sysroot。

在recipe中永遠不要将檔案直接寫入sysroot。而是應在${D}目錄中的do_install任務期間将檔案安裝到标準位置。這些檔案的子集将自動進入sysroot。出現此限制的原因是,進入sysroot的幾乎所有檔案都在清單中分類,以確定以後在修改或删除配方時可以将其删除。是以sysroot能夠保留舊檔案。

5.打包

打包在可擴充SDK中并不總是特别相關。 但是,如果需要檢查建構輸出如何進入目标裝置的最終鏡像,則了解打包過程是非常重要的,因為映像的内容是根據打包的過程完成的而不是配方。

在do_package任務期間,将在do_install任務期間安裝的檔案拆分為一個主軟體包(命名幾乎總是與recipe相同),并拆分為其他幾個軟體包。之是以存在這種分離,是因為并非所有安裝的檔案在每個映像中都有用。 例如,可能不需要在映像中安裝任何的文檔。是以,對于每個配方,文檔檔案都被拆分到-doc包。包含可選子產品或插件的打包軟體的recipe也可能會進行其他打包拆分。

建構recipe後,可以通過在oe-workdir/ packages-split目錄中檢視檔案的去向,該目錄包含每個軟體包的子目錄。除某些進階情況外,PACKAGES和FILES變量控制拆分。PACKAGES變量列出了所有要生成的軟體包,而FILES變量通過使用重寫指定軟體包來指定要包含在每個軟體包中的檔案。例如,FILES_ P N ∗ ∗ 指 定 要 進 入 主 程 序 包 的 文 件 ( 即 , 主 程 序 包 與 配 方 具 有 相 同 的 名 稱 , 而 {PN}**指定要進入主程式包的檔案(即,主程式包與配方具有相同的名稱,而 PN∗∗指定要進入主程式包的檔案(即,主程式包與配方具有相同的名稱,而 {PN}等于配方名稱)。PACKAGES值的順序很重要。對于每個安裝檔案,其FILES值與該檔案比對的第一個軟體包是該檔案所進入的軟體包。PACKAGES和FILES**變量均存在預設值。是以,你會發現甚至不需要在配方中設定這些變量,除非配方正在建構的軟體将檔案安裝到非标準位置。

繼續閱讀