step1

workspace 下创建工程目录

liyongjun@Box:~/project/board/buildroot-2021.05$ mkdir override/hello/

step2

完成工程代码

hello.c

#include <stdio.h>

int main()
{
	print("hello\n")

	return 0;
}

Makefile

all: hello

hello: hello.o
	$(CC) -o hello hello.o

step3

在 package/Config.in 中添加如下

menu "app user"
    source "package/hello/Config.in"
endmenu

这样在执行 make menuconfig 时就会展示 package/hello/Config.in 中的选项

step4

创建 package/hello 并完善其内容

mkdir package/hello

Config.in

config BR2_PACKAGE_HELLO
    bool "hello"
    help
      This is a demo to add local app.

hello.mk

################################################################################
# 
# hello
#
################################################################################

HELLO_VERSION = 1.0.0
HELLO_SITE_METHOD:=local
HELLO_SITE = $(TOPDIR)/override/hello
HELLO_INSTALL_TARGET:=YES


define HELLO_BUILD_CMDS
    $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
endef

define HELLO_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 0755 $(@D)/hello $(TARGET_DIR)/bin
endef

define HELL_PERMISSIONS
    /bin/hello f 4755 0 0 - - - - -
endef

$(eval $(generic-package))

注意1:

所有变量必须以相同的前缀开始 。 此前缀始终是软件包名称的大写版本。

注意2:

_VERSION 结尾的变量是源码的版本

_SITE 结尾变量是源码的下载地址

_SITE_METHOD 结尾的变量是源码下载方法,包括:wget、scp、svn、cvs、git、hg、bzr、file(为本地 tarball,压缩包形式)、local(为本地源码目录,已经解压过)

_BUILD_CMDS 结尾的变量会在 buildroot 框架编译的时候执行,用于给源码的 Makefile 传递编译选项和链接选项,调用源码的 Makefile

_INSTALL_TARGET_CMDS 结尾的变量是在编译完之后,自动安装执行,一般是让 buildroot 把编译出来的的 bin 或 lib 拷贝到指定目录

$(eval$(generic-package)) 最核心的就是这个,一定不能漏掉,不然源码不会被编译,该函数就是把整个 .mk 构建脚本,通过 buildroot 框架的方式,展开到 buildroot/ 目录下的 Makfile 中,生成的构建目标

注意3:

以下是系统内置的变量

$(TARGET_CC)$(TARGET_LD) 用来获得目标交叉编译工具

$(@D) 源码拷贝或解压到的位置,用于编译

step5

make menuconfig 将 → Target packages → app user 下的 hello 选项选中表示进行编译。

step6

编译

$ make O=RPi3/ hello
>>> hello 1.0.0 Syncing from source dir /home/liyongjun/project/board/buildroot-2021.05/override/hello
rsync -au --chmod=u=rwX,go=rX  --exclude .svn --exclude .git --exclude .hg --exclude .bzr --exclude CVS /home/liyongjun/project/board/buildroot-2021.05/override/hello/ /home/liyongjun/project/board/buildroot-2021.05/RPi3/build/hello-1.0.0
touch /home/liyongjun/project/board/buildroot-2021.05/RPi3/build/hello-1.0.0/.files-list.before ; touch /home/liyongjun/project/board/buildroot-2021.05/RPi3/build/hello-1.0.0/.files-list-staging.before ; touch /home/liyongjun/project/board/buildroot-2021.05/RPi3/build/hello-1.0.0/.files-list-host.before ;
>>> hello 1.0.0 Configuring
>>> hello 1.0.0 Building
/usr/bin/make -j5 CC="/home/liyongjun/project/board/buildroot-2021.05/RPi3/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc" LD="/home/liyongjun/project/board/buildroot-2021.05/RPi3/host/bin/arm-buildroot-linux-uclibcgnueabihf-ld" -C /home/liyongjun/project/board/buildroot-2021.05/RPi3/build/hello-1.0.0 all
/home/liyongjun/project/board/buildroot-2021.05/RPi3/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc    -c -o hello.o hello.c
/home/liyongjun/project/board/buildroot-2021.05/RPi3/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc -o hello hello.o
>>> hello 1.0.0 Installing to target
/usr/bin/install -D -m 0755 /home/liyongjun/project/board/buildroot-2021.05/RPi3/build/hello-1.0.0/hello /home/liyongjun/project/board/buildroot-2021.05/RPi3/target/bin

编译后变将 hello 程序拷贝到了 /bin 目录,烧录到板子就可以运行了。