Sha256: 14b02f95134fc1306cf68591213b06927f86aef4e23a51c0f536849512ff9b84

Contents?: true

Size: 1.72 KB

Versions: 22

Compression:

Stored size: 1.72 KB

Contents

[ffi-compiler](https://github.com/ffi/ffi-compiler) is a ruby library for automating compilation of native libraries for use with [ffi](https://github.com/ffi/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 

Version data entries

22 entries across 22 versions & 5 rubygems

Version Path
ffi-compiler-0.1.1 README.md
ffi-compiler-0.1.0 README.md