crate-type = ["staticlib"] à Cargo.toml.
Ensuite, vous devez lier la bibliothèque à CMake à l’aide de la bibliothèque Corrosion. La première étape consiste à ajouter le dossier de la bibliothèque dans le CMakeLists.txt situé dans le dossier /rust. Vous devez ensuite ajouter le fichier CMakeLists.txt au répertoire de la bibliothèque. Dans ce fichier, vous devez appeler la fonction d’importation de Corrosion. Les lignes suivantes ont été utilisées pour importer BLAKE3 :
_ch_rust_blake3 provient de Cargo.toml, où il est utilisé comme nom de projet (name = "_ch_rust_blake3").
Comme les types de données Rust ne sont pas compatibles avec les types de données C/C++, nous utiliserons notre projet de bibliothèque vide pour créer des méthodes d’adaptation assurant la conversion des données reçues depuis le C/C++, l’appel des méthodes de la bibliothèque, ainsi que la conversion inverse des données de sortie. Par exemple, cette méthode a été écrite pour BLAKE3 :
#[no_mangle] et extern "C" sont obligatoires pour toutes ces méthodes. Sans eux, il ne sera pas possible d’effectuer une compilation correctement compatible avec C/C++. De plus, ils sont nécessaires pour l’étape suivante de l’intégration.
Après avoir écrit le code des méthodes d’adaptation, nous devons préparer le fichier d’en-tête de la bibliothèque. Cela peut être fait manuellement, ou vous pouvez utiliser la bibliothèque cbindgen pour le générer automatiquement. Si vous utilisez cbindgen, vous devrez écrire un script de build build.rs et inclure cbindgen comme build-dependency.
Un exemple de script de build pouvant générer automatiquement un fichier d’en-tête :
extern "C" pour tout attribut destiné à être compatible avec C. Sans cela, la bibliothèque risque d’être mal compilée et cbindgen ne pourra pas lancer la génération automatique du fichier d’en-tête.
Après toutes ces étapes, vous pouvez tester votre bibliothèque dans un petit projet afin de repérer d’éventuels problèmes de compatibilité ou de génération de fichiers d’en-tête. Si des problèmes surviennent lors de la génération de ces fichiers, vous pouvez essayer d’ajuster cette génération à l’aide du fichier cbindgen.toml (vous trouverez un modèle ici : https://github.com/eqrion/cbindgen/blob/master/template.toml).
Il convient également de signaler un problème rencontré lors de l’intégration de BLAKE3 :
MemorySanitizer peut provoquer de faux positifs, car il est incapable de déterminer si certaines variables en Rust sont initialisées ou non. Le problème a été résolu en écrivant une méthode dont la définition est plus explicite pour certaines variables, même si cette implémentation est plus lente et n’est utilisée que pour corriger les builds avec MemorySanitizer.