2.47
Low commit activity in last 3 years
A long-lived project that still receives updates
Ruby FFI library
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

Runtime

>= 1.15.5
>= 0
 Project Readme

ffi-compiler is a ruby library for automating compilation of native libraries for use with ffi

To use, define your own ruby->native API using ffi, implement it in C, then use ffi-compiler to compile it.

Example

Directory layout
lib
  |- example
      |- example.rb
      
ext
  |- example.c
  |- Rakefile
  
example.gemspec
lib/example/example.rb
require 'ffi'
require 'ffi-compiler/loader'

module Example
  extend FFI::Library
  ffi_lib FFI::Compiler::Loader.find('example')
  
  # example function which takes no parameters and returns long
  attach_function :example, [], :long
end
ext/example.c
long
example(void)
{
    return 0xdeadbeef;
}
ext/Rakefile
require 'ffi-compiler/compile_task'

FFI::Compiler::CompileTask.new('example') do |c|
  c.have_header?('stdio.h', '/usr/local/include')
  c.have_func?('puts')
  c.have_library?('z')
end
example.gemspec
Gem::Specification.new do |s|
  s.extensions << 'ext/Rakefile'
  s.name = 'example'
  s.version = '0.0.1'
  s.email = 'ffi-example'
  s.files = %w(example.gemspec) + Dir.glob("{lib,spec,ext}/**/*")
  s.add_dependency 'rake'
  s.add_dependency 'ffi-compiler'
end
Build gem and install it
gem build example.gemspec && gem install example-0.0.1.gem
Successfully built RubyGem
  Name: example
  Version: 0.0.1
  File: example-0.0.1.gem
Building native extensions.  This could take a while...
Successfully installed example-0.0.1
Test it
$ irb
2.0.0dev :001 > require 'example/example'
 => true 
2.0.0dev :002 > puts "Example.example=#{Example.example.to_s(16)}"
Example.example=deadbeef
 => nil