2010-08-28 12 views
7

Recientemente comencé a aprender XS usando perlxstut y el tutorial sugiere que creo mi módulo usando la herramienta h2xs anterior para crear un proyecto basado en ExtUtils::MakeMaker. Sin embargo, para los proyectos puros de Perl, h2xs/EUMM se ha desfavorecido durante mucho tiempo a favor de Module::Install, Module::Build o Dist::Zilla.¿Qué herramientas pueden ayudar a construir un proyecto XS?

¿Existe alguna forma más moderna de crear proyectos XS? ¿Puede Module::Starter crear proyectos XS? ¿Puede Module :: Build or Dist :: Zilla construir proyectos XS? Sus páginas de pod permanecen en silencio sobre el asunto.

Por otro lado, ¿la crítica que se aplicó a h2xs/EUMM se aplica a los proyectos de XS? Si necesita un compilador de C de todos modos, ¿es razonable exigir una herramienta de marca también?

EDIT: Veo this question responde a mi pregunta sobre la creación de un proyecto. Todavía me gustaría saber sobre la construcción: ¿EUMM es la única opción, o son Module :: Build y Dist :: Zilla también capaces de construir XS?

Respuesta

4

Resulta que Module :: Build es perfectamente capaz de compilar XS. Aquí es un Build.PL completa logré juntar:

use strict; 
use Module::Build; 

my $build = Module::Build->new(
    module_name => 'Chocolate::Belgian', 
    dynamic_config => 1, 
    license  => 'perl', 
    requires  => { 
     'Module::Build' => '0.19', # xs 
     'Test::More' => 0, 
    }, 
    extra_compiler_flags => '-Iinclude', 
    extra_linker_flags => '', 
    c_source  => 'src', 
    needs_compiler => 1, 
    xs_files  => { 
     './Belgian.xs' => 'lib/Chocolate/Belgian.xs', 
    }, 

    ); 

$build->create_build_script; 

Esto construirá una distribución con .h incluyen archivos (como ppport.h) en los directorios, include/.c archivos de origen en el directorio src/, y un .xs archivo correspondiente al paquete Chocolate::Belgian en el directorio base del proyecto.

extra_compiler_flags corresponde hacer CCFLAGS, mientras extra_linker_flags corresponde a LIBS (lo que podría querer -lm allí para enlazar la biblioteca matemática C).

+1

Como estaba pidiendo comentarios en un comentario: Esto se ve bien después de una inspección rápida. Nits: quizás agregue una dependencia en ExtUtils :: CBuilder (needs_compiler podría estar haciendo esto ya). ¿Estás seguro de que necesitas dynamic_config: 1? Apuesto a que no. Además, es posible que desee agregar Module :: Build para configurar_requires en lugar de require. Creo que agrega automáticamente una dependencia a la versión más reciente si no la encuentra. Intente eliminar esa línea, ejecute "./Build dist" e inspeccione el META.yml/META.json generado para mencionar Module :: Build. – tsee

+0

@tsee: muchas gracias por su comentario. Lo hice wiki comunitario, así que puedes poner cualquier cambio que desees si quieres. –

+0

Hmmm ... La página Module :: Build :: API dice que needs_compiler está disponible después de M :: B versión .36, y que se establece en true automáticamente si c_source existe o el código xs se encuentra en alguna parte. Si es verdadero, agrega ExtUtils :: CBuilder automáticamente como un elemento build_requires. –

2

Dist :: Zilla es no un sustituto de la EUMM o módulo :: Build, lo que hará es generar un Makefile.Pl (etc) para usted, no me sorprendería escuchar que no puede hacer esto para un proyecto XS, pero hay formas de administrar el suyo para un proyecto dzil. Puede funcionar con cualquier Makefile.Pl que se proporcione (o Build.pl).

Así que mi respuesta sobre la parte de Dist :: Zilla de su pregunta es, Dist :: Zilla no cumple esa función en un proyecto.

+1

Gracias por esto, se me ha aclarado mucho en mi mente. La investigación identifica aún más a Dist :: Zilla :: Plugin :: MakeMaker :: Awesome que reclama capacidad parcial de XS. –

1

Siempre utilizo una distribución XS bastante simple como punto de partida. h2xs puede hacer algo de la generación XS al analizar un encabezado, pero la mayoría de las veces, encontré que demasiado limitado para ser útil.

Si planea envolver C++, es posible que desee echar un vistazo a Module :: Build :: WithXSpp.

+0

Gracias por su respuesta. ¿Qué usas para construir tu distribución? –

+1

Empecé usando MakeMaker ya que parecía el más simple. Hoy en día, suelo usar Module :: Build (que, diría, tiene un poco más de una curva de aprendizaje para XS/C) porque creo que me da más flexibilidad sin tener que hackear Makefiles. También fue bastante fácil extenderse para hacer la magia loca en Module :: Build :: WithXSpp. – tsee

+0

¿podría proporcionarme un ejemplo de Module :: Build para XS o revisar el de mi respuesta? Soy nuevo en esto y estoy tratando de encontrar las mejores prácticas para crear proyectos XS. –

Cuestiones relacionadas