(一)openwrt源码目录概述

前言

这段时间老是在和openwrt打交道,以前也零零散散地写过一点,仍是但愿能有点体系。还记得我刚看到源代码的时候,以为无从下手.我想从Makefile的整个执行过程入手,搞清楚编译源代码的几个小时中,到底发生了哪些故事.
本文是这个系列的第一篇.主要讲一下我对openwrt整个目录结构的理解.咱们将源代码从官方下载而来的目录称之为原始目录,将编译后生成的目录称之为生成目录,分两部分介绍各个目录.python


原始目录

下载源码后,源文件以下图所示,下面咱们来一一解释;
原始目录bash

1. scripts

存放了一些脚本,使用了bash,python,perl等多种脚本语言.编译过程当中,用于第三方软件包管理的feeds文件也是在这个目录当中.在编译过程当中,使用到的脚本也统一放在这个目录中.服务器

2. tools

编译时,主机须要使用一些工具软件,tools 里包含了获取和编译这些工具的命令.软件包里面有Makefile文件,有的还包含了patch.每一个Makefile当中都有一句$(eval $(call HostBuild)),这代表编译这个工具是为了在主机上使用的.markdown

3. config

存放着整个系统的配置文件网络

4. docs

包含了整个宿主机的文件源码的介绍, 里面还有Makefile为目标系统生成docs.使用make -C docs/能够为目标系统生成文档.函数

5. toolchain

嵌入式的童鞋应该都知道交叉编译链,这个文件中存放的就是编译交叉编译链的软件包.包括:binutils,gcc,libc等等.工具

6. target

openwrt的源码能够编译出各个平台适用的二进制文件,各平台在这个目录里定义了firmware和kernel的编译过程。学习

7. package

存放了openwrt系统中适用的软件包,包含针对各个软件包的Makefile。openwrt定义了一套Makefile模板.各软件参照这个模板定义了本身的信息,如软件包的版本、下载地址、编译方式、安装地址等。在二次开发过程当中,这个文件夹咱们会常常打交道.
事实上,经过./scripts/feed update -a和./scripts/feed install -a的软件包也会存放在这个目录之中.ui

8. include

openwrt的Makefile都存放在这里。文件名为 *.mk 。这里的文件上是在Makefile里被include的,相似于库文件.这些文件定义了编译过程.code

9. 其余

主要目录就是前面说起的8个,剩下的是单个文件.

9.1 Makefile:

在顶层目录执行make命令的入口文件.

9.2 rules.mk

定义了Makefile中使用的一些通用变量和函数

9.3 Config.in

include/toplevel.mk中咱们能够看到,这是和make menuconfig相关联的文件.

9.4 feeds.conf.default

是下载第三方一些软件包时所使用的地址

9.5 LICENSE & README

即软件许可证和软件基本说明.其中README描述了编译软件的基本过程和依赖文件.

至此咱们把原始目录大体浏览了一遍,下面咱们看看生成目录.

生成目录

在咱们编译完成后除了下载的源码文件,多出来的部分很明显就是编译过程当中新生成的.以下图:
生成目录

1. feeds

openwrt的附加软件包管理器的扩展包索引目录.有点绕,简单来讲就是下载管理软件包的.默认的feeds下载有packages、management、luci、routing、telephony。如要下载其余的软件包,需打开源码根目录下面的feeds.conf.default文件,去掉相应软件包前面的#号,而后更新源:
./scripts/feeds update -a
安装下载好的包:
./scripts/feeds install -a

2. build_dir

在前面的原始目录中,咱们提到了host工具,toolchain工具还有目标文件.openwrt将在这个目录中展开各个软件包,进行编译.因此这个文件夹中包含3个子文件夹:

2.1 host

在该文件夹中编译主机使用的工具软件

2.2 toolchain-XXX

在该文件夹中编译交叉工具链

2.3 target-XXX

在此编译目标平台的目标文件,包括各个软件包和内核文件.

3. bin

保存编译完成后的二进制文件,包括:完整的bin文件,全部的ipk文件.

4. dl

在编译过程当中使用的不少软件,刚开始下载源码并无包含,而是在编译过程当中从其余服务器下载的,这里是统一的保存目录

5. staging_dir

用于保存在build_dir目录中编译完成的软件.因此这里也和build_dir有一样的子目录结构.
好比,在target-XXX文件夹中保存了目标平台编译好的头文件,库文件.在咱们开发本身的ipk文件时,编译过程当中,预处理头文件,连接动态库,静态库都是到这个子文件夹中.

6.tmp

从名字来看,是临时文件夹.在编译过程当中,有大量中间临时文件须要保存,都是在这里.

7.logs

这个文件夹,有时能够看到,有时没有.这是由于这个文件夹保存的是,编译过程当中出错的信息,只有当编译出错了才会出现.咱们能够从这里获取信息,从而分析咱们的软件编译为何没有完成.

至此咱们把openwrt的目录结构大致浏览了一遍.

尾记

  1. 本文中很多内容都是从网上看到的,时间长了,我已经找不到出处了.这也是我写博客的一个缘由,我从互联网学到很多知识,如今再反馈给网络.感谢全部有自由共享精神的朋友.
  2. 知识学习是不断递进的过程.这部分知识是我目前知道的一个大概,还不够深入.更深刻的学习Makefile和openwrt以后,再来慢慢更新.
相关文章
相关标签/搜索