05
2023
09
21:26:13

1-OpenWrt编译过程-1

官方文档和源码是最好的教程。

文章目录

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




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/4383.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: