Как добавить мое собственное программное обеспечение в пакет Buildroot Linux?
Я пытаюсь добавить свою собственную программу в небольшой linux, созданный с помощью Buildroot. Что я сделал до сих пор:
-
Я создал новый каталог внутри моего "buildroot / package/" под названием "HelloWorld". Внутри "buildroot / package / HelloWorld" у меня есть : конфигурация.в аду.каталог mk и HelloWorld. конфигурация.в держит это:
config BR2_PACKAGE_HELLOWORLD bool "helloworld" default y help Hello world component.
HelloWorld.МК держит это:
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.в" to ' package / Config.в Но когда я сяду на свои корни.раздел ext2 я не могу найти исполняемый файл HelloWorld внутри /usr/bin .., Я действительно Новичок в этом и не имею никаких предварительных знаний, поэтому не могли бы вы объясните мне, что я упускаю из этого, потому что я уверен, что делаю что-то не так.
обновление: программа строит и устанавливает в нужном месте, но когда я пытаюсь запустить ее так: ./ helloworld, I get: bash: ./helloworld: нет такого файла или каталога, он имеет права на выполнение.. что с ним такое? (Я пытаюсь запустить его после установки rootfs.ext2 в каталог ubuntu, целевой аркой для buildroot является i368, поэтому все должно быть в порядке, правильно?)
после создания и установки программы HelloWorld и в конечном итоге ее запуска я хотел бы добавить в init.d поэтому он запускается после загрузки и заменяет HelloWorld окном Qt, которому не нужен X-сервер, как эта вещь здесь.
главный источник вдохновения здесь.
2 ответов
В общем, источники для пакетов 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: относительно вашего дополнительного вопроса:
UPDATE: программа строит и устанавливает в нужном месте, но когда я пытаюсь запустить его вот так. :/ helloworld, I get: bash: ./helloworld: нет такого файла или каталога, это имеет права на исполнение.. что с ним такое? (Я пытаюсь запустить его после того, как я монтирую файловой системы.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
минимальный испытанный пример поверх 2016.05
GitHub вверх по течению: https://github.com/cirosantilli/buildroot/tree/in-tree-package-2016.05
эта команда добавляет источника пакета в дерево, просто в воспитательных целях, но не распространенное.
в реальных проектах более вероятно, что вы захотите использовать Buildroot в качестве подмодуля git и либо:
- из дерева пакет с
BR2_EXTERNAL
как показано на:https://github.com/cirosantilli/buildroot/tree/out-of-tree-2016.05 -
*_OVERRIDE_SRCDIR
+ другие подмодули git, как описано в:как изменить источник пакетов Buildroot для разработки пакетов?
файлы изменено:
пакет / конфигурация.в:
menu "Misc"
source "package/hello/Config.in"
endmenu
пакет / hello / Config.в:
config BR2_PACKAGE_HELLO
bool "hello"
help
Hello world package.
http://example.com
пакет / привет / привет.МК:
################################################################################
#
# 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/.пример:
hello
пакет/hello/src/Makefile:
CC = gcc
.PHONY: clean
hello: hello.c
$(CC) -o '$@' '$<'
clean:
rm hello
пакет / привет / src / привет.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.