Openwrt实践过程--目录结构

1.概述

构建嵌入式系统通常比较繁琐,需要交叉工具链、bootloader、kernel、文件系统等,众多软件包多为开源软件,经常出现互相依赖和不兼容、软件包的配置五花八门,内核和软件补丁需要手动安装,Openwrt系统是一个高度模块化、高度自动化的嵌入式Linux系统构建项目。支持各种处理器架构。无论是对ARM,X86,PowerPC或者MIPS都有很好的支持。多大3000多种软件包包括从工具链(toolchain),到内核(Linux kernel),到软件包(packages),再到根文件系统(rootfs)整个体系。模块化设计也可以方便的移植各类功能到Openwrt下,加快开放速度。

2.源码目录

包含config,include,package,scripts,target,toolchain,tools

config:存放着系统配置文件。
include:包含主要的Makefiles和编译规则。由其它Makefile包含。例如软件包Makefile定义需要包含package.mk。
package:包含OpenWrt提供的所有基本包。每个软件包包含软件包的Makefile。OpenWrt定义了一套Makefile模板,每个软件包参照这个
          模板定义了自己的信息,例如软件包名称、版本、下载地址、编译方式、安装目标等。其中包含的feeds目录为第三方软件包,通过
         ./scripts/feed update -a和./scripts/feed install -a的软件包也会存放在这个目录之中。
scripts:包括配置脚本,补丁脚本,软件源脚本。使用了shell、python、perl等多种脚本语言编写。编译过程中,使用到的脚本也统一放在
         这个目录中,软件包feed源安装脚本也放在这个目录。
target:定义供应商平台文件和镜像工具。包含不同平台固件映像产生过程和内核编译描述,编译内核和固件映像的工具,固件生成器。
toolchain:包括内核头文件,C库,交叉编译器,调试器。如binutils、gcc、glibc等。
tools:获取代码和编译时使用的主机端工具。编译时,主机需要使用一些工具软件,例如autoconfig、automake等,这个目录包含了获取
       和编译这些工具的命令,系统构建的第一步就是获取和编译这些软件包。

获取所有最新的包定义feeds.conf.default,会生成feeds目录以及staging_dir/host/bin目录会有执行文件如awk等

执行./scripts/feeds update -a

从/feeds目录安装所有软链接到package/feeds目录

执行./scripts/feeds install -a

3.根目录

包含Makefile,rule.mk,Config.in,feeds.conf.default,LICENSE,README,.config

Makefile:在顶层目录执行make命令的入口文件。
rules.mk:定义了Makefile中使用的一些通用变量和函数。每个软件包都需要包含此文件。
Config.in:菜单配置。和make menuconfig相关联的文件。
feeds.conf.default:下载第三方一些软件包时所使用的地址。./scripts/feeds update时使用
LICENSE:软件许可。
README:软件基本说明。其中README描述了编译软件的基本过程和依赖文件。
.config:OpenWrt配置文件。编译时使用此文件进行目标配置。

4.编译后生成目录

包含bin,build_dir,staging_dir

bin:存放最终生成的固件映像和所有ipk 包文件(bin/xxxx/packages)。
build_dir:编译时的临时文件以及提取的源代码。
staging_dir:编译环境包括常见的头文件和工具链。
build_dir/host:是一个临时目录,用于存储不依赖于目标平台的工具。
build_dir/toolchain-<arch>*:用于存储依赖于指定平台的编译链。
build_dir/target-<arch> *:包源码目录。
build_dir/linux-<platform>:包含内核解压后的源码。
staing_dir/toolchain-<arch>*:是编译链的最终安装位置。
feeds:所有可选软件包由openwrt或thirdparty提供。这些包不是在主分支中维护的,由第三方维护,用于扩展基本系统
       的功能。当执行./script/feeds update -a命令时,会从feed.conf.default配置文件指定的路径进行下载(实际上是索引)。
       当menuconfig中选择对应的package后,进行make时,会根据package的makefile中描述的地址,下载对应的
       packages,packages打包文件被下载到dl目录。
package/feeds:<buildroot>/feeds/下packages的连接。当执行.scripts/feeds install –a后生成

5.问题总结

5.1 依赖问题

现象:make[2]: *** No rule to make target ‘package//host/compile’, needed by ‘package/cson/compile’. Stop.
解决方法:找到对应的依赖package/cson/Makefile文件中的DEPENDS变量对于的包的依赖关系是否可以编译成功,一步步排查即可知道还有哪些包为编译成功。

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/104963140