OpenWrt 編譯步驟與命令詳解
來源 https://p3terx.com/archives/openwrt-compilation-steps-and-commands.html
前言
編譯 OpenWrt 的過程就像是復讀機,除了選擇系統組件外,幾乎每次編譯都是復制粘貼相同的命令。而理解每一條命令的作用、什么時候該去執行,這樣才能更好的去解決編譯中遇到的問題,更順利的編譯出固件。
下載資源站點 http://182.140.223.146/dl/
golang module 代理站點 https://goproxy.io/
首次編譯
-
克隆 OpenWrt 源碼
git clone https://github.com/coolsnowwolf/lede openwrt
這里以 Lean 大佬的源碼倉庫為例子,畢竟很多人都在用它。命令末尾加了
openwrt
是指克隆代碼到openwrt
目錄,目的是為了規范化,因為有時並不是編譯這個的源碼。 -
進入源碼目錄
cd openwrt
-
下載 feeds 源中的軟件包源碼
./scripts/feeds update -a
feeds 是擴展的軟件包,獨立於 OpenWrt 源碼之外,所以需要單獨進行拉取和更新。
-
安裝 feeds 中的軟件包
./scripts/feeds install -a
-
調整 OpenWrt 系統組件
make menuconfig
首次編譯建議只選擇架構,其它都不要動,這樣編譯成功率會更高。如果不打算調整組件則輸入
make defconfig
,它會檢測編譯環境並生成默認的編譯配置文件。 -
預下載編譯所需的軟件包
make download -j8 V=s
-j8
是指使用8個線程下載,理論上是數字越大下載越快,但似乎有個上限,實測5線程以上其實速度相差不了多少,在網絡好的情況下,基本在5分鍾以內能下載完。 -
檢查文件完整性
find dl -size -1024c -exec ls -l {} \;
此命令可以列出下載不完整的文件(根據我多次編譯的 經驗得出小於1k的文件屬於下載不完整),如果存在這樣的文件可以使用
find dl -size -1024c -exec rm -f {} \;
命令將它們刪除,然后重新執行make download
下載並反復檢查,確認所有文件完整可大大提高編譯成功率,避免浪費時間。 -
開始編譯
make -j1 V=s
-j1
:使用單線程編譯。新手推薦單線程編譯,一是因為玄學問題可能成功率高,二是方便查看錯誤日志。V=s
:輸出詳細日志,用於編譯失敗時找出錯誤。而且滿屏代碼在跑能裝逼,一跑就是幾個小時,裝逼更持久。
再次編譯
-
進入源碼目錄(如果不在此目錄)
cd openwrt
更新
TIPS: 短期內再次編譯可忽略更新這個步驟。
-
更新系統軟件包
sudo sh -c "apt update && apt upgrade -y"
主要作用是更新在編譯環境搭建時所安裝的編譯組件
-
拉取 OpenWrt 源碼更新
git pull
-
更新 feeds 源中的軟件包源碼
./scripts/feeds update -a
-
安裝 feeds 中的軟件包
./scripts/feeds install -a
文件清理
-
清除舊的編譯產物(可選)
make clean
在源碼有大規模更新或者內核更新后執行,以保證編譯質量。此操作會刪除
/bin
和/build_dir
目錄中的文件。 -
清除舊的編譯產物、交叉編譯工具及工具鏈等目錄(可選)
make dirclean
更換架構編譯前必須執行。此操作會刪除
/bin
和/build_dir
目錄的中的文件(make clean
)以及/staging_dir
、/toolchain
、/tmp
和/logs
中的文件。 -
清除 OpenWrt 源碼以外的文件(可選)
make distclean
除非是做開發,並打算 push 到 GitHub 這樣的遠程倉庫,否則幾乎用不到。此操作相當於
make dirclean
外加刪除/dl
、/feeds
目錄和.config
文件。 -
還原 OpenWrt 源碼到初始狀態(可選)
git clean -xdf
如果把源碼改壞了,或者長時間沒有進行編譯時使用。
-
清除臨時文件
rm -rf tmp
刪除執行
make menuconfig
后產生的一些臨時文件,包括一些軟件包的檢索信息,刪除后會重新加載package
目錄下的軟件包。若不刪除會導致一些新加入的軟件包不顯示。 -
刪除編譯配置文件
rm -f .config
在不刪除的情況下如果取消選擇某些組件它的依賴組件不會自動取消,所以對於需要調整組件的情況下建議刪除。
編譯
-
調整 OpenWrt 系統組件
make menuconfig
如果不打算調整組件則輸入
make defconfig
,它會檢測編譯環境並根據更新自動調整編譯配置文件。 -
預下載編譯所需的軟件包
make download -j8 V=s
-
檢查文件完整性
find dl -size -1024c -exec ls -l {} \;
此命令可以列出下載不完整的文件(根據我多次編譯的 經驗得出小於1k的文件屬於下載不完整),如果存在這樣的文件可以使用
find dl -size -1024c -exec rm -f {} \;
命令將它們刪除,然后重新執行make download
下載並反復檢查,確認所有文件完整可大大提高編譯成功率,避免浪費時間。 -
開始編譯
make -j$(nproc) || make -j1 || make -j1 V=s
多線程編譯失敗后自動進入單線程編譯,失敗則輸出詳細日志。
尾巴
很少有人會告訴你為什么要這樣做,而是會要求你必須要這樣做。
================ End