官方文档和源码是最好的教程。
文章目录
OpenWrt编译过程
OpenWrt编译环境目录
目录
编译之前
编译后新增加
bin
dtbs
build_dir
host
target
toolchain
dl
feeds
build_dir
OpenWrt编译过程
OpenWrt的第一步就是编译,将 OpenWrt 编译环境目录与具体的编译过程两者进行结合说明,本文先讲解的是编译环境目录
OpenWrt 就是由脚本和 Makefile 文件构成的
toolchain
build kernel + 用户态
创建 rootfs 即根文件(库+程序)
创建 image(kernel+rootfs, rootfs一般使用 squashfs 和 romfs, 一般使用 romfs 时可以直接加载到 kernel)
OpenWrt编译环境目录
目录
make时产生
bin:编译后的文件
build_dr:在此编译程序
dl:code
feeds:第三方package
staging_dir:交叉编译工具链
在此以 ipq6010 的目录结构举例
编译之前
❯ ls
BSDmakefile # free
build_bin.sh
build_img.sh
config # 存放着整个系统的配置文件
config-0303
Config.in # 和make menuconfig相关联的文件(在include/toplevel.mk中可看到)
docs # 包含了整个宿主机的文件源码的介绍
feeds.conf # 包含了feeds的列表,每一行由三个部分组成,feeds的方法,feeds的名字和feeds的源。
feeds.conf.default # 同上
include # 包括了整个系统的编译需要的头文件, 但是是以Make进行连接的,定义了编译过程
LICENSE # 许可证
Makefile # 在顶层目录执行make命令的入口文件
meta-tools # 用于构建各个版本的内核,如emmc和nand (不确定)
new-config
package # 存放了openwrt系统中适用的软件包,包含针对各个软件包的Makefile。
prebuilt # 高通ipq的ipk文件,可以通过 OpenWrt 的包管理软件 opkg 直接安装
qca # 高通芯片 (不确定)
README
Readme.md
rules.mk # 定义了 Makefile 中使用的一些通用变量和函数,所有package都將包含该规则
scripts # 组织编译整个OpenWrt的规则
target # 目标系统指嵌入式设备, 针对不同的平台有不同的特性, 针对这些特性,"target/linux"目录下按照平台进行目录划分, 里面包括了针对标准内核的补丁, 特殊配置等
tmp # 编译文件夹, 一般情况为空
tools # 编译时主机需要使用一些工具软件,tools 里包含了获取和编译这些工具的命令
toolchain # 存放的就是编译交叉编译链的软件包
wireshark-2.4.2-11ax-patches # wireshark抓包工具
wireshark-github
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
编译后新增加
drwxr-xr-x bin # 保存编译完成后的二进制文件
drwxr-xr-x build_dir # 展开各个软件包来进行编译
drwxrwxr-x dl
drwxr-xr-x feeds # 扩展软件包索引目录,就是下载管理软件包的
-rw-r--r-- key-build
-rw-r--r-- key-build.pub
drwxr-xr-x staging_dir # 用于保存在build_dir目录中编译完成的软件
1
2
3
4
5
6
7
bin
保存编译完成后的二进制文件,包括:完整的 bin 文件、所有的 ipk 文件。
.../bin$ tree -d
.
└── ipq
├── debug
│ └── modules # 驱动模块文件
├── dtbs
├── img # 内核镜像
└── packages # pack包
├── adsprpc
...
1
2
3
4
5
6
7
8
9
10
dtbs
之所以Linux内核会提供这种方式是因为很多厂家都有自己的 bootloader ,但是这些 bootloader 并不都一定支持设备树,为了实现支持设备树启动,就引入了这种启动方式,即将编译出的zImage和编译出的设备树镜像文件拼成一个新的镜像,在内核的自解压代码中会识别到,不会出现自解压时导致设备树被覆盖。
编译内核时,我们可以使用 make dtbs 命令编译生成相应开发板的 dtb(Device Tree Blob)文件。
build_dir
展开各个软件包来进行编译。
buildroot/build_dir$ tree -d
.
└── host
└── target-arm_cortex-a7_musl-1.1.16_eabi
└── toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi
1
2
3
4
5
host
用来编译所有跑在主机上的程序(OpenWRT从源中编译他自己版本的sed和其它许多工具)。
这个区域将用来编译仅跑在你主机上的程序。
target
用于编译目标系统的实际的包,和Linux内核。
toolchain
用来编译打包中使用到的C交叉编译器和C标准库组件。
这个区域将用来编译仅跑在你主机上的程序(例如:C交叉编译器)以及设计的跑在目标机器上的链接库,例如uClibc, libm, pthreads等等。
dl
“download” 的缩写,从 feeds.conf 指定的仓库下载的 package 和 feed 中 Makefile 中指定版本的各种源码包。
在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是会自动安装在所编译的固件中,也就是我们 make menuconfig 的时候,为固件配置的一些软件包。
如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。
编译时,会将软件包解压到 build_dir 目录下。
为了减少编译时间,先将需要的依赖放进去。
feeds
openwrt的附加软件包管理器的扩展包索引目录。
就是下载管理软件包的。
如要下载其他的软件包,需打开源码根目录下面的feeds.conf.default文件,去掉相应软件包前面的#号,然后更新源
build_dir
用于保存在build_dir目录中编译完成的软件,和build_dir有同样的子目录结构。
比如,在target-XXX文件夹中保存了目标平台编译好的头文件,库文件。在我们开发自己的ipk文件时,编译过程中,预处理头文件,链接动态库,静态库都是到这个子文件夹中。
.
└── host
└── target-arm_cortex-a7_musl-1.1.16_eabi
└── toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi
1
2
3
4
staging_dir/host:
该文件夹是一个微型的Linux 根目录,有自己的目录bin/, lib/等等。这是主机工具安装的位置,构建系统的其余部分会将该区域的目录前缀到环境变量PATH中。
它包含用来构建固件的C交叉编译器。
可以用该编译器在OpenWRT之外编译一个可以加载到固件中的简单的C程序。这个C编译器一般是这样:staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc。
可以看到CPU、C库和编码到其中的gcc的版本号;并且允许多目标同时在一起构建。
staging_dir/target:
包含每个目标包已安装的版本;根目录形式,包含bin/, lib/等等,并且将会变成实际的根目录,仅作出一些调整就会打包进固件镜像中,像root-ar71xx之类的。
这里也有一些其它的文件在其中,主要生成软件包和开发软件包。
————————————————
版权声明:本文为CSDN博主「须莫及」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43882328/article/details/128808363
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/4383.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~