2010-08-28 7 views
7

Recentemente ho iniziato a studiare XS utilizzando perlxstut e il tutorial suggerisce di creare il mio modulo utilizzando il vecchio strumento per creare un progetto basato su ExtUtils::MakeMaker. Tuttavia, per i progetti Perl puri, h2xs/EUMM è stato a lungo sfavorito a favore di Module::Install, Module::Build o Dist::Zilla.Quali strumenti possono aiutare a costruire un progetto XS?

Esiste un modo più moderno di creare progetti XS? Module::Starter può creare progetti XS? Modulo: Build o Dist :: Zilla può generare progetti XS? Le loro pagine pod sono silenziose sull'argomento.

Il rovescio della medaglia, la critica che è stata livellata a h2xs/EUMM si applica ai progetti XS? Se hai comunque bisogno di un compilatore C, è ragionevole richiedere anche uno strumento di creazione?

MODIFICA: Vedo this question risponde alla mia domanda sulla creazione di un progetto. Mi piacerebbe sapere ancora qualcosa sulla costruzione: l'EUMM è l'unica opzione, oppure Module :: Build e Dist :: Zilla è anche in grado di costruire XS?

risposta

4

Si scopre che Module :: Build è perfettamente in grado di compilare XS. Qui è un Build.PL completa sono riuscito a racimolare:

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; 

Questo creerà una distribuzione con .h includono file (come ppport.h) nei include/ directory, .c file sorgente nella directory src/, ed un .xs file corrispondente al pacchetto Chocolate::Belgian nella directory di base del progetto.

extra_compiler_flags corrisponde a fare CCFLAGS, mentre extra_linker_flags corrisponde a LIBS (così si potrebbe desiderare -lm lì per collegare la libreria matematica C).

+1

Dato che stavi chiedendo un feedback in un commento: questo sembra buono dopo una rapida ispezione. Nits: Forse aggiungere una dipendenza su ExtUtils :: CBuilder (needs_compiler potrebbe farlo già). Sei sicuro di aver bisogno di dynamic_config: 1? Scommetto che non lo fai. Inoltre, potresti voler aggiungere Module :: Build a configure_requires invece di require. Credo che aggiunga automaticamente una dipendenza alla versione più recente se non la trova affatto. Prova a rimuovere quella linea, eseguendo "./Build dist" e ispezionando il file META.yml/META.json generato per menzionare Module :: Build. – tsee

+0

@tsee: grazie mille per la tua recensione. L'ho creato come wiki della comunità, quindi puoi inserire tutte le modifiche che vuoi, se lo desideri. –

+0

Hmmm ... La pagina Module :: Build :: API dice che needs_compiler è disponibile dopo M: B versione .36, e che è impostato su true automaticamente se c_source esiste o il codice xs viene trovato da qualche parte. Se true, aggiunge automaticamente ExtUtils :: CBuilder come elemento build_requires. –

2

Dist :: Zilla non è un sostituto per EUMM o Modulo :: costruire, cosa che farà è di generare un Makefile.Pl (etc) per te, non sarei sorpreso di sentire che non può fare questo per un progetto XS, ma ci sono modi per gestirne uno per un progetto Dzil. Può funzionare con qualsiasi Makefile.Pl fornito con (o Build.pl).

Quindi la mia risposta sulla parte Dist :: Zilla della domanda è, Dist :: Zilla non riempie quel ruolo in un progetto.

+1

Grazie per questo, ha chiarito molto dzil nella mia mente. Indagare ulteriormente identifica Dist :: Zilla :: Plugin :: MakeMaker :: Awesome che reclama funzionalità XS parziale. –

1

Uso sempre una distribuzione XS piuttosto semplice come punto di partenza. h2xs può fare un po 'della generazione XS analizzando un'intestazione, ma la maggior parte delle volte, ho trovato che troppo limitato per essere utile.

Se hai intenzione di avvolgere C++, potresti dare un'occhiata a Module :: Build :: WithXSpp.

+0

Grazie per la risposta. Cosa usi per costruire la tua distribuzione? –

+1

Ho iniziato a utilizzare MakeMaker in quanto sembrava il più semplice. Al giorno d'oggi, di solito uso Module :: Build (che, direi, ha un po 'più di una curva di apprendimento per le cose XS/C) perché sento che mi dà più flessibilità senza dover hackerare Makefiles. È stato anche abbastanza semplice estendere la magia folle in Module :: Build :: WithXSpp. – tsee

+0

potresti fornire un esempio Module :: Build per XS o rivedere quello nella mia risposta? Sono nuovo di questo e sto cercando di trovare le migliori pratiche per la creazione di progetti XS. –