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:

mkdir -p $HOME/src/br2-ext-rust/package/hello-rust

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:

echo 'source "$BR2_EXTERNAL/package/hello-rust/Config.in"' \
     > $HOME/src/br2-ext-rust/Config.in

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".

make O=$HOME/build/demo-rust/qemu/aarch64 menuconfig

Démarrez la construction:

make O=$HOME/build/demo-rust/qemu/aarch64

Quand la construction est finie, vérifiez que le programme hello-rust est disponible sur la cible:

$ file -b $HOME/build/demo-rust/qemu/aarch64/target/usr/bin/hello-rust
ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=06d2333136445d9a331ad02fb47861cf10654477, stripped

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:

Welcome to Buildroot
buildroot login: root
# hello-rust
Hello World!

Et voilà!