openwrt顶层Makefile分析
转:openwrt框架分析
转:openwrt框架分析本⽂是本⼈对OpenWrt的Makefile的理解,并⾮转载。
OpenWrt是⼀个典型的嵌⼊式Linux⼯程,了解OpenWrt的Makefile的⼯作过程对提⾼嵌⼊式Linux⼯程的开发能⼒有极其重要意义。
OpenWrt的主Makefile⽂件只有100⾏,可以简单分为三部分,1~17⾏为前导部分,19~31为⾸次执⾏部分,33~101为再次执⾏部分。
前导部分CURDIR为make默认变量,默认值为当前⽬录。
前导部分主要把变量TOPDIR赋值为当前⽬录,把变量LC_ALL、LANG赋值为C,并使⽤变量延伸指⽰符export,把上述三个变量延伸到下层Makefile。
使⽤⽂件使⽤指⽰符include引⼊$(TOPDIR)/include/host.mk。
在OpenWrt的主Makefile⽂件使⽤了多次include指⽰符,说明主Makefile⽂件被拆分成多个⽂件,被拆分的⽂件放在不同的⽬录。
拆分的⽬的是明确各部分的功能,⽽且增加其灵活性。
在前导部分⽐较费解的是使⽤world⽬标,在makefile中基本规则为:TARGETS : PREREQUISITESCOMMAND...即makefile规则由⽬标、依赖、命令三部分组成,在OpenWrt的主Makefile⽂件的第⼀个⽬标world没有依赖和命令。
它主要起到指⽰当make命令不带⽬标时所要执⾏的⽬标,没有设定依赖和命令部分表明此⽬标在此后将会有其他依赖关系或命令。
world⽬标的命令需要进⼀步参考$(TOPDIR)/include/toplevel.mk和主Makefile⽂件的再次执⾏部分。
⾸次执⾏部分OPENWRT_BUILD是区分⾸次执⾏与再次执⾏的变量。
在⾸次执⾏时使⽤强制赋值指⽰符override把OPENWRT_BUILD赋值为1,并使⽤变量延伸指⽰符export把OPENWRT_BUILD 延伸。
openwrt简单ipk生成及Makefile解释
openwrt简单ipk生成及Makefile解释1.创建helloworld项目首先我们新建helloworld.c文件和对应的Makefile文件$mkdir -p ~/temp/hellworld/src $cd ~/temp/helloworld/src $touch helloworld.c Makefile 如下为helloworld.c的内容:1 2 3 4 5 6 #include <stdio.h>int main(){printf("This is my helloworld!\n"); return 0;}如下为Makefile文件的内容:1 2 3 4 5 6 7 8 9 helloworld : helloworld.o$(CC) $(LDFLAGS) helloworld.o -o helloworldhelloworld.o : helloworld.c$(CC) $(CFLAGS) -c helloworld.cclean :rm *.o helloworld$(CC): 这个值由其他Makefile文件规定,表示我们使用编译器. \$(LDFLAGS)\&$(CFLAGS) : 这个表示编译器的一些选项,这里是可选的,去掉也没有问题. 下面可以输入$make看看有没有问题,注意Makefile文件的书写格式. 最后,输入$make clean来清理掉生成的二进制文件.因为上一步make所使用的编译器并不是我们的交叉编译链,生成的二进制文件并不能在开发板中运行.上一步只是验证我们的src 中的内容正确与否. 2.创建helloworld包下一步我们要创建一个新的Makefile文件,在这个文件中我们要描述的是helloworld包的信息,比如:如何配置,如何编译,如何打包,安装位置等. $cd ~/temp/helloworld $touch Makefile 如下为Makefile内容:1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031 include $(TOPDIR)/rules.mkPKG_NAME:=helloworldPKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/helloworldSECTION:=utilsCATEGORY:=UtilitiesTITLE:=Helloworld -- prints a snarky messageendefdefine Package/helloworld/descriptionIt's my first package demo.endefdefine Build/Prepareecho "Here is Package/Prepare"mkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Package/helloworld/installecho "Here is Package/install"$(INSTALL_DIR) $(1)/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/endef$(eval $(call BuildPackage,helloworld))如下是最后的文件树形图:3.Makefile注释第1行include $(TOPDIR)/rules.mk : 一般在Makefile的开头,包含了包的基本信息,比如Makefile中的$(BUILD_DIR),$(INCLUDE_DIR),$(CP),$(INSTALL_DIR),$(INSTALL_BIN)都是这里定义的.具体内容可以到源码主目录下,查看rules.mk文件. 3~5行,软件包的信息均以“PKG_”开头,其意思和作用如下: PKG_NAME:软件包名称,将在menuconfig和ipkg可以看到。
OpenWRT开发之——研究包的Makefile
OpenWRT开发之——研究包的Makefile 摘要: 本⽂将与⼤家⼀起来研究OpenWrt包的Makefile格式以及其⼯作原理本⽂将带⼤家⼀起深⼊地学习⼀下OpenWrt包的 Makefile。
我们不仅要知其然,还要知其所以然。
在上篇博⽂⾥,包⾥的 Makefile 内容如下:include $(TOPDIR)/rules.mkPKG_NAME:=helloworldPKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/helloworldSECTION:=utilsCATEGORY:=UtilitiesTITLE:=Helloworld -- prints a snarky messageendefdefine Package/helloworld/descriptionIt's my first package demo.endefdefine Build/Prepareecho "Here is Package/Prepare"mkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Package/helloworld/installecho "Here is Package/install"$(INSTALL_DIR) $(1)/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/endef$(eval $(call BuildPackage,helloworld))⼤概我们可以将简代为如下的结构:include $(TOPDIR)/rules.mk# 这⾥定义⼀系列的 PKG_XXinclude $(INCLUDE_DIR)/package.mk# 定义各种 Package, Build 宏$(eval $(call BuildPackage,包名))下⾯,我们来⼀⼀拆解。
OPENWRT编译与其MAKEFILE
核心出品必属精品免费下载OpenWrt编译环境搭建和编译方法一、更新开发系统。
安装完ubuntu后,重新开机的时候,会有一个VMware tools安装的提示界面,耐心等待,等到VMware tools安装好后因为更新系统和安装一些工具包需要用到网络,所以进入ubuntu的界面后,将ubuntu的网络设置为NAT网络连接模式(默认为NAT),以上就绪后,更新开发系统的软件1、首先备份Ubuntu10.04源列表sudo cp/etc/apt/sources.list/etc/apt/sources.list.backup(备份下当前的源列表)2、修改更新源sudo gedit/etc/apt/sources.list(打开Ubuntu11.10源列表文件)3、使用/pobenliu/blog/item/2180dc3502933c375bb5f5a5.html网站下的一个更新源贴到sources.list文件中(“#”开头的那一行为注释,可以直接复制进文件中),使用这里的源主要是为了提高下载速度,用官方的会比较慢。
4、通知ubuntu启用新的更新源sudo apt-get update二、安装编译OpenWrt需要用到的软件包:命令如下:sudo apt-get install g++libncurses5-dev zlib1g-dev bison flex unzip autoconf gawk unzip make gettext gcc binutils patch asciidoc bzip2libz-dev libc6-dev linux-headers-2.6.32-38注意,红色部分的版本根据自己的内核版本来修改,可以通过uname–a来查看。
三、安装svn。
由于在后面需要用到svn来下载OpenWrt,所以需要先安装svn。
由于使用命令sudo apt-get install subversion来安装的版本最新也只是1.6.6版本,为了和windows上的版本同步,所以需要下载安装包,进行手工安装。
OpenWrt的主Makefile工作过程
OpenWrt的主Makefile工作过程
1. 系统架构检测和配置:主Makefile首先检测目标系统的架构,并根据架构选择适当的配置文件进行初始化。
这些配置文件定义了目标系统的基本参数,如指令集架构、处理器类型和操作系统版本等。
2. 基本环境变量设置:主Makefile设置一些基本的环境变量,如路径和编译器选项等。
这些环境变量使构建系统能够正确地找到所需的工具链和库文件,并以正确的方式进行编译和链接。
3. 目标设备配置:主Makefile根据配置文件中的设备描述,自动选择适当的软件包和功能,并生成相应的配置文件。
这些配置文件包含了构建系统所需的各种变量、选项和依赖关系。
5. 依赖关系解析:主Makefile会分析软件包的依赖关系,并按照正确的顺序构建软件包。
它会检查每个软件包的依赖关系,并确保它们被正确地编译、链接和安装。
6. 配置和编译:主Makefile会调用每个软件包的Makefile,并根据配置文件中的选项进行配置和编译。
这些软件包的Makefile定义了软件包的构建过程和依赖关系。
7. 安装和打包:一旦所有软件包都被编译成功,主Makefile会使用安装规则将生成的文件安装到目标系统的相应位置。
它还负责生成最终的固件映像文件,该文件可以被刷入目标设备的闪存中。
8. 清理和卸载:主Makefile提供了清理和卸载的目标,用于清除构建过程中生成的中间文件和目标文件。
这些目标可以帮助用户在构建系统中进行调试和优化。
OpenWRT编译与其Makefile
OpenWrt编译与加入软件包道墨.baidu2011/12/25因为之前要在项目中加入一些新功能,所以学习了OPENWRT和PACKAGE/MAKEFILE。
写下此文以作总结。
一、简介OpenWrt是一个基于Linux的开源嵌入式操作系统,其在linux上进行深入的定制,加入大量网络应用和管理界面,使其广泛应用于路由器中。
我们的项目是基于OpenWrt开发的,故其系统框架是相同的。
二、OpenWrt编译编译流程a)安装Linux系统;b)安装编译所需的各种工具;c)通过Subversion版本库获得源代码;d)更新并安装package feeds;e)创建一个默认配置以检查编译环境是否搭建好了;f)用menuconfig来配置要加入固件中的软件包;g)最后开始编译固件和清理工作。
a)首先要安装一个Linux 系统,建议使用Ubuntu(以下以Ubuntu为例),安装教程,可看官方wiki:/%E9%A6%96%E9%A1%B5b)需安装如下工具:i.升级Ubuntu软件包sudo apt-get updateii.安装所需的工具sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils libncurses5-dev ncurses-term zlib1g-dev gawk asciidoc libz-deviii.OpenWrt使用Subversion作为版本控制软件,现在也支持gitsudo apt-get install subversionc)然后要从Subversion代码库上下载代码,目前有各个稳定版、开发版:i.Backfire 10.03稳定版:svn co svn:///OpenWrt/branches/backfireii.Kamikaze 8.09版:svn co svn:///OpenWrt/branches/8.09iii.Kamikaze 7.09版:svn co svn:///OpenWrt/tags/kamikaze_7.09 目前Kamikaze版本已经不再维护,不建议下载,虽然我们的项目最开始就是基于Kamikaze 7.09开发的iv.开发版:svn co svn:///OpenWrt/trunk/开发版是稳定版的基础上进行的开发,其中会加入许多最新的功能,能支持更多硬件,建议下载d)下面以开发版truck为例,svn下载代码比较慢,一般需好几个小时下载完成后,cd truck文件夹中,因为我们下下来的代码中只包含了最基本的模块,还需下载扩展的Feeds;Feeds即为包含到你的OpenWrt环境中的额外软件包的索引。
openwrt makefile规则
openwrt makefile规则在OpenWrt中,Makefile文件用于构建和编译软件包。
Makefile规则指定了软件包的构建和安装过程。
以下是OpenWrt Makefile规则的一些常见选项和指令:1. `include $(TOPDIR)/rules.mk`:包含OpenWrt的全局规则,定义了常用的编译选项和目标。
2. `PKG_NAME`:定义软件包的名称。
3. `PKG_VERSION`:定义软件包的版本号。
4. `PKG_RELEASE`:定义软件包的发布版本。
5. `PKG_MAINTAINER`:定义软件包的维护者信息。
6. `PKG_LICENSE`:定义软件包的许可证。
7. `PKG_BUILD_DIR`:定义软件包的构建目录。
8. `include $(INCLUDE_DIR)/package.mk`:包含OpenWrt的软件包规则,定义了软件包的构建和安装过程。
9. `define Package/$(PKG_NAME)`:定义软件包的相关信息,如名称、版本、描述等。
10. `define Package/$(PKG_NAME)/description`:定义软件包的描述信息。
11. `define Build/Compile`:定义软件包的编译过程。
12. `define Package/$(PKG_NAME)/install`:定义软件包的安装过程。
13. `$(INSTALL_DIR)`:创建目录。
14. `$(CP)`:复制文件。
15. `$(INSTALL_BIN)`:安装二进制文件。
16. `$(INSTALL_DATA)`:安装数据文件。
17. `$(INSTALL_CONF)`:安装配置文件。
18. `$(STRIP)`:去除二进制文件的调试信息。
19. `$(1)/$(PKG_BUILD_DIR)`:软件包的构建目录。
20. `$(1)/$(PKG_INSTALL_DIR)`:软件包的安装目录。
MakeFile详解
引用其它的Makefile-实例
有这样几个Makefile:a.mk、b.mk、c.mk,还有 一个文件叫foo.make,以及一个变量$(bar),其 包含了e.mk和f.mk,那么,下面的语句: include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk
在大多数时候,由于源文件太多,编译生成的中间目标文 件太多,而在链接时需要明显地指出中间目标文件名,这
对于编译很不方便,所以,通常要给中间目标文件打个包,
在Windows 下这种包叫“库文件”(Library File),也就 是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。
定义变量和引用变量
变量的定义和应用与Linux环境变量一样,变量名 要大写,变量一旦定义后,就可以通过将变量名 用圆括号括起来,并在前面加上“$”符号来进行 引用。 变量的主要作用: 1、保存文件名列表 2、保存可执行命令名,如编译器 3、保存编译器的参数 变量一般都在makefile的头部定义。按照惯例, 所有的makefile变量都应该是大写。
者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正
确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应 该对应于一个中间目标文件(O 文件或是OBJ 文件)。
孙钦东
程序的编译和链接
链接时,主要是链接函数和全局变量。链接器并不管函数
所在的源文件,只管函数的中间目标文件(Object File)。
clean: -rm -f $(EXEC) *.elf *.gdb *.o
OpenWrt编译过程
make world
prepare-tmpinfo make prereq .config
make tmp/.prereq-build $(target/stamp-prereq) make V=s -r -s prereq tmp/.prereq_packages
$(tools/stamp-install)
执行编译 对每个软件包执行下载 软件包源代码包、解 包、打补丁、编译、安 装,逐一处理,直至处 理完所有的软件包
相当于执行tools目录下各个子目录 Makefile文件中的install目标
make -s world
prepare $(toolchain/stamp-install) $(target/stamp-compile) compile
相当于执行toolchain目录下各个子 目录Makefile文件中的install目标
configure
相当于执行target目录下各个子目录 Makefile文件中的compile目标
$(package/stamp-compile) $(package/stamp-install) $(target/stamp-install)
相当于执行package目录下各个子目 录Makefile文件中的compile目标
执行编译前准备
检查顶层目录下 是否有.config 文件 仅仅第一次编译时会执行: make -f $(TOPDIR)/include/prereq-build.mk prereq 主要是执行prereq-build.mk中定义的类似 “define Require/”这样的函数,对编译主机 编译OpenWrt所需要的各种工具程序进行检查, 打印“Checking ”信息
openwrt makefile 动态库 编写模板
标题:OpenWRT Makefile动态库编写模板一、概述OpenWRT是一个针对嵌入式设备的Linux发行版,它提供了一个框架,可以方便地为各种路由器、网关和嵌入式设备构建自定义的固件。
其中,Makefile是用来构建OpenWRT软件包的一种工具,通过Makefile可以定义软件包的源代码、依赖关系以及编译规则。
在OpenWRT项目中,动态库的编写相对较为复杂,因此需要一个模板来帮助开发者更快地编写和配置动态库的Makefile。
二、动态库概述1. 动态库是一种可以被应用程序动态加载的共享库,它使得应用程序可以在运行时信息并调用库中的函数。
与静态库相比,动态库的大小更小,且可以在多个应用程序之间共享,为了在OpenWRT项目中使用动态库,必须在Makefile中正确配置相关参数。
三、OpenWRT Makefile动态库编写模板下面是一个针对OpenWRT项目中动态库的Makefile编写模板:```makeinclude $(TOPDIR)/rules.mkPKG_NAME:=your-library-namePKG_VERSION:=1.0.0PKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) include $(INCLUDE_DIR)/package.mkdefine Package/your-library-nameSECTION:=libsCATEGORY:=LibrariesTITLE:=Your library titleDEPENDS:= +libpthread +librtendefdefine Package/your-library-name/descriptionYour library descriptionendefdefine Build/Preparemkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Build/Compile$(MAKE) -C $(PKG_BUILD_DIR)/endefdefine Package/your-library-name/install$(INSTALL_DIR) $(1)/usr/lib$(INSTALL_BIN) $(PKG_BUILD_DIR)/your-library.so$(1)/usr/lib/endef$(eval $(call BuildPackage,your-library-name))```在上面的示例中,需要将"your-library-name"替换为实际的动态库名称,"your-library-title"替换为实际的标题,"your-library-description"替换为实际的描述,"./src/*"替换为实际的源代码路径,"your-library.so"替换为实际的动态库文件名。
openwrt下面创建package之Makefile模版
openwrt下面创建/添加package----Makefile模版分类:linux openwrt makefile 创建添加packageby:韩大卫@吉林师范大学**********************进入openwrt/package/,mkdir eep以eep为示例cd eepmkdir src把代码放在src下面,src 中中的makefile 是用特定的交叉编译器编译自己的代码。
同在eep 下面还有一个Makefile ,这个makefile 是openwrt 用来查找,添加,编译这个目录(eep)的。
编译后的的内容会出现的这个系统中。
编译自己的package, 把下面Makefile 中的eep 换成自己目录名字即可。
********************************这个Makefile 是openwrt/package/eep 下面的。
**********************************include $(TOPDIR)/rules.mkPKG_NAME:=eepPKG_VERSION:=5.0PKG_RELEASE:=1PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/$(PKG_NAME)SECTION:=utilsCATEGORY:=UtilitiesTITLE:=eep -- i2c general programMAINTAINER:=handaweiendefdefine Package/$(PKG_NAME)/descriptioni2c general programendefdefine Build/Preparemkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Package/eep/install$(INSTALL_DIR) $(1)/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/eep $(1)/bin/endef$(eval $(call BuildPackage,eep))******************************************下面是src 中的makefile********************************************OBJECTS = eepall : $(OBJECTS)PKG_NAME=docseep: main.o i2c.o$(CC) $(LDFLAGS) $^ -o $@i2c.o:i2c.c$(CC) $(CFLAGS) -c $<main.o:main.c$(CC) $(CFLAGS) -c $<.PHONY:cleanclean:@-rm *.o eep*****************************************把eep换成自己的目录名字即可。
openwrt makefile编译流程 -回复
openwrt makefile编译流程-回复OpenWrt是一个针对嵌入式设备的嵌入式操作系统,它提供了一个基于Linux的操作环境,可以在各种路由器和其他嵌入式设备上运行。
编译OpenWrt的makefile是一个重要的步骤,本文将一步一步回答有关OpenWrt makefile编译流程的问题。
Makefile是一个包含了一系列编译和链接规则的文本文件,用于指导编译器将源代码转换为可执行文件或库文件。
编译OpenWrt的makefile可以根据用户需求进行修改和优化,在原始的OpenWrt系统上添加或删除模块。
一、准备环境编译OpenWrt的第一步是确保系统环境的准备工作已经完成。
在Linux 系统上编译OpenWrt需要以下环境:1. 软件包管理器:OpenWrt使用opkg来管理软件包,确保已经安装了opkg。
2. 构建工具链:OpenWrt需要安装适当的构建工具链,可以通过安装gcc 等相关工具来满足这一需求。
3. 源代码:从OpenWrt官方网站下载源代码,并在本地解压缩。
二、配置makefile1. 打开终端并进入源代码目录,可以使用cd命令来切换目录。
2. 运行make menuconfig命令,配置编译选项。
该命令将打开一个基于文本的界面,用于选择编译参数。
在该界面中可以选择要编译的软件包、目标设备、内核选项、文件系统等。
根据需要进行配置,并保存修改。
三、编译makefile1. 执行make命令,开始编译过程。
此时,make工具将根据makefile 中的规则,递归地编译源代码,并生成可执行文件和库文件。
2. 等待编译完成,时间长度取决于系统配置和编译内容的庞大程度。
四、安装编译结果1. 编译完成后,可以在目标目录中找到编译生成的文件。
默认情况下,编译结果位于./bin/目录下。
可以使用ls命令来查看生成的文件列表。
2. 将编译生成的文件安装到目标设备上。
通过scp命令将文件复制到目标设备上,然后运行相应的命令进行安装。
海思makefile结构解析
海思makefile结构解析全文共四篇示例,供读者参考第一篇示例:海思芯片是一家领先的半导体公司,在国际市场上拥有广泛的市场份额。
海思芯片的产品广泛应用在手机、网络通信、物联网、智能家居等领域,其芯片性能卓越,在同行业内享有很高的声誉。
在海思芯片的开发中,makefile是一个非常重要的工具,它负责管理整个项目的编译、链接和部署过程,帮助开发人员更高效地完成工作。
makefile是一个用于自动化编译的脚本文件,通过编写makefile 文件,可以告诉计算机如何编译源代码,生成可执行文件。
海思makefile结构解析主要包括以下几个部分:1. 定义变量:在makefile中定义变量是非常重要的,可以方便地管理项目的路径、编译参数等信息。
海思makefile中通常会定义一些常用的变量,比如CC表示编译器的路径,CXX表示C++编译器的路径,CFLAGS表示编译参数等。
通过定义这些变量,可以在整个makefile中直接引用,减少了代码的冗余,提高了代码的可维护性。
2. 设置编译规则:在makefile中,通常会定义一些编译规则,告诉make工具如何编译源文件和生成可执行文件。
海思makefile中的编译规则通常使用模式匹配的方式,比如"%.c:%.o"表示将所有的.c文件编译为.o文件,而"%.o:%.c"则表示将所有的.o文件根据对应的.c文件进行重新编译。
通过这些编译规则,make工具可以根据需要自动化地完成整个项目的编译过程。
3. 定义目标:在makefile中通常会定义一些目标,这些目标可以是编译生成可执行文件的命令,也可以是清理生成的临时文件的命令。
海思makefile中的目标通常包括all、clean、install等,通过定义这些目标,可以方便地管理整个项目的编译和部署过程。
4. 调用外部工具:在海思makefile中,通常会调用一些外部工具来完成一些特定的任务,比如编译器、链接器、打包工具等。
OpenWRT开发之——目录分析与make过程
OpenWRT开发之——目录分析与make过程摘要: 本博文简单讲解一下OpenWrt下各目录与make过程的内容OpenWrt 目录下的 trunk 结构如下:[trunk]$ lsbin/ Config.in feeds.conf.default rules.mk tmp/BSDmakefile dl/ include/ scripts/ toolchain/build_dir/ docs/ LICENSE package/ staging_di r/ tools/config/ feeds/ Makefile README target/1.目录介绍有几个重要目录:package, target, build_dir, staging_dir, bin, dl, ...---include 目录是存放*.mk 文件。
这里的文件上是在Makefile 里被include的---build_dir/host 目录是建立工具链时的临时目录---build_dir/toolchain-<arch>* 对应硬件的工具链的目录---staging_dir/toolchain-<arch>* 是工具链的安装位置---target/linux/<platform> 目录里面是各个平台(arch)的相关代码---target/linux/<platform>/config-3.10 文件就是配置文件了---dl 目录是'download'的缩写, 在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。
如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。
编译时,会将软件包解压到build_dir目录下。
openwrt make kernel_menuconfig命令的实现机制
openwrt make kernel_menuconfig命令的实现机制OpenWrt是一个专门为嵌入式设备设计的开源操作系统,它具有高度自定义性的特点。
在进行OpenWrt的自定义配置时,需经常使用到make kernel_menuconfig命令,即在内核配置菜单中对内核选项进行编辑。
实现机制如下:一、Makefile在OpenWrt源码的目录下经常出现名为Makefile的文件,它是Make自动化工具的一个文件,用于指导编译器以及链接器如何进行编译和链接操作。
通过对该文件的修改,可以对编译行为进行自定义。
二、Kernel_makefile在Makefile中有一个名为Kernel_makefile的文件,它是OpenWrt为内核锅炉定制的一个Makefile文件。
通过Kernel_makefile,可以实现内核的编译、调试以及配置等操作。
在Kernel_makefile中,使用obj-y变量指定内核源代码文件的编译方式以及参与编译的文件。
三、Kernel_menuconfigKernel_menuconfig是OpenWrt提供的一个菜单项,用于对内核选项进行编辑。
使用make kernel_menuconfig命令即可进入内核配置菜单,可以对内核选项进行编辑和修改,这些修改会被保存至.config 文件中。
在菜单项中使用的内核选项也会保存至.config文件中,从而方便后续的内核编译。
四、.config文件.config文件是OpenWrt中用于保存内核配置选项的文件。
它是一个文本文件,可以手动编辑。
当通过make kernel_menuconfig命令修改内核选项时,所做的修改都会被保存至.config文件中。
五、编译内核当所有的内核选项修改完成后,需要执行make命令编译内核。
在编译内核时,会根据.config文件中的选项配置进行编译。
根据内核选项的不同,编译时间可能会较长。
综上所述,通过Makefile、Kernel_makefile、Kernel_menuconfig、.config文件和编译内核这五个步骤,就可以实现OpenWrt的内核选项配置。
编译内核模块的makefile解读
编译内核模块的makefile解读makefile是一种用于自动化编译和构建软件的文件,对于编译内核模块来说也是必不可少的。
makefile中定义了一系列规则和指令,通过这些规则和指令可以告诉编译器如何编译、链接和构建内核模块。
以下是一个编译内核模块的makefile的示例:```makefile# 指定内核模块的目标文件名obj-m := mymodule.o# 指定内核头文件的路径KDIR := /lib/modules/$(shell uname -r)/build# 编译指令all:$(MAKE) -C $(KDIR) M=$(PWD) modules# 清理指令clean:$(MAKE) -C $(KDIR) M=$(PWD) clean```makefile中的每一行都是一个规则,以下是对上述makefile的解读:第2行:指定了编译的目标文件名为mymodule.o。
这里的`.o`表示编译生成的是一个目标文件。
第5行:指定了内核头文件的路径。
`/lib/modules/$(shell uname -r)/build`是内核源码所在的路径,`uname -r`是一个命令,用于获取当前操作系统的内核版本。
第8行:定义了一个名为`all`的目标,用于编译内核模块。
`$(MAKE)`表示执行`make`命令,`-C`选项用于指定编译的路径,`M=$(PWD)`指定了`KDIR`路径外的文件所在的路径,`modules`表示编译的目标是内核模块。
第11行:定义了一个名为`clean`的目标,用于清理编译生成的文件。
`clean`规则通常包括删除所有生成的文件、临时文件和中间文件等。
通过执行`make`命令,可以编译内核模块并生成目标文件。
执行`make clean`命令可以清理编译生成的文件。
在编译内核模块时,除了makefile之外,还需要注意以下几点:1. 确保系统中已经安装了所需的内核源码和开发工具。
OpenWRT编译与其Makefile
核心出品必属精品免费下载OpenWrt编译环境搭建和编译方法一、更新开发系统。
安装完ubuntu 后,重新开机的时候,会有一个VMware tools 安装的提示界面,耐心等待,等到VMware tools 安装好后因为更新系统和安装一些工具包需要用到网络,所以进入ubuntu的界面后,将ubuntu的网络设置为NAT网络连接模式(默认为NAT),以上就绪后,更新开发系统的软件1、首先备份Ubuntu 10.04源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表)2、修改更新源sudo gedit /etc/apt/sources.list (打开Ubuntu 11.10源列表文件)3、使用/pobenliu/blog/item/2180dc3502933c375bb5f5a5.html网站下的一个更新源贴到sources.list文件中(“#”开头的那一行为注释,可以直接复制进文件中),使用这里的源主要是为了提高下载速度,用官方的会比较慢。
4、通知ubuntu启用新的更新源sudo apt-get update二、安装编译OpenWrt需要用到的软件包:命令如下:sudo apt-get install g++ libncurses5-dev zlib1g-dev bison flex unzip autoconf gawk unzip make gettext gcc binutils patch asciidoc bzip2 libz-dev libc6-dev linux-headers-2.6.32-38注意,红色部分的版本根据自己的内核版本来修改,可以通过uname –a 来查看。
三、安装svn。
由于在后面需要用到svn 来下载OpenWrt,所以需要先安装svn。
由于使用命令 sudo apt-get install subversion来安装的版本最新也只是1.6.6版本,为了和windows 上的版本同步,所以需要下载安装包,进行手工安装。
openwrt makefile 动态库 编写模板 -回复
openwrt makefile 动态库编写模板-回复如何编写OpenWrt的makefile来创建动态库。
一、什么是OpenWrt?OpenWrt是一个用于嵌入式设备的Linux发行版,专门用于路由器等网络设备。
它具有轻量级、高度可定制的特点,可以为嵌入式设备提供丰富的功能和灵活的配置。
OpenWrt使用makefile来管理和构建软件包和应用程序。
二、什么是makefile?makefile是一种用于自动构建应用程序的文件,其中包含了构建应用程序所需的编译、链接和安装等命令。
makefile中包含了一系列规则,用于指定如何构建目标文件、可执行文件和库文件等。
在OpenWrt中,makefile 用于构建软件包和应用程序。
三、为什么要创建动态库?动态库是可共享的库,可以在运行时被多个程序共同使用。
与静态库相比,动态库在内存中只需加载一次,可以减少系统资源占用。
因此,创建动态库可以提高应用程序的灵活性和性能。
四、编写makefile的基本结构在开始编写makefile之前,首先需要了解makefile的基本结构。
一个简单的makefile通常包含以下部分:1. 定义变量:可以使用变量来代表路径、目标文件等。
变量名通常使用大写字母。
2. 定义规则:规则指定目标文件如何生成和更新,包括依赖关系、命令和生成目标文件的方法。
3. 定义目标:目标指定要生成的文件,可以是可执行文件、库文件或任何其他文件。
五、创建动态库的makefile模板下面是一个创建动态库的makefile模板:# 定义变量TARGET = libexample.soSRCS = example.cOBJS = (patsubst .c, .o, (SRCS))# 定义规则(TARGET): (OBJS)(CC) -shared -o (TARGET) (OBJS).o: .c(CC) (CFLAGS) -fPIC -c < -oclean:rm -f (OBJS) (TARGET)上述makefile模板包含了以下部分:1. 定义了变量TARGET,用于指定生成的动态库文件名。
OpenWrt构建过程(主Makefile分析)
OpenWrt构建过程(主Makefile分析)玩了这么久的OpenWrt,最近详细研究了⼀下整个⼯程的构建过程,也希望作为备份以便以后查阅。
⽹上这⽅⾯的⽂章⼀⼤把,不过多数都只提及⽪⽑,我就选取了感觉还不错的放了过来,毕竟全部⾃⼰写太⿇烦了。
我主要整理了下⾯这两篇⽂章,和整个构建过程基本相符,在这⾥也对原作者表⽰感谢。
编译过程概述编译的总体过程如下:1.编译host⼯具2.编译交叉⼯具链3.编译内核模块4.编译ipk5.安装ipk到⽂件系统6.编译内核7.将内核和⽂件系统组合成最终binary1. 编译host⼯具虽然我们在开始编译前已经安装了⼀些必要的⼯具,但编译过程中还需要其他⼀些主机⼯具。
这部分⼯具将⾸先编译。
2. 编译交叉⼯具链openwrt⾃带交叉编译链,当然在编译⽬标平台软件前,需要先编译。
3. 编译内核模块因为部分内核模块将会⽣成独⽴的ipk,所以内核模块需要⾸先编译。
4. 编译ipk这⾥将编译package⽬录下的各个软件包,这也是和我们最为息息相关的。
5. 安装ipk将⽣成的ipk安装到⽂件系统之中(⽐如build_dir/target-XXX/root-ramips⽬录)。
6. 编译内核在完成ipk编译之后,将会编译内核,压缩内核.同时使⽤mkimage⼯具,在内核前⾯⽣成⼀个⽤于uboot识别的头部。
7. 合成在最后⼀步,将⽂件系统和内核连接在⼀起,即⽣成了⽬标⼆进制镜像⽂件。
Makefile结构分析我们以chaos calmer的代码为例,整个编译的⼊⼝是在源码根⽬录下的Makefile。
编译的各种命令都应该在源码根⽬录下键⼊。
整个主Makefile的结构如下:world:ifneq ($(OPENWRT_BUILD),1)顶层else第⼆层endif开始部分是⼀些注释和变量定义及路径检查。
根据Makefile的规则,在没有指定编译⽬标的时候,Makefile中的第⼀个⽬标将作为默认⽬标。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
openwrt
这里主要介绍openwrt的主Makefile,并未对各个目录下的Makefile和相关文件进行介绍。
在Makefile里是两个主要的分支,由if语句根据OPENWRT_BUILD的值进行不同的处理。
第一个部分主要是执行编译前的准备,第二个部分是执行编译。
打开Makefile文件,可以看到默认的make目标world,这个目标没有依赖文件和执行命令。
执行make的时候,首先进入第一个部分,此时OPENWRT_BUILD的值为0,然后将OPENWRT_BUILD的值赋为1,在这里用到了override指示符,override指示符的作用的忽略make命令行的参数的赋值,可以对该变量进行赋值。
载入include下的相关文件,在toplevel.mk可以看到
%::
@+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq
@+$(SUBMAKE) -r $@
默认的目标就会执行这里。
在toplevel.mk的顶部定义了PREP_MK= OPENWRT_BUILD= QUIET=0,将OPENWRT_BUILD的值赋为0。
在执行@+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq命令的时候,在make命令行里有$(PREP_MK)变量,而由于OPENWRT_BUILD的值为0,在verbose.mk文件里NO_TRACE_MAKE := $(MAKE) V=99,所以会执行顶层
目录的Makefile第一个分支部分的目标prereq,即toplevel.mk文件中的目标prereq: prereq:: prepare-tmpinfo .config
@+$(MAKE) -r -s tmp/.prereq-build $(PREP_MK)
@+$(NO_TRACE_MAKE) -r -s $@
这里会进行一些编译前的准备工作,然后执行@+$(NO_TRACE_MAKE) -r -s $@,再次去执行顶层Makefile,此时,并没有$(PREP_MK)变量,所以会执行顶层Makefile的第一个部分,载入include下的相关文件,和一些必要的Makefile文件,在顶层Makefile去寻找prereq目标,
prereq: $(target/stamp-prereq) tmp/.prereq_packages
处理它的依赖文件。
然后再接着执行toplevel.mk
%::
@+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq
@+$(SUBMAKE) -r $@
在@+$(SUBMAKE) -r $@命令中也没有$(PREP_MK)变量,所以在顶层Makefile的第二个部分,寻找Makefile的默认目标,即world。
world: prepare $(target/stamp-compile) $(package/stamp-cleanup) $(package/stamp-compile) $(package/stamp-install) $(package/stamp-rootfs-prepare) $(target/stamp-install) FORCE $(_SINGLE)$(SUBMAKE) -r package/index
根据各个依赖文件进行相应的编译,最终完成编译。
在顶层Makefile里比较麻烦的是,将Makefile分为了两个主要分支,在每个分支里通过include载入相应的文件,在这些文件里包含相应的目标执行命令,在命令中多次用make + 目标+ 参数的方式,则会再次执行Makefile文件,就形成了Makefile的嵌套执行。
在嵌套执行的过程中,通过变量OPENWRT_BUILD来区分是执行顶层Makefile的那个部分,如果在make命令行中有OPENWRT_BUILD为0,则执行第一个部分,没有加OPENWRT_BUILD变量则执行第二个部分。
由于OPENWRT_BUILD是make命令行参数,所以在Makefile中如果要改变它的值,就用到了override指示符。