Ruby-FFI est un joyau permettant de charger par programme des bibliothèques natives liées dynamiquement, de lier des fonctions en leur sein et d'appeler ces fonctions à partir du code Ruby. De plus, une extension Ruby-FFI fonctionne sans modifications sur CRuby (MRI), JRuby, Rubinius et TruffleRuby. Découvrez pourquoi vous devriez écrire votre prochaine extension en utilisant Ruby-FFI.
require 'ffi'
module MyLib
extend FFI :: Library
ffi_lib 'c'
attach_function :puts , [ :string ] , :int
end
MyLib . puts 'Hello, World using libc!'
Pour des exemples moins minimalistes et plus nombreux, vous pouvez consulter :
samples/
Lors de l'installation de la gem sur CRuby (MRI), vous aurez besoin de :
gcc
ou clang
sur tout le reste) En option (accélère l'installation) :libffi
et les en-têtes de développement - cela se trouve généralement dans les packages libffi-dev
ou libffi-devel
La gemme ffi est livrée avec une version libffi intégrée, qui est utilisée lorsque la bibliothèque système libffi n'est pas disponible ou est trop ancienne. L'utilisation du système libffi peut être imposée par :
gem install ffi -- --enable-system-libffi # to install the gem manually
bundle config build.ffi --enable-system-libffi # for bundle install
ou empêché par --disable-system-libffi
.
Sur les systèmes Linux fonctionnant avec PaX (Gentoo, Alpine, etc.), FFI peut déclencher des erreurs mprotect
. Vous devrez peut-être désactiver mprotect pour Ruby ( paxctl -m [/path/to/ruby]
) pour le moment jusqu'à ce qu'une solution soit trouvée.
Sur les systèmes FreeBSD, pkgconf doit être installé pour que la gem puisse être compilée à l'aide de clang. Installez soit via les packages pkg install pkgconf
, soit à partir des ports via devel/pkgconf
.
Sur JRuby et TruffleRuby, il n'y a aucune exigence pour installer la gemme FFI, et require 'ffi'
fonctionne même sans installer la gemme (c'est-à-dire que la gemme est préinstallée sur ces implémentations).
De rubygems :
[sudo] gem install ffi
À partir d'un Gemfile en utilisant git ou GitHub
gem 'ffi', github: 'ffi/ffi', submodules: true
ou depuis le dépôt git sur github :
git clone git://github.com/ffi/ffi.git
cd ffi
git submodule update --init --recursive
bundle install
rake install
--enable-system-libffi
: Forcer l'utilisation du système libffi--disable-system-libffi
: forcer l'utilisation de la libffi intégrée--enable-libffi-alloc
: Forcer l'allocation de fermeture par libffi--disable-libffi-alloc
: Forcer l'allocation de fermeture par la méthode intégrée La bibliothèque ffi est couverte par la licence BSD, voir également le fichier LICENSE. Les spécifications sont couvertes par la même licence que ruby/spec, la licence MIT.
Les personnes suivantes ont soumis du code, des rapports de bogues ou ont autrement contribué au succès de ce projet :