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
Edit:そして、ソース "package/HelloWorld/Config.in"も 'packageに追加しました/Config.in 'しかし、rootfs.ext2パーティションをマウントすると、/ usr/bin内にHelloWorld実行可能ファイルが見つかりません。私はこれに本当に慣れていないので、事前の知識がありません。私にとって、これから何が欠けているのか、私は何か間違ったことをしていると確信しているからです。
UPDATE:プログラムは目的の場所にビルドおよびインストールされますが、次のように実行しようとすると:./helloworld、次のようになります:bash:./ helloworld:そのようなファイルやディレクトリはありません。実行権限があります。問題は何ですか? (rootfs.ext2をubuntuディレクトリにマウントした後で実行しようとしています。buildrootのターゲットArchはi368なので、問題ないはずです。)
HelloWorldプログラムをビルドしてインストールし、最終的にそれを実行した後、起動後に開始するようにinit.dに追加し、HelloWorldを次のようにXサーバーを必要としないQtウィンドウに置き換えます。 ここ 。
インスピレーションの主な情報源 ここ 。
一般に、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の場合、ext2ではなく、「tar」ファイルシステム形式を使用する必要があります。こちらもご覧ください: 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パッケージのソースをパッケージ開発用に変更する方法変更されたファイル:
package/Config.in:
menu "Misc"
source "package/hello/Config.in"
endmenu
package/hello/Config.in:
config BR2_PACKAGE_HELLO
bool "hello"
help
Hello world package.
http://example.com
package/hello/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))
package/hello/src/.gitignore:
hello
package/hello/src/Makefile:
CC = gcc
.PHONY: clean
hello: hello.c
$(CC) -o '$@' '$<'
clean:
rm hello
package/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でテスト済み。