OpenWrt代码有8个固定的顶层目录以及7个编译时创建的临时目录
顶层目录:
docs
docs目录。用于存放开发文档,编译时不需要。包含了整个宿主机的文件源码的介绍, 里面还有Makefile为目标系统生成docs.使用make -C docs/可以为目标系统生成文档.
target
针对不同的平台有不同的代码特性。target/linux
目录下按照平台进行目录划分,里面包括了针对各种平台标准内核的补丁及特殊配置等。
config
config目录是编译配置文件目录,是OpenWrt15.05的新增目录,是将一些编译选项配置文件放在这里,包含全局编译设置、开发人员编译设置、目标文件格式设置和内核编译设置等4部分。
scripts
包含准备环境脚本、下载补丁脚本、编译Makefile以及编译指令等。基本都是bash,python,perl等多种脚本语言编写的脚本。
toolchain
交叉编译工具链相关,编译器和C库等,例如包含编译工具gcc和glibc库。
include
openwrt的Makefile都存放在这里。各种 *.mk 。这里的文件是在主Makefile里包含的的,类似于库文件.这些文件定义了编译过程.
package
各种功能的软件包,软件包仅包含Makefile和修改补丁及配置文件。其中Makefile包含源代码真正的地址及MD5值OpenWrt社区的修改代码以补丁包形式管理,package只保存一些常用的软件包。
tools
通用命令,用来生成固件的辅助工具,如打补丁工具path、编译工具make及squashfs等。
每个Makefile当中都有一句$(eval $(call HostBuild)),这表明编译这个工具是为了在主机上使用的.
其他文件
Makefile :在顶层目录执行make命令的入口文件.
rules.mk:定义了Makefile中使用的一些通用变量和函数
Config.in:在include/toplevel.mk中我们可以看到,这是和make menuconfig相关联的文件.
feeds.conf.default;是下载第三方一些软件包时所使用的地址
LICENSE & README:即软件许可证和软件基本说明.其中README描述了编译软件的基本过程和依赖文件.
生成目录
bin
保存编译完成后的二进制文件,包括:完整的bin文件,所有的ipk文件.
dl
下载软件代码包临时目录。编译前将原始的软件代码包下载到该目录。
feeds
openwrt的附加软件包管理器的扩展包索引目录.有点绕,简单来说就是下载管理软件包的.默认的feeds下载有packages、management、luci、routing、telephony。如要下载其他的软件包,需打开源码根目录下面的feeds.conf.default文件,去掉相应软件包前面的#号,然后更新源:
./scripts/feeds update -a
安装下载好的包:
./scripts/feeds install -a
build_dir
编译中间文件目录。这个文件夹中包含3个子文件夹:
- host
是一个临时目录,用来存储不依赖于目标平台的工具。 - toolchain-*
用来存储依赖于指定平台的编译工具链。 - target-XXX
在此编译目标平台的目标文件,包括各个软件包和内核文件.
staging_dir
编译安装目录。文件安装到这里,并由这里的文件生成最终的编译成果。
tmp
从名字来看,是临时文件夹.在编译过程中,有大量中间临时文件需要保存,都是在这里.
logs
如果打开了针对开发人员log选项,则将编译log保存在这个目录下,否则这个目录不会创建
Openwrt Buildroot 工作过程概述
一旦 Openwrt Buildroot 经过了正确的配置,比如目标平台和架构都已经指定,用户空间软件包已选择,Openwrt Buildroot
将会通过下面 6 个步骤来产生固件 image:
- 下载交叉编译工具,比如内核头文件;
- 创 建 阶 段 性 目 录 ( staging_dir/ )。 交叉编译 工 具 链 将 会 被 安 装 到 这 里(比如 toolchainmipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/)。如果你要使用这个交叉编译工具链编译特定的程
序,你可以在这个目录找到交叉编译工具。嵌入式根文件系统也会安装到 staging_dir/目录,比如:target-mipsel_24kec+dsp_uClibc-0.9.33.2/root-ramips; - 创建下载目录(默认为 dl/)。所有源码包会被下载到这个目录;
- 创建编译目录(build_dir/)。所有用户空间工具会在这里编译;
- 创建目标根文件系统目录(比如 build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/root-ramips/)以及
根文件系统框架。 - 安装用户空间软件包到根文件系统以及压缩整个文件系统为适当的格式