如何将我自己的软件添加到Buildroot Linux软件包?

Ale*_*ruC 17 linux qt makefile uclinux buildroot

我正在尝试将自己的程序添加到使用Buildroot创建的小型Linux中.到目前为止我做了什么:

  • 我在'buildroot/package /'中创建了一个名为'HelloWorld'的新目录.在'buildroot/package/HelloWorld'里面我有一个:Config.in,HelloWorld.mk和HelloWorld目录. Config.in认为:

        config BR2_PACKAGE_HELLOWORLD
        bool "helloworld"
        default y
        help
                Hello world component.
    
    Run Code Online (Sandbox Code Playgroud)

HelloWorld.mk认为:

HELLOWORLD_VERSION:= 1.0.0
HELLOWORLD_SITE:= /home/userpc/Downloads/helloworld/
HELLOWORLD_SITE_METHOD:=local
HELLOWORLD_INSTALL_TARGET:=YES

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

define HELLOWORLD_INSTALL_TARGET_CMDS
        $(INSTALL) -D -m 0755 $(@D)/helloworld $(TARGET_DIR)/bin
endef

define HELLOWORLD_PERMISSIONS
       /bin/helloworld f 4755 0 0 - - - - - 
endef

$(eval $(generic-package))
Run Code Online (Sandbox Code Playgroud)

(灵感来源)HelloWorld目录包含:main.c和Makefile:

main.c:

#include <stdio.h>

int main()
{
        printf("\nMain entry.\n");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

Makefile文件:

CC=gcc
CFLAGS=-I.

all: *.c
        $(CC) -Os -Wall  *.c -o helloworld
#       $(STRIP) helloworld

clean:
        rm -f a.out helloworld
        rm -f *.o
Run Code Online (Sandbox Code Playgroud)

编辑:我还在'package/Config.in'中添加了源代码"package/HelloWorld/Config.in"但是当我挂载rootfs.ext2分区时,我无法在/ usr/bin ..中找到我的HelloWorld可执行文件,我对此非常陌生并且没有任何先验知识,所以你能否向我解释一下,我从中错过了什么,因为我确定我做错了什么.

更新:程序构建并安装在所需的位置,但是当我尝试运行它时:./ helloworld,我得到:bash:./ helloworld:没有这样的文件或目录,它有执行权..什么事用它?(我将rootfs.ext2挂载到ubuntu目录后尝试运行它,buildroot的目标arch是i368,所以它应该没问题,对吧?)

建筑和安装HelloWorld程序,并最终它运行后,我想加入的init.d所以开机后启动,并更换一个Qt窗口的HelloWorld不需要一个X服务器,像这样的事情在这里.

这里灵感的主要来源.

pat*_*uin 9

通常,buildroot包的源代码来自(下载的)tarball.你现在正在做什么(将源放在package/HelloWorld中)不是正确的方法.

Buildroot确实有"本地"包源的条款,如果你真的需要,你可以使用它.你需要HELLOWORLD_SITE_METHOD变量.

有关更多信息,请参阅http://buildroot.uclibc.org/downloads/manual/manual.html#adding-packages.

此外,您无需定义HELLOWORLD_DIR,HELLOWORLD_BINARY,HELLOWORLD_TARGET_BINARY.

更新:关于您的其他问题:

更新:程序构建并安装在所需的位置,但是当我尝试运行它时:./ helloworld,我得到:bash:./ helloworld:没有这样的文件或目录,它有执行权..什么事用它?(我将rootfs.ext2挂载到ubuntu目录后尝试运行它,buildroot的目标arch是i368,所以它应该没问题,对吧?)

不,它不会那样工作.您不能只挂载rootfs.ext2并期望从中运行程序.除其他之外,这是因为rootfs.ext2中的程序是针对rootfs.ext2中的库编译的,但是如果你这样运行它将使用/ usr/lib中的库.您必须使用rootfs.ext2完全启动系统,使用qemu或使用chroot环境.对于chroot,您应该使用'tar'文件系统格式,而不是ext2.另见:http: //buildroot.uclibc.org/downloads/manual/manual.html#_chroot


Cir*_*四事件 7

最小的测试示例在2016.05之上

GitHub上游:https: //github.com/cirosantilli/buildroot/tree/in-tree-package-2016.05

此示例在树中添加了包源,这对于教育目的而言很简单,但不是常见的用例.

在实际项目中,您更有可能希望将Buildroot用作git子模块,并且:

文件已修改:

包/ Config.in:

menu "Misc"
    source "package/hello/Config.in"
endmenu
Run Code Online (Sandbox Code Playgroud)

包/你好/ Config.in:

config BR2_PACKAGE_HELLO
    bool "hello"
    help
        Hello world package.

        http://example.com
Run Code Online (Sandbox Code Playgroud)

包/你好/ hello.mk:

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

HELLO_VERSION = 1.0
HELLO_SITE = ./package/hello/src
HELLO_SITE_METHOD = local

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

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

$(eval $(generic-package))
Run Code Online (Sandbox Code Playgroud)

包/你好/ SRC /的.gitignore:

hello
Run Code Online (Sandbox Code Playgroud)

包/你好/ SRC /生成文件:

CC = gcc

.PHONY: clean

hello: hello.c
    $(CC) -o '$@' '$<'

clean:
    rm hello
Run Code Online (Sandbox Code Playgroud)

包/你好/ SRC/hello.c中:

#include <stdio.h>

int main(void) {
    puts("hello");
}
Run Code Online (Sandbox Code Playgroud)

用法:

make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_HELLO=y' >> .config
make BR2_JLEVEL=2
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user
Run Code Online (Sandbox Code Playgroud)

从qemu内部:

hello
Run Code Online (Sandbox Code Playgroud)

预期产量:

hello
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 16.04中测试过.