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

26

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

main.c:

#include <stdio.h>

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

Makefile:

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: 没有那个文件或目录"。它具备执行权限。它存在什么问题呢?(我是在将rootfs.ext2挂载到Ubuntu目录后尝试运行它的,buildroot的目标架构是i386,所以应该没问题,对吧?)

在构建、安装和运行HelloWorld程序之后,我想将其添加到init.d中,以便在启动后启动,并使用一个不需要X server的Qt窗口替换HelloWorld,类似于此处

主要灵感来源在这里


“没有这个文件或目录”有时是由于不兼容的二进制文件导致的。我有一个MIPS I路由器,当我尝试执行MIPS 32位二进制文件时,我会得到相同的消息。 - aularon
2个回答

12

2016.05版本最小测试示例

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

这个示例将软件包源代码放在树内,这对于教育目的非常简单,如果您想合并回原来的项目中,这也是正确的方法(赞!)。

如果您不打算合并回去(噢!),那么您更有可能希望将Buildroot作为git子模块使用,并使用:

修改的文件:

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

包/你好/源码/.gitignore

hello

包/你好/源代码/Makefile

CC = gcc

.PHONY: clean

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

clean:
    rm 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上测试过。


8
一般情况下,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: No such file or directory的错误提示,它具有执行权限...这是怎么回事?(我在将rootfs.ext2挂载到ubuntu目录后尝试运行它,buildroot的目标架构为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

1
我已编辑我的问题,包括我所做的修改,但是仍然没有任何反应,我应该在哪里找到构建程序... 我知道把源文件放在package/HelloWorld(实际上是 'package/HelloWorld/HelloWorld')可能不是最好的方式,但目前我正在本地开发,因此不会将其放在其他地方。 - AlexandruC
你也可以使用源目录覆盖方法进行本地开发:http://free-electrons.com/blog/buildroot-2011-11/ - yegorich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接