1、在package中创建包管理目录
mkdirpackage/app-helloworldcdpackage/app-helloworldtouchapp-helloworld.mk Config.in编辑app-helloworld.mk:
################################################################################## helloworld#################################################################################APP_HELLOWORLD_VERSION=1.0.0#源码下载方式为本地APP_HELLOWORLD_SITE_METHOD:=local#源码路径APP_HELLOWORLD_SITE=$(CURDIR)/work/helloworld APP_HELLOWORLD_INSTALL_TARGET:=YES define APP_HELLOWORLD_BUILD_CMDS$(MAKE)CC="$(TARGET_CC)"LD="$(TARGET_LD)"-C$(@D)all endef define APP_HELLOWORLD_INSTALL_TARGET_CMDS$(INSTALL)-D-m0755$(@D)/helloworld$(TARGET_DIR)/bin endef define APP_HELLOWORLD_PERMISSIONS /bin/helloworld f475500- - - - - endef$(eval$(generic-package))编辑Config.in:
config BR2_PACKAGE_APP_HELLOWORLD bool"helloworld"helperictestdemo在package/Config.in 中添加引入新建的菜单菜单
++ menu"SSJ APP"++source"package/app-helloworld/Config.in"++ endmenu2、添加包源码
在buildroot根目录下添加work目录,在work中添加自己的包
mkdirworkmkdirhelloworldcdwork/helloworldtouchhelloworld.c Makefile编辑helloworld.c:
#include <stdio.h>intmain(){printf("Hello world ssj.\n");return0;}编辑makefile:
all: helloworld helloworld: helloworld.o$(CC)-ohelloworld helloworld.o clean:rm-rf*.orm-rfhelloworld install:$(INSTALL)-D-m0755 helloworld$(TARGET_DIR)/bin3、修改配置选项,编译
makemenuconfigTarget packages —>
SSJ APP —>
[ ]helloworld
将此选项选中,并保存。
sudomake在 target/bin 目录下 出现新编的生成的 helloworld 可执行文件。
4、扩展内容
mk文件的命名规则为<包名>.mk,这样才能被buildroot识别。
*.mk并不能实际代替源代码的Makefile文件,它只是一个上层的make文件,告诉Buildroot,应该到哪个地方拿源代码,应该如何解压源代码,应该给源代码中的Makefile中的变量传递哪些编译参数,编译出来的库和bin文件,应该安装到rootfs的哪个路径下。具体demo_app源代码是如何一步一步编译的,还得靠demo_app源代码本身的Makefile去做。
所有的变量都已DEMO_APP_ 开头,这样Buildroot才能够通过命名框架去解析
_VERSION结尾的变量,是下载demo_app源代码的版本号,
_SITE_METHOD结尾的变量是demo_app变量的下载方法,_SITE结尾的变量是demo_app的下载地址,其它的变量是干嘛用的,可以慢慢查阅官方手册。
所有define 并以_CMDS结尾的代码块,类似函数的东西,实际上是构建过程中会被Buildroot框架执行的指令,这些指令到底有哪些,具体也得读手册。当然这些类似函数,开头也得是DEMO_APP_, Buildroot中命名规则很重要,重要的话说三遍
_BUILD_CMDS结尾的函数,是构建过程函数,一般是给demo_app源代码传递编译和链接选项,调用源代码的Makefile执行编译
INSTALL_TARGET_CMDS结尾的函数,就是demo_app编译完之后,自动安装的执行,一般是让Buildroot把编译出来库和bin文件安装到指定的目录
$(eval $ (generic-package)) 最核心的就是这个东西了,一定不能够漏了,不然demo_app是编译不出来的,这个函数就是把整个demo_app.mk构建脚本,通过Buildroot框架的方式,展开到Buildroot/目录下的Makfile中,生成demo_app的构建目标
5、buildroot的一些实用技巧
打印出帮助菜单
makehelp显示出本次配置所要编译所有的目标,这些目标可以单独作为模块,用 make 命令进行单独编译。
makeshow-targets单独编译某一模块
make<模块名>重新编译某一模块
make<模块名>-rebuild只解压不编译
make<模块名>-extract只下载包
make<模块名>-source