OpenWrt 建置 – 使用方法

先前準備

程序

1. 不要使用 root帳號
2. 所有的命令必須在 <buildroot dir> 目錄底下執行, 如 ~/openwrt/trunk/
  1. 更新OpenWrt原始碼
  2. 更新並安裝套件
  3. 設定套件
  4. 開始編譯。這會自動編譯toolchain,編譯原始碼,封裝套件,最後產生可以刷新的映像擋。
  5. 開始進行 安裝OpenWrt

更新原始碼

更新原始碼:

svn update
OpenWrt的原始碼很常更新。建議使用最新的原始碼。

更新 Feeds

  1. 更新feeds:
    ./scripts/feeds update -a
  2. 安裝下載的套件:

注意: 在 ./scripts/feeds中顯示的installing 表示 "讓這個套件可以在 make menuconfig中選擇"。而不是真的編譯和安裝套件。

  • 安裝單一套件:
    ./scripts/feeds install <PACKAGENAME>
  • 或安裝全部的套件:
    ./scripts/feeds install -a

Image Configuration

開始OpenWrt Buildroot的 ncurses text-based 設定界面:

make menuconfig

就像Linux kernel 設定,每一個選項大致有三種,y, m, n 分別表示:

  • y 設定成 <*> 標籤
    這個套件將包含在映像檔裡
  • m 設定成 <M> 標籤
    這個套件會被編譯 (to be installed with opkg after Flashing OpenWrt) but the package will not be included in the firmware-image
  • n 設定成 < > 標籤
    這個套件不會被編譯

儲存設定後, ~/openwrt/trunk/.config 會依據你所選的設定產生。

編譯環境會提供OpenWrt的 'Backfire' 10.03.1 設定檔,如 for ar71xx.

  • 上面這個選單可以讓你選擇目標的平台,你想使用的toolchain以及你想要包進映像檔的套件。
  • 更新原始碼和feeds後再執行這個設定界面,以確保是最新的套件設定。

Defconfig

選定好target後再執行defconfig

make defconfig
這會產生標準的設定,包含檢查相依性和建置的環境等。 會檢查相依性,是否有安裝遺漏的並再執行一次。

整體設定

Menuconfig 提供一個文字的選單介面,可以選擇要編譯成韌體的目標、套件和一些核心選項。

make menuconfig
會自動更新現存的設定和相依性來建置更新後的映像檔。

為了簡化強大的編譯環境來產生個別的OpenWrt映像檔,發展了'menuconfig'。透過menuconfig的幫助,可以解決客製化的設定需求。依照特定的目標平台,套件需求和核心模組。標準的設定流程修改的部分包含:

  1. 目標系統(Target system)
  2. 套件選擇(Package selection)
  3. 建置系統設定(Build system settings)
  4. 核心模組(Kernel modules)

目標系統的選擇可以依照你手上的設備選擇支援的平台,可以是通用或特定的設置。 選擇套件可以選'selecting all package'來選定所有的套件,但這或許在特定狀況下才可被實現。預設的套件已經足夠,或可以再選定個別的套件。要注意的是,某些套件的組合會導致建置中斷,所以要做些測試來達到預期的結果。也因此OpenWrt的開發者們只有維護最小的預設套件組合。不過feeds-script可以讓建置過程中的套件整合和維護簡單化。

最常用的三個選項:

  • < > 這個原始碼不會被處理
  • <M> 這個套件的原始碼會被編譯成二進制檔和一個opkg套件檔。這個套件檔會放在 /buildsystem/bla/bla/bla,但是ImageGenerator並不會把這個套件放到韌體的映像檔中!
  • <*> 這個套件會被放入韌體中 (在SqashFS 分割區)

在開始編譯前的最後一步,離開 'menuconfig' – 這包含儲存設定或載入已存在的版本和設定。

離開文字選單並選擇 save 來儲存設定。

核心設定

如果不想要標準的核心設定,你可以用:

make kernel_menuconfig

注意: make kernel_menuconfig 會修改核心設定的模版,清空 build_dir 並不會回復。 修改的部分可以參考 svn diff target/linux/ 並可以下 svn revert -R target/linux/ 來回復。

參照: Customizing the kernel options

原始碼鏡射位置

'Build system settings' 包含會影響套件位置的選項,以便於操控本地端的套件組:

  1. 套件原始碼的本地端鏡射位置
  2. 下載資料夾

第一個選項,你只需要輸入那個套件原始碼的完整的ftp或web伺服器位址。下載資料夾會一樣的放在你本地端的路徑資料夾。如果是ftp或web伺服器提供TAR封裝檔,OpenWrt的建置系統會先嘗試下載在Makefile裡描述的位址。也可以指定在建置系統上的下載資料夾。

如果你需要特定或非標準的驅動程式,必須到'Kernel modules'選定。這通常是需要USB模組或是特定的網路介面的驅動程式等。

客製化檔案

在許多狀況,可能需要一個已被預先設定好的客製化映像檔。可以放置你的客製化檔案到

<buildroot dir>/files/

例如,你想要先設定好/etc/config/firewall,那就把修改好的firewall設定檔放到:

<buildroot dir>/files/etc/config/
例如,你的<buildroot dir> 是 /openwrt/trunk。如果你想把某些檔案放到映像檔中的/etc/config資料夾,就把這些檔案放到 /openwrt/trunk/files/etc/config.

建置映像檔

當全部都準備好可以建置映像檔了,只要下這麼一個命令:

make

這個命令會開始一連串的活動,如你所知的

  1. 編譯 toolchain
  2. 用toolchain做跨平台編譯原始碼
  3. 產生opkg套件
  4. 產生可以flashed的韌體映像檔

Make 選項

多核心CPU建置

建置的程序可以透過多個非同步的程序來加速,使用 -j選項:

make -j 3

  • 使用標準的公式 <CPU核心數目 + 1>
  • 如果會發生不固定建置錯誤,請試著拿掉 -j選項後再編譯一次。

背景建置

如果你希望建置的過程中還可以使用你的系統,你可以讓建置的程序只使用閒置的 I/O 和 CPU 資源 (雙核心 CPU):

ionice -c 3 nice -n 20 make -j 2

建置單一套件

在開發OpenWrt套件的時候,僅編譯套件是來得方便多的 (例如建置套件 cups):

make package/cups/compile V=s

如套件 mc (midnight commander)包含feed packages 的套件:

make package/feeds/packages/mc/compile V=s

注意:啟始路徑為package 目錄和 package/feeds 的或許不會和feeds的結構相同。 如套件 ~/openwrt/trunk/feeds/packages/net/snort 要用 make ~/openwrt/trunk/package/feeds/packages/snort/compile V=s來編譯。

建置錯誤

如果因為某些原因建置錯誤了,最簡單的方式就是使用:

make V=s 2>&1 | tee build.log | grep -i error

這個命令會記錄全部的建置輸出到 /openwrt/trunk/build.log 並顯示error的部分到螢幕上。

另一個範例:

ionice -c 3 nice -n 20 make -j 2 V=s CONFIG_DEBUG_SECTION_MISMATCH=y 2>&1 | tee build.log | egrep -i '(warn|error)'

這個命令在雙核心CPU環境用背景建置並記錄全部的建置輸出到 build.log 且顯示warnings和error的部分到螢幕上。

使用beep聲提示

依照你的使用的CPU,建置程序需要一些時間或更久。你可以使用 echo -e '\a'來做聲音的提示:

make V=s ; echo -e '\a'

映像檔位置

建置成功後,最新的映像檔會放在 <buildroot dir>/bin 資料夾。編譯過的檔案會依照目的平台來放置,如韌體是給ar71xx裝置的,就會被放在 <buildroot dir>/bin/ar71xx 資料夾裡。

例:假設你的 <buildroot dir> 是 /openwrt/trunk 這個二進制檔就在 /openwrt/trunk/bin/ar71xx.

清除編譯

如果需要清除建置環境的時候,以下的make參數可以使用:

清除

make clean

刪除 binbuild_dir 目錄內容。

清除目錄

make dirclean

除了刪除 /bin/build_dir 的內容,並包含 /staging_dir/toolchain (跨平台編譯的工具). 'Dirclean' 是基本的清除指令。

清除編譯

make distclean

消滅所有的已編譯的部分或設定,並刪除以下載的套件和原始碼。

注意: 請小心使用,這個命令會 移除你的建置設定(.config),toolchain和其他所有的原始碼!

在OpenWrt的建置環境中還有很多的功能,以上已包含部分的概念。

建置範例

問題排除

首先使用"make V=s"選項來取得更多資訊。

Missing source code file, due to download problems

先檢查Makefile裡的URL路徑的結尾是否包含斜線,試著將它移除。 或是手動下載原始碼,並放到 "dl" 資料夾。

Compilation errors

試著更新原始碼和所有的feeds (注意! 可能會導致其他問題)。 檢查是否有相關的臭蟲 (TRAC), 可以使用filter來搜尋。 或是直接在那裏回報問題,請提供套件名稱,目的CPU和映像檔等以及原始碼和套件版本。 使用 make -j … 有時會發生不固定的錯誤。回報前請先不使用-j選項編譯。

Bad environment variables

  • GREP_OPTIONS 不應該有 –initial-tab 或是其他會影響輸出的選項。
  • SED 不應該被設定。如果已存在編譯前請執行 `unset SED` 。 (參照 Ticket 10612.)

I can't find my <package> in menuconfig

  1. 請先試過這個命令 See this.
    ./scripts/feeds install <package>
  2. 也許你找錯子目錄了。請參考套件的 Makefile
    cat package/feeds/packages/<package>/Makefile

找到如下:

define Package/<package>/Default SUBMENU:=Firewall SECTION:=net CATEGORY:=Network

Error: No rule to make target...

請確認路徑是以 package 資料夾開始,並確認資料夾存在。feedspackage/feeds 資料夾的結構是不一樣的。 See this.

  • 錯誤: make feeds/packages/utils/screen/compile V=s
  • 正確: make package/feeds/packages/screen/compile V=s

WARNING: skipping <package> -- package not selected

執行 make menuconfig 並開啟這個套件。 把它標記為 <*><M> 讓編譯正常. See this.

參考資料

Back to top

zh-tw/doc/howto/build.txt · Last modified: 2012/10/24 11:43 by changeway