User Tools

Site Tools


zh-tw:doc:howto:build

OpenWrt 建置 – 使用方法

→ 回到 downloads 或閱讀 →OpenWrt Buildroot – About

先前準備

程序

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.

參考資料

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
zh-tw/doc/howto/build.txt · Last modified: 2018/06/08 18:51 by tmomas