Как добавить мое собственное программное обеспечение в пакет Buildroot Linux?

Я пытаюсь добавить свою собственную программу в маленький linux, созданный с помощью Buildroot. Что я сделал до сих пор:

  • Я создал новый каталог внутри моего '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

Изменить. Я также добавил исходный пакет /HelloWorld/Config.in для пакета /Config.in ' Но когда я монтирую свой раздел rootfs.ext2, я не могу найти исполняемый файл HelloWorld внутри /usr/bin.., я действительно новичок в этом и не имею никаких предварительных знаний, поэтому не могли бы вы объяснить мне, что Я пропустил это, потому что я уверен, что я делаю что-то неправильно.

UPDATE:. Программа строит и устанавливает в нужном месте, но когда я пытаюсь запустить ее так:./helloworld, я получаю: bash:./helloworld: нет такого файла или каталог, у него есть права исполнения.. что с ним связано? (Я пытаюсь запустить его после того, как я установил rootfs.ext2 в каталог ubuntu, целевая арка для buildroot - i368, так что это должно быть нормально, правильно?)

После создания и установки программы HelloWorld и, в конечном счете, ее запуска, я хотел бы добавить в init.d, чтобы он запускался после загрузки, и заменил HelloWorld на Qt-окно, которое не нуждается в X-сервере, например эта вещь здесь.

Основной источник вдохновения здесь.

Ответ 1

В общем, источники для buildroot-пакетов берутся из (загруженного) tarball. То, что вы делаете прямо сейчас (размещение источников внутри пакета /HelloWorld ), не является правильным способом для продолжения.

У Buildroot есть положения для "локальных" источников пакетов, которые вы могли бы использовать, если вам действительно нужно. Для этого вам понадобится переменная HELLOWORLD_SITE_METHOD.

Подробнее см. http://buildroot.uclibc.org/downloads/manual/manual.html#adding-packages.

Кроме того, вам не нужно определять HELLOWORLD_DIR, HELLOWORLD_BINARY, HELLOWORLD_TARGET_BINARY.

Обновление: относительно вашего дополнительного вопроса:

UPDATE: программа строит и устанавливает в нужном месте, но когда я пытаюсь запустить ее например:./helloworld, я получаю: bash:./helloworld: нет такого файла или каталога, он имеет права исполнения.. что с этим связано? (Я пытаюсь запустить его после установки 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

Ответ 2

Минимальный пример испытания сверху 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

пакет/привет/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))

пакет/привет/SRC/.gitignore:

hello

пакет/привет/SRC/Makefile:

CC = gcc

.PHONY: clean

hello: hello.c
    $(CC) -o '[email protected]' '$<'

clean:
    rm 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.