2009-08-22 11 views
9

No puedo encontrar muchos documentos sobre esto. ¿Cómo empaco una gema de manera que la extensión C se compila cuando se instala la gema?¿Cómo envuelvo una extensión Ruby C en una Ruby Gem?

En particular, quiero hacer esto:

  • en Linux y MacOSX me gustaría compilar la extensión C de la gema instalar

  • en Windows Me gustaría simplemente instalar un .so precompilado

cualquier ayuda en esto, en particular fuente ejemplo, sería muy útil :)

Respuesta

14

Luis Lavena ha creado rake-compiler solo para este propósito.

Sin embargo, ¿está seguro de que necesita una extensión C? Lo que pasa con las extensiones C es que cada implementación de Ruby tiene su propia API de extensión C (y las que no están basadas en C, como XRuby, JRuby, Ruby.NET, IronRuby, HotRuby, MagLev, Red Sun no tienen ninguna), que significa que su extensión C solo funcionará en una implementación. Y, dado que MRI solo implementa Ruby 1.8 y YARV solo implementa Ruby 1.9, y actualmente estamos en una fase de transición entre 1.8 y 1.9, es probable que mucha gente use al menos dos implementaciones diferentes. (Yo personalmente uso 5: MRI, YARV, JRuby, IronRuby y Rubinius.)

Tal vez sea mejor que use Ruby-FFI. Ruby-FFI es una FFI (Foreign Function Interface) para Ruby (duh), que le permite enlazar y asignar bibliotecas C en Ruby puro de una manera que es portable en todas las implementaciones de Ruby. La API de FFI se desarrolló por primera vez por Evan Phoenix como la API de extensión nativa para Rubinius, luego fue adoptada por Charles Oliver Nutter (e implementada por Wayne Meissner) para JRuby. Wayne luego también escribió Ruby-FFI gem, que contiene extensiones C para MRI y YARV. Laurent Sansonetti implementó Ruby-FFI para MacRuby, Marc-André Cournoyer 's tinyrb también supports FFI (nuevamente escrito por Wayne Meissner) y los desarrolladores MagLev también están trabajando en ello. Lo que significa que si puede hacer que su biblioteca funcione con FFI en lugar de una extensión C, admitirá automáticamente 6 implementaciones de Ruby en lugar de solo una.

La única razón para utilizar una extensión C en lugar de una extensión FFI sería, si realmente hace quiere un comportamiento específico de implementación. Un ejemplo de esto sería la gema ParseTree, que llega hasta las profundidades de los intestinos de la RM y desgarra la representación en memoria del árbol de análisis sintáctico.

Por último pero no menos importante, eche un vistazo al proyecto Nice-FFI por John Croisant, cuyo objetivo es hacer que el uso de Ruby-FFI sea aún mejor.

+0

wow, se ve muy bien! gracias :) – horseyguy

+0

De nada! Eso fue egoísmo total, dicho sea de paso: uso Ruby en Windows, por lo que cuantos más autores de extensión usen rake-compiler, más extensiones se publicarán para Windows. (Pero ver a mi edición.) –

+0

parece que esta respuesta es de 09, y parte de la respuesta tiene que ser actualizado – Tilo

0

que tienen un acuerdo de recompra github que mantengo sólo para mi propia referencia y estas cosas me han ayudado.

Ruby_C_extensions

Se puede ayudar a mirar a su alrededor en github para encontrar algunos buenos ejemplos de gemas ya escritas sólo para su estudio, pero seguir adelante y clonar ellos y ver si se puede construir en su sistema. Si se juntaron bien, deberían construir bien.

Tenga en cuenta que usted no necesita algunas herramientas de construcción en cualquier plataforma que está utilizando. Aquí hay un video que acabo de ver que le dice lo que necesita para Linux.

Python Programming Environment Setup

Ahora conozco que dice que Python, que te muestra cómo instalar los paquetes de herramientas de construcción.

utilizo DevKit para Windows y funciona para mí. Con todo, la instalación de las herramientas es lo más importante.

También he utilizado el rastrillo y la azada-compilador para crear la estructura de carpetas. Entonces parece que tenemos que apoyarnos en la jardinería obteniendo un rastrillo y una azada. :-D

Cuestiones relacionadas