make menuconfig
OpenWrt构建系统设置界面(OpenWrt build system configuration interface)处理关于目标平台,需要编译的包,包含在固件文件里面的包,以及一些kernel选项等的选择。
通过如下命令启动OpenWrt构建系统设置界面
make menuconfig
该命令将自动更新你已有的设置项的依赖,而后你就可以进一步编译你更新以后的映像。
你会看到一系列的选项,这些选项是一棵树的顶点。你可以选择一项,进而进入他下面的选项树。
你可以键入”/”按键,搜索一个字符串来在这棵树里面的包或功能中搜索。此操作会告诉你其在这颗树的位置。
对于绝大多数的包和功能,你可以有三个选项:y,m,n。他们的含义如下所述:
- y 设置为 <*> 内置
该包将被编译并包含在固件文件中。
- m 设置为 <M> 包
该包将被编译,但是不会包含在固件文件中。也就是说可以在固件文件刷入设备以后通过opkg安装。
- n设置为 < > 排除
源代码不会被处理
当你保存你的设置的时候,会创建一个<buildroot dir>/.config文件用来保存你的设置。
当你打开 menuconfig,你需要按照如下顺序设置构建选项(就和menuconfig的界面显示的顺序相同)
- 目标系统(设备的通常的类别)
- 子目标(目标系统的子类别,按相似设备分组)
- 目标配置文件(每一种指定设备)
- 包选择
- 构建系统设置
- kernel模组
先选择你的设备的Target system,然后选择正确的Subtarget,而后你就应该可以在支持的Target profile的列表中找到你的设备。
例如,如果希望选择并保存设备TL-WR841N v11 Wi-Fi router:
- Target System → Select → Atheros AR7xxx/AR9xxx → Select
- Subtarget → Select → Devices with small flash → Select
- Target Profile → Select → TP-LINK TL-WR841N/ND v11 → Select
- Exit → Yes
使用config diff文件配置
除了make menuconfig ,另外一个配置的方法是使用一个configuration diff file。该文件仅仅包含相对默认的配置而言的更改配置。使用这个方案的一个有利之处是可以在你的项目中进行这个文件的版本控制。它同时收到上游更新的影响比较小,因为它仅仅包含更改。
创建diff file
保存编译配置的修改
# 把改变写入diffconfig
./scripts/diffconfig.sh > diffconfig
注意:从OpenWrt19.07来时,固件编译过程会在目标映像文件目录里面自动创建配置diff file:config.buildinfo (该文件在18.06和之前的版本命名为config.seed) 。
使用diff file
这些改变可以生成基础的设置文件<buildroot>/.config 。通过运行make defconfig这些改变会展开成为一个完整的配置。
# 将改变写入 .config
cp diffconfig .config
# 展开成为完整的配置
make defconfig
这些改变也可以加在配置文件(<buildroot>/.config
)的底部,通过运行make defconfig这些改变可以覆盖已有的配置。
# 将改变添加到.config的底部
cat diffconfig >> .config
# 应用改变
make defconfig
自定义文件
|
如果你想包含一些自定义的配置文件,他们应该放置的正确位置位于
- <buildroot>/files/
例如,假如你想有一个自定义的/etc/config/firewall或者etc/sysctl.conf的映像文件,就需要创建如下文件:
- <buildroot>/files/etc/config/firewall
- <buildroot>/files/etc/sysctl.conf
也就是说,如果你的<buildroot>是~/source,你想把一些文件拷贝到映像文件的/etc/config目录,这些文件应该被放置在~/source/files/etc/config。
强烈建议只使用https://openwrt.org/docs/guide-developer/uci-defaults来增量集成需要的定制项。这可以帮助尽量避免版本更迭之间的自生成的设置项的冲突。
DefConfig
make defconfig
将会创建目标设备和构建系统的一个通用的配置,包含对于依赖的检查,对于构建环境的先决条件的检查等。
Defconfig还会移除.config中失效的项目,例如对于一个不存在的包或者设置选项的引用。
他还会检查依赖项并且添加可能缺失的必须的依赖项。这可以用来将一个短小的.config(比如diffconfig输出甚至可能是精简版本)展开成为一个编译过程可是使用的完整的.config。
Kernel配置(可选)
注意,make kernel_menuconfig会修改构建树的Kernel配置模板并且会清除build_dir,而且不会复原。同时如果你在这里做了修改你将不能从官方的代码仓库安装kernel包。
你通常不会需要这个,你可以使用如下命令
make kernel_menuconfig CONFIG_TARGET=subtarget
CONFIG_TARGET允许你选择你希望编辑的配置,可能的选项是target, subtarget, env.
可以通过如下命令检视和复原变更:
git diff target/linux/
git checkout target/linux/
源镜像
构建系统设置包含一些有效的选项,可以修改包的位置,这样就可以使得处理一个本地的包集合简单一些。
- 源代码包的本地镜像(Local mirror for source packages)
- 下载文件夹(Download folder)
对于第一个选项,你只需简单的输入一个指向包源的HTTP或者FTP的完整的URL。下载文件夹也同样是一个在构建系统(或者网络)的本地文件夹的路径。如果你有一个web/ftp服务器存储着压缩文件,OpenWrt构建系统会在从Makefiles里面描述的位置下载文件之前尝试从你指定的位置下载文件,同样的会从指定的位于构建系统的本地”下载文件夹”下载。
Kernel模组选项在你需要特定(非标准)的设备的时候可用。通常会是考虑一些位于USB或特定的网络接口设备之类的情况。
下载源和多核编译
在运行最终的make以前最好先运行make download。这个步骤会提前抓取所有依赖的源代码,使能多核CPU编译(例如:对于4核8线程的cpu而言,make –j10运行效果更好)。
如果你试图在多核环境下编译OpenWrt,但是没有下载所有依赖包的源代码,你的构建很可能会失败。
make download
解释
从一开始,开发menuconfig就是为了创建一个简单但功能强大的环境,用于配置独立的OpenWrt构建。Menuconfig或多或少是不言自明的,甚至最专门的配置需求都可以通过使用它来满足。根据特定的目标平台、包需求和内核模块需求,标准配置过程将包括修改:
目标系统包选择构建系统设置kernel模组
目标系统是从广泛的支持平台列表中选择的,有许多目标概要文件—从特定设备到通用概要文件,所有这些都取决于手头的特定设备。
包选择有“选择所有包”的选项,这在某些情况下可能是不实际的,或者依赖默认的包集就足够了,或者进行单独的选择。这里需要提到的是,一些包组合可能会破坏构建过程,因此在达到预期结果之前需要进行一些试验。除此之外,OpenWrt开发人员本身只维护一小部分包——包括所有默认包——但是,feed脚本使处理本地维护的包集并将它们集成到构建过程中变得非常简单。
在进行编译之前的最后步骤是退出menuconfig,这也包含了保存特定设置或者加载一个已经存在的,预配置好的版本的设置的选项。
退出TUI,然后选择保存你的设置。
补丁
OpenWrt构建系统集成了quilt来方便的管理补丁。