Comment ajouter un paquet Buildroot pour un projet Cargo
Le support de Rust et Cargo pour Buildroot est disponible dans la branche "feature/rust" de ce dépôt Buildroot (personnel).
Dans cet article, nous expliquerons comment ajouter un paquet Buildroot pour un projet Cargo, (nommé "hello-rust"). L'infrastructure pour des paquets Cargo sera peut-être ajoutée dans le futur, afin de faciliter le développement de paquets.
Nous prendrons l'exemple de la construction d'un système QEMU/Aarch64, qui incluera ce projet.
Création du paquet
Comme le paquet pour le projet "hello-rust" n'est d'aucune utilité pour la version officielle de Buildroot, le paquet sera ajouté dans un répertoire spécifique. Ce type d'environnement est décrit dans la section 9.2 du manuel utilisateur de Buildroot.
Premièrement, créez un répertoire spécifique au projet, contenant le répertoire du paquet:
Ensuite, ajoutez un morceau de Makefile pour déclarer le nouveau paquet:
echo 'include $(sort $(wildcard $(BR2_EXTERNAL)/package/*/*.mk))' \ > $HOME/src/br2-ext-rust/external.mk
Enfin, ajoutez un fichier pour déclarer une entrée dans le menu de configuration pour le nouveau paquet:
Il est temps de créer le paquet en lui-même. Créez un fichier nommé
$HOME/src/br2-ext-rust/package/hello-rust/Config.in
avec le contenu
suivant:
config BR2_PACKAGE_HELLO_RUST bool "hello-rust" depends on BR2_PACKAGE_HOST_CARGO help "Hello World!" program written in Rust
Ensuite, créez le fichier
$HOME/src/br2-ext-rust/package/hello-rust/hello-rust.mk
, avec le contenu
suivant:
################################################################################ # # hello-rust # ################################################################################ HELLO_RUST_VERSION = 0.1.1 HELLO_RUST_SITE = $(HOME)/src/hello-rust HELLO_RUST_SITE_METHOD = local HELLO_RUST_LICENSE = Public Domain HELLO_RUST_DEPENDENCIES = host-cargo HELLO_RUST_CARGO_ENV = \ CARGO_HOME=$(HOST_DIR)/usr/share/cargo \ RUST_TARGET_PATH=$(HOST_DIR)/etc/rustc HELLO_RUST_CARGO_OPTS = \ --target=$(GNU_TARGET_NAME) \ --manifest-path=$(@D)/Cargo.toml ifeq ($(BR2_ENABLE_DEBUG),y) HELLO_RUST_CARGO_MODE = debug else HELLO_RUST_CARGO_MODE = release endif HELLO_RUST_CARGO_OPTS += --$(HELLO_RUST_CARGO_MODE) define HELLO_RUST_BUILD_CMDS $(TARGET_MAKE_ENV) $(HELLO_RUST_CARGO_ENV) \ cargo build $(HELLO_RUST_CARGO_OPTS) endef define HELLO_RUST_INSTALL_TARGET_CMDS $(INSTALL) -D \ $(@D)/target/$(GNU_TARGET_NAME)/$(HELLO_RUST_CARGO_MODE)/hello-rust \ $(TARGET_DIR)/usr/bin/hello-rust endef $(eval $(generic-package))
Construction de l'Image Système
Premièrement, clonez le dépôt Buildroot avec le support de Rust et basculer sur la branche:
git clone https://github.com/elebihan/buildroot cd buildroot git checkout --track origin/feature/rust
Pour créer une image pour un système QEMU/Aarch64, un fichier defconfig personnalisé avec la configuration adéquate pour construire des projets Cargo sera utilisé. Créez le fichier defconfig comme ceci:
cat <<EOF > qemu_aarch64_virt_rust_defconfig BR2_aarch64=y BR2_TOOLCHAIN_EXTERNAL=y BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0" BR2_SYSTEM_DHCP="eth0" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_VERSION=y BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.5" BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/aarch64-virt/linux-4.5.config" BR2_TARGET_ROOTFS_INITRAMFS=y # BR2_TARGET_ROOTFS_TAR is not set BR2_PACKAGE_HOST_CARGO=y BR2_PACKAGE_HOST_RUST=y EOF
Ensuite, initialisez l'environnement de construction, en indiquant le répertoire spécifique au projet, ainsi que le defconfig personnalisé:
make O=$HOME/build/demo-rust/qemu/aarch64 \ BR2_EXTERNAL=$HOME/src/br2-ext-rust \ BR2_DEFCONFIG=qemu_aarch64_virt_rust_defconfig \ defconfig
Éditez la configuration pour sélectionner le paquet "hello-rust", disponible dans le menu "User-provided options".
Démarrez la construction:
Quand la construction est finie, vérifiez que le programme hello-rust est disponible sur la cible:
Exécution du Programme depuis le Système
Maintenant, vous pouvez démarrer votre système avec QEMU:
qemu-system-aarch64 \ -nographic \ -M virt \ -cpu cortex-a57 \ -smp 1 \ -kernel $HOME/build/demo-rust/qemu/aarch64/images/Image \ -append "console=ttyAMA0" \ -netdev user,id=eth0 \ -device virtio-net-device,netdev=eth0 \ -serial mon:stdio
Connectez vous en tant que "root" (pas de mot de passe) et exécutez le programme de test:
Et voilà!