如何在`gem install`期间为ffi创建C库

时间:2015-03-05 08:15:08

标签: ruby gem ffi

最近我用ffi写了一个宝石。有了这个帮助,ruby代码可以使用动态库调用C扩展,我将所有C扩展编译成。

我的宝石结构是这样的:

.
├── ext
│   ├── common.c
│   ├── common.h
│   ├── Makefile
│   └── ...
├── Gemfile
├── lib
│   ├── ...
│   │   └── version.rb
│   └── ...
├── Rakefile
├── README.md
└── test

我打算在make中运行./ext,然后一切正常。

但是,问题就出现了。如果其他用户使用gem install安装我的gem,如何为自己创建C库?

有人愿意帮我吗?任何想法都是受欢迎的。

1 个答案:

答案 0 :(得分:1)

  1. 看看ffi-compiler。宝石的页面上有一个例子:
  2. 实施例

    目录布局
    lib
      |- example
          |- example.rb
    
    ext
      |- example.c
      |- Rakefile
    
    example.gemspec
    
    LIB /示例/ 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 / Rake文件
    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
    
    构建gem并安装它
    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
    
    测试一下
    $ 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 
    
    1. 您可以在gem安装过程中以这种方式运行make命令:

      • spec.extensions << 'ext/mkrf_conf.rb'添加到您的gemspec。
      • 创建ext/mkrf_conf.rb文件:

      任务:默认{`make`}

      • 享受!