1、在package中创建包管理目录
mkdir package/app-helloworld
cd package/app-helloworld
touch app-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 -m 0755 $(@D)/helloworld $(TARGET_DIR)/bin
endef
define APP_HELLOWORLD_PERMISSIONS
/bin/helloworld f 4755 0 0 - - - - -
endef
$(eval $(generic-package))
编辑Config.in:
config BR2_PACKAGE_APP_HELLOWORLD
bool "helloworld"
help
eric test demo
在package/Config.in 中添加引入新建的菜单菜单
++ menu "SSJ APP"
++ source "package/app-helloworld/Config.in"
++ endmenu
2、添加包源码
在buildroot根目录下添加work目录,在work中添加自己的包
mkdir work
mkdir helloworld
cd work/helloworld
touch helloworld.c Makefile
编辑helloworld.c:
#include <stdio.h>
int main()
{
printf("Hello world ssj.\n");
return 0;
}
编辑makefile:
all: helloworld
helloworld: helloworld.o
$(CC) -o helloworld helloworld.o
clean:
rm -rf *.o
rm -rf helloworld
install:
$(INSTALL) -D -m 0755 helloworld $(TARGET_DIR)/bin
3、修改配置选项,编译
make menuconfig
Target packages —>
SSJ APP —>
[ ]helloworld
将此选项选中,并保存。
sudo make
在 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的一些实用技巧
打印出帮助菜单
make help
显示出本次配置所要编译所有的目标,这些目标可以单独作为模块,用 make 命令进行单独编译。
make show-targets
单独编译某一模块
make <模块名>
重新编译某一模块
make <模块名>-rebuild
只解压不编译
make <模块名>-extract
只下载包
make <模块名>-source