本文转载自:http://blog.csdn.net/zhou_chenz/article/details/52335634

Buildroot官方全英文使用手册的链接是https://buildroot.org/downloads/manual/manual.html,需要知道每一个细节的朋友,可以仔细查阅,这篇文章只是我自己从中提炼出来的一下快速上手的技巧。

如何在现有项目加入自己的APP

Buildroot从零开始构建的过程还是很复杂的,以后的文章会一步步介绍。我们先来看看如何在现有项目中加入一个自己的应用的构建方法,快速上手。实际上,快速添加应用包的方法,在官方网站也有一份英文文档:https://buildroot.org/downloads/manual/manual.html#adding-packages  详细的原理可以参考这篇文档。

这里以加入自己的demo_app应用为例,在mini2440_defconfig的项目下,加入demo_app的package,将demo_app的应用源代码编译生成到rootfs根文件系统中。构建方法如下:

1.      在buildroot/package/ 下执行 mkdir demo_app  ,创建demo_app 的文件夹

Figure1 在package/ 目录下创建demo_app/

2.      在demo_app 中touch Config.in , touch demo_app.mk 创建这两个文件,注意,文件名很关键,demo_app.mk要小写,而且不能乱取其它名字,因为Buildroot框架有一套根据命名,展开app package的规则,所以buildroot里面构建项目,一定要遵守文章中的命名规则,否则会有各种报错。

Figure2  添加Config.in 与 demo_app.mk 文件

3.      在package/Config.in 中加入 source "package/demo_app/Config.in" ,以便将demo_app 的配置文件包含到Buildroot的package中来管理。

Figure3  在packahe/Config.in 中加入demo_app的Config.in

4.      在package/demo_app/Config.in 这个类似Kconfig的配置文件中,按照命名格式和Linux Kernel 的 Kconfig文件规范,加入自己的配置变量,参考代码如下:

  1. config BR2_PACKAGE_DEMO_APP
  2. bool"demo app"
  3. help
  4. demo app to show

这段配置中,命名规则也同样重要,BR2_PACKAGE_DEMO_APP是demo_app 可被Buildroot识别编译成package的配置变量。Package应用一定要以BR2_PACKAGE_作为开头,以DEMO_APP即demo_app的大写来填充这个变量名,这样才能被Buildroot命名框架识别、展开,才能通过make menuconfig来配置。

bool是变量的类型,即只要true(编译选中,false(编译未选中),两种情况,和Kconfig的规则是一样的,后面的字符串和help都是在make menuconfig时的提示文本。

实际上,在Config.in中,可以参考linux Kernel的Kconfig文件,根据语法规范,加入自己的配置逻辑和其它可配置的变量(比如app的下载地址链接),在此就不详细说了,大家可以参考其它的package/的Config.in文件的写法,这里只说重点,就是BR2_PACKAGE_DEMO_APP这个变量一定要有,一定要被选上才能编译。

5.      在demo_app.mk中,按照Makefile文件的格式和语法规范,编写demo_app的上层构建规则,demo_app.mk的参考代码如下:

  1. ################################################################################
  2. #
  3. # demo app
  4. #
  5. ################################################################################
  6. DEMO_APP_VERSION = master
  7. DEMO_APP_SITE_METHOD = git
  8. DEMO_APP_SITE = /mnt/sdb/git_repo/demo_app
  9. DEMO_APP_SOURCE = demo_app-$(DEMO_APP_VERSION).tar.gz
  10. DEMO_APP_ALWAYS_BUILD = YES
  11. DEMO_APP_INSTALL_STAGING = YES
  12. DEMO_APP_CFLAGS =
  13. DEMO_APP_LDFLAGS =
  14. OUT_BIN = demo_app
  15. DEMO_APP_MAKE_FLAGS += \
  16. CROSS_COMPILE="$(CCACHE) $(TARGET_CROSS)" \
  17. CC=$(TARGET_CC)      \
  18. OUT_BIN=$(OUT_BIN)  \
  19. AR=$(TARGET_AR)      \
  20. STRIP=$(TARGET_STRIP) \
  21. CFLAGS=$(DEMO_APP_CFLAGS) \
  22. LDFLAGS=$(DEMO_APP_LDFLAGS) \
  23. STAGING_DIR=$(STAGING_DIR)  \
  24. TARGET_DIR=$(TARGET_DIR)
  25. define DEMO_APP_BUILD_CMDS
  26. $(MAKE) clean  -C $(@D)
  27. $(MAKE) $(DEMO_APP_MAKE_FLAGS)  -C $(@D)
  28. endef
  29. define DEMO_APP_INSTALL_TARGET_CMDS
  30. $(INSTALL) -m 0755 -D $(@D)/$(OUT_BIN)  $(TARGET_DIR)/usr/bin
  31. endef
  32. $(eval $(generic-package))

注意,demo_app.mk并不能实际代替demo_app源代码的Makefile文件,它只是一个上层的make文件,告诉Buildroot,应该到哪个地方拿源代码,应该如何解压源代码,应该给源代码中的Makefile中的变量传递哪些编译参数,编译出来的库和bin文件,应该安装到rootfs的哪个路径下。具体demo_app源代码是如何一步一步编译的,还得靠demo_app源代码本身的Makefile去做。

这段makefile代码大概有什么规范呢:

a)     所有的变量都已DEMO_APP_ 开头,这样Buildroot才能够通过命名框架去解析

b)     _VERSION结尾的变量,是下载demo_app源代码的版本号, _SITE_METHOD结尾的变量是demo_app变量的下载方法,_SITE结尾的变量是demo_app的下载地址,其它的变量是干嘛用的,可以慢慢查阅官方手册。

c)      所有define 并以_CMDS结尾的代码块,类似函数的东西,实际上是构建过程中会被Buildroot框架执行的指令,这些指令到底有哪些,具体也得读手册。当然这些类似函数,开头也得是DEMO_APP_, Buildroot中命名规则很重要,重要的话说三遍。

d)     _BUILD_CMDS结尾的函数,是构建过程函数,一般是给demo_app源代码传递编译和链接选项,调用源代码的Makefile执行编译。

e)     INSTALL_TARGET_CMDS结尾的函数,就是demo_app编译完之后,自动安装的执行,一般是让Buildroot把编译出来库和bin文件安装到指定的目录。

f)      $(eval$(generic-package)) 最核心的就是这个东西了,一定不能够漏了,不然demo_app是编译不出来的,这个函数就是把整个demo_app.mk构建脚本,通过Buildroot框架的方式,展开到Buildroot/目录下的Makfile中,生成demo_app的构建目标(构建目标是什么,还记得Makefile中的定义吗?)。

g)     实际上,这些构建命名框架还有$(eval $(generic-package))这个黑魔法,都在package/pkg-generic.mk 这个文件中,generic-package是这个文件最后的调用的函数生成的,其它 _BUILD_CMDS,INSTALL_TARGET_CMDS这些函数如何被Buildroot框架嵌入的, 之前那些变量是如何被调用的,在package/pkg-generic.mk中都能找到,但是还是要一定的Makefile功底才能读懂这个的,以后再解释package/pkg-generic.mk的框架原理。

讲了这么多条规范,那么这段makefile代码大概是什么意思呢?

这段代码描述的流程是, 通过Git  clone的方法从/mnt/sdb/git_repo/demo_app这个目录下的git仓库中拿到demo_app的源代码-->传递编译参数,并且编译demo_app(DEMO_APP_BUILD_CMDS函数做的事情)-->把编译出来的bin文件安装到$(TARGET_DIR)/usr/bin目录下(DEMO_APP_INSTALL_TARGET_CMDS函数做的事情)。

为什么我们自己不用写从git仓库下载demo_app源代码的函数呢,实际上是Buildroot帮我们写好了,在package/ pkg-download.mk 文件里面,所以我们只有通过DEMO_APP_SITE_METHOD和DEMO_APP_SITE设置下载的方法和地址就可以。至于为什么DEMO_APP_VERSION是master,了解git的朋友应该看得明白,就是git clone之后会checkout到master版本,其实也就是master分支最新的版本啦,当然也可以换成自己的版本号,前提是该版本号存在,能够用git checkout 切换过去。

这段代码的执行前提是要在Linux上搭建自己的git仓库,维护自己的demo_app源代码,在用Buildroot前,git仓库是现成的。

但是不熟悉git 的朋友怎么办呢?其实还有其它方法,demo_app.mk的代码稍做修改:

Figure4  采用file方法下载源代码

主要,DEMO_APP_SITE_METHOD改成了file,这样就不用构建git参考,可以用file,也就是直接cp的方法,把源代码拷贝到buildroot中来。但是buildroot到哪里去cp源代码呢,实际上,这里不是DEMO_APP_SITE = /mnt/sdb/git_repo/demo_app这个地址,这个地方被我注释掉了。

在buildroot/下 makemenuconfig --> Build options -->Mirrors and Download locations 可以看到以下的画面:

Figure5  设置file方法cp文件的路径

只有按照上面的格式,也就是file:// + 你的文件绝对路径的地址的格式配置这个选项,然后保存,就OK,之后Buildroot就知道去该路径下找源代码包了。

另外记得,一定要把demo_app的源代码压缩包保存到该路径下,并且名字一定要和DEMO_APP_SOURCE变量的名字一样哦!

Figure6  demo_app 源代码的存放路径

6.      demo_app的源代码

demo_app就是一个hello world 程序参考的makefile和源代码如下:

其中Makefie会被demo_app.mk中的DEMO_APP_BUILD_CMDS函数调用,Makefie中的变量参数的值都可以通过DEMO_APP_BUILD_CMD传入。

Figure7 demo_app 的Makefie

Figure8  demo_app.c 源代码

7.      构建方法

a). make mini2440_defconfig  --> makemenuconfig --> Target packages下选中demo app --> make demo_app

Figure9  menuconfig中选中 demo app,

make demo_app这个命令,实际上是只是编译demo_app以及demo_app依赖链上的package, 当然,toolchain会被所有package依赖,所以buildroot会先编译toolchain。

编译完成后,会发现buildroot/output/build/目标下的demo_app-master目录,即demo_app编译后现场,以及在buildroot/output/target/usr/bin/目录下,安装好的编译出来的demo_appbin文件。并且确实是ARM交叉工具链编译出来的。

Figure10  demo_app 源代码编译现场路径

Figure11  安装好的demo_app  bin文件

至此,在Buildroot中添加app package的过程就完成了。

如何编译基于现有项目的最小系统

Buildroot 一次make all要把整个系统编译出来,真麻烦,我只想要一个可以boot起来的最小系统,不需要什么其它package,它有什么快捷方式可以办到吗?这个当然问buildroot,我们可以这么做。

make help 看看buildroot怎么说

Figure12 make help 之后的buildroot系统提示

以下是buildroot的help命令提示,其中有一项是

make  allnopackageconfig

在make xxx_defconfig 之后,执行make allnopackageconfig,那么再make all就可以只编toolchain,boot,kernel,busybox,rootfs这个几个能构成系统启动的最小系统的模块。

当然,在make mini2440_defconfig时,由于mini2440的toolchain是toolchain-buildroot,即buildroot从零开始制作工具链,而不是toolchain-external,即buildroot使用已经制作好的工具链,这样的话,如果toolchain还没有在前一次生成,则make allnopackageconfig 再make all之后编译过程会报错,因为制作零制作toolchain需要编译某些package作为原材料,而这些package被make allnopackageconfig去掉了。

已经制作好工具链,或者采用toolchain-external模式的情况下,make allnopackageconfig 编译最小系统是没用问题的。

Buildroot实用技巧与指令

最后看看buildroot有哪些实用技巧:

make help

-之前演示过了,打印出帮助菜单

make show-targets

-         显示出本次配置所要编译所有的目标,这些目标可以单独作为模块,用 make <pkg-target> 命令进行单独编译。从这条命令的显示结果来看,mini2440_defconfig需要编译uclibc(微型C库),busybox等目标,当然demo_app也是一个编译目标,是我在menocunfig时候加进去的,所以可以用make demo_app来编译。

Figure13  make show-targets 的显示结果

make <pkg-target>

-         单独编译某个pkg模块以及其依赖的模块,比如make demo_app

make pkg-rebuild

-         重新编译pkg

make  pkg-extract

-         只下载解压pkg,不编译,pkg解压后放在 output/build/目录对应的pkg-dir目录下

make pkg-source

-         只下载某pkg,然后不做任何事情

其它还有很多快捷指令,在package/pkg-generic.mk中都能找到,这些快捷指令实际是是由pkg-指令这种命名框架合成的,更详细的内容请参考手册和package/pkg-generic.mk。

Figure14  package/pkg-generic.mk 框架下所支持的指令部分截图呀

Buildroot构建指南--快速上手与实用技巧【转】的更多相关文章

  1. Buildroot构建指南--快速上手与实用技巧

    Buildroot官方全英文使用手册的链接是https://buildroot.org/downloads/manual/manual.html,需要知道每一个细节的朋友,可以仔细查阅,这篇文章只是我 ...

  2. Buildroot构建指南——根文件系统(Rootfs)【转】

    本文转载自; 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   Buildroot构建指南——根文件系统(Rootfs) Buildroot的Rootfs构建流程有一个大 ...

  3. Buildroot构建指南——工具链

    Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件.一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工 ...

  4. Buildroot构建指南——工具链【转】

    本文转载自:http://blog.csdn.net/zhou_chenz/article/details/52346134 Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软 ...

  5. webpack构建工具快速上手指南

    最近在研究react项目,接触到webpack打包工具.刚接触的时候一脸茫然,经过最近的学习,下面我来带大家开启webpack入门之旅. webpack是什么 webpack是近期最火的一款模块加载器 ...

  6. Buildroot构建指南--Overview

    使用Buildroot,让嵌入式Linux系统构建更加便捷.本文以Buildroot-2016.05的版本为基础来讲解,不同版本之间有细节差异,需要根据读者使用的版本自行调整. Buildroot是什 ...

  7. 一位ML工程师构建深度神经网络的实用技巧

    一位ML工程师构建深度神经网络的实用技巧 https://mp.weixin.qq.com/s/2gKYtona0Z6szsjaj8c9Vg 作者| Matt H/Daniel R 译者| 婉清 编辑 ...

  8. Github Action 快速上手指南

    前言 各位读者,新年快乐,我是过了年匆忙赶回上海努力搬砖的蛮三刀. Github之前更新了一个Action功能(应该是很久以前了),可以实现很多自动化操作.用来替代用户自己设置的自动化脚本(比如:钩子 ...

  9. Rancher 快速上手指南操作(1)

    Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...

随机推荐

  1. python023 Python3 标准库概览

    Python3 标准库概览 操作系统接口 os模块提供了不少与操作系统相关联的函数. >>> import os >>> os.getcwd() # 返回当前的工作 ...

  2. OO第三次作业总结(JML)

    第三单元的课题是JML, 即java建模语言.JML是一种描述接的语言.通过前置条件和后置条件,描述一个模块的行为.本单元我们扮演一个项目中的一员,完成自己的一小部分工作,最终实现整个项目.而限制我们 ...

  3. Go 方法和接收者

    package main import ( "fmt" ) //面向对象 //go仅支持封装,不支持继承和多态 //go语言中没有class,只要struct //不论地址还是结构 ...

  4. 什么是Istio

    本文主要是对Istio Prelim 1.0(https://preliminary.istio.io/docs/)的翻译 Istio:一种开放式平台,用于连接,管理和保护微服务. Istio提供了一 ...

  5. idea添加虚拟参数

    1. 2.

  6. android GET 请求在5.0版本的取不到数据,报IO异常兼容问题解决

    使用lib类库xUtils-2.6.10.jar作为数据请求的框架,在android的5.0版会有兼容问题,取不到GET请求的数据. 但是POST没有问题,难取到数据. public static R ...

  7. 选课(codevs 1378)

    题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...

  8. [NOIP2002] 提高组P1032 字串变换

    题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...

  9. Object_C 定义全局宏的颜色时,报“Expected identifier”的错误

    在定义全局颜色宏的时候,为了整齐把空格删了,写在了同一行里,调用的时候,出错提示“Expected identifier”,如下: 如果宏定义如上那样的话,在调用的时候,会出现如下的问题: 百思不得解 ...

  10. POJ 2104 K-th Number【整体二分 + 树状数组】

    本来只是想学一下CDQ,还是先把整体二分搞懂一点. 这题窝几个月前分别用划分树,树套树,主席树和挑战上介绍的分桶法实现了一发(然而现在都忘得差不多了) 最快的是划分树,其次是主席树,然后是树套树,还有 ...