23

我正在尝试将自己的程序添加到使用 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.
    

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))

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

主.c:

#include <stdio.h>

int main()
{
        printf("\nMain entry.\n");
        return 0;
}

生成文件:

CC=gcc
CFLAGS=-I.

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

clean:
        rm -f a.out helloworld
        rm -f *.o

编辑:而且我还添加了源“package/HelloWorld/Config.in”到“package/Config.in”但是当我挂载我的 rootfs.ext2 分区时,我在 /usr/bin 中找不到我的 HelloWorld 可执行文件......,我对此真的很陌生,没有任何先验知识,所以请你向我解释一下,我错过了什么,因为我确定我做错了什么。

更新:该程序在所需位置构建和安装,但是当我尝试像这样运行它时:./helloworld,我得到:bash: ./helloworld: No such file or directory它具有执行权限。它有什么问题?(我将rootfs.ext2挂载到ubuntu目录后尝试运行它,buildroot的目标arch是i386,所以应该没问题,对吧?)

在构建和安装 HelloWorld 程序并最终运行它之后,我想添加到 init.d 以便它在启动后启动,并将 HelloWorld 替换为不需要 X 服务器的 Qt Window,就像这里的东西.

灵感的主要来源在这里

4

2 回答 2

10

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

包/你好/Config.in

config BR2_PACKAGE_HELLO
    bool "hello"
    help
        Hello world package.

        http://example.com

包/你好/你好.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))

包/hello/src/.gitignore

hello

包/hello/src/Makefile

CC = gcc

.PHONY: clean

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

clean:
    rm hello

包/hello/src/hello.c

#include <stdio.h>

int main(void) {
    puts("hello");
}

用法:

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

从 qemu 内部:

hello

预期输出:

hello

在 Ubuntu 16.04 中测试。

于 2017-12-05T15:13:21.483 回答
8

通常,buildroot 包的源代码取自(下载的)tarball。您现在正在做的事情(将源代码放在包/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

于 2013-11-05T08:56:08.160 回答