1-OpenWrt编译过程-1

前言:接触 op 已达四年,今年开始梳理整体所学,具体还参考了佐大的视频,对 op 缺乏系统知识的可以尝试,总体而言官方文档和源码是最好的教程

文章目录

  • OpenWrt编译过程
    • OpenWrt编译环境目录
      • 目录
      • 编译之前
      • 编译后新增加
        • bin
          • dtbs
        • build_dir
          • host
          • target
          • toolchain
        • dl
        • feeds
        • build_dir

OpenWrt编译过程

OpenWrt的第一步就是编译,将 OpenWrt 编译环境目录与具体的编译过程两者进行结合说明,本文先讲解的是编译环境目录

OpenWrt 就是由脚本和 Makefile 文件构成的

  1. toolchain
  2. build kernel + 用户态
  3. 创建 rootfs 即根文件(库+程序)
  4. 创建 image(kernel+rootfs, rootfs一般使用 squashfs 和 romfs, 一般使用 romfs 时可以直接加载到 kernel)

OpenWrt编译环境目录

目录

make时产生

  1. bin:编译后的文件
  2. build_dr:在此编译程序
  3. dl:code
  4. feeds:第三方package
  5. 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

编译后新增加

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目录中编译完成的软件
bin

保存编译完成后的二进制文件,包括:完整的 bin 文件、所有的 ipk 文件。

.../bin$ tree -d
.
└── ipq
    ├── debug
    │   └── modules # 驱动模块文件
    ├── dtbs 
    ├── img # 内核镜像
    └── packages # pack包
        ├── adsprpc
		...
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
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

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之类的。
  • 这里也有一些其它的文件在其中,主要生成软件包和开发软件包。

你可能感兴趣的:(OpenWrt,linux,服务器,网络)