2010-08-28 9 views
7

Ich habe vor kurzem angefangen zu lernen XS mit perlxstut und das Tutorial schlägt vor, dass ich mein Modul mit dem alten h2xs Werkzeug erstellen, um eine ExtUtils::MakeMaker-basierte Projekt zu erstellen. Bei reinen Perl-Projekten ist h2xs/EUMM jedoch seit langem zugunsten von Module::Install, Module::Build oder Dist::Zilla benachteiligt.Mit welchen Tools kann ein XS-Projekt erstellt werden?

Gibt es eine modernere Art, XS-Projekte zu erstellen? Kann XS-Projekte erstellen? Kann Module :: Build oder Dist :: Zilla XS-Projekte erstellen? Ihre Pod-Seiten sind still darüber.

Auf der anderen Seite, gilt die Kritik an h2xs/EUMM für XS-Projekte? Wenn Sie trotzdem einen C-Compiler benötigen, ist es auch sinnvoll, ein make-Tool zu verlangen?

EDIT: Ich sehe this question antwortet meine Frage zum Erstellen eines Projekts. Ich möchte immer noch etwas über das Bauen wissen: Ist EUMM die einzige Option, oder sind Module :: Build und Dist :: Zilla auch in der Lage, XS zu bauen?

Antwort

4

Es stellt sich heraus, dass Module :: Build perfekt in der Lage ist, XS zu kompilieren. Dies ist die komplette Build.PL ich zusammen kratzen verwaltet:

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; 

Diese eine Verteilung bauen mit .h Include-Dateien (wie ppport.h) in den include/ Verzeichnis, .c Quelldateien im Verzeichnis src/ und ein .xs Datei, die dem Paket Chocolate::Belgian im Projektbasisverzeichnis entspricht.

extra_compiler_flags entspricht CCFLAGS zu machen, während extra_linker_flags-LIBS entspricht (so könnte man -lm dort wollen die C-Mathematik-Bibliothek zu verknüpfen).

+1

Da Sie in einem Kommentar nach Feedback gefragt haben: Das sieht nach einer kurzen Inspektion gut aus. Nits: Vielleicht fügen Sie eine Abhängigkeit von ExtUtils :: CBuilder hinzu (needs_compiler macht das vielleicht schon). Bist du dir sicher, dass du dynamic_config brauchst: 1? Ich wette, du tust es nicht. Darüber hinaus möchten Sie möglicherweise Module :: Build zu configure_requires anstelle von requires hinzufügen. Ich glaube, dass es automatisch eine Abhängigkeit von der neuesten Version hinzufügt, wenn sie diese überhaupt nicht findet. Versuchen Sie, diese Zeile zu entfernen, führen Sie "./Build dist" aus und überprüfen Sie die generierte META.yml/META.json auf Erwähnung von Module :: Build. – tsee

+0

@tsee: vielen Dank für Ihre Bewertung. Ich habe es Community-Wiki gemacht, so dass Sie beliebige Änderungen hinzufügen können, wenn Sie möchten. –

+0

Hmmm ... Die Module :: Build :: API-Seite besagt, dass needs_compiler nach M :: B Version .36 verfügbar ist und automatisch auf true gesetzt wird, wenn c_source existiert oder xs code irgendwo gefunden wird. Wenn dies der Fall ist, wird ExtUtils :: CBuilder automatisch als build_requires Element hinzugefügt. –

2

Dist :: Zilla ist nicht Ersatz für EUMM oder Module :: Bauen, was es tun werden, ist ein generieren Makefile.Pl (etc) für Sie, wäre ich nicht überrascht zu hören, dass es nicht das tun kann für ein XS-Projekt, aber es gibt Möglichkeiten, Ihre eigenen für ein Dzil-Projekt zu verwalten. Es kann mit allem arbeiten, was mit (oder Build.pl) bereitgestellt wird.

Also meine Antwort auf den Dist :: Zilla Teil Ihrer Frage ist, Dist :: Zilla füllt diese Rolle in einem Projekt nicht.

+1

Dank dafür hat es dzil in meinen Gedanken sehr geklärt. Die weitere Untersuchung identifiziert Dist :: Zilla :: Plugin :: MakeMaker :: Awesome, das teilweise XS-Fähigkeit beansprucht. –

1

Ich benutze immer nur eine ziemlich einfache XS-Distribution als Ausgangspunkt. h2xs kann etwas von der XS-Generation machen, indem er eine Kopfzeile analysiert, aber die meiste Zeit fand ich das zu begrenzt, um nützlich zu sein.

Wenn Sie planen, C++ zu integrieren, sollten Sie sich Module :: Build :: WithXSpp ansehen.

+0

Danke für Ihre Antwort. Wofür verwenden Sie Ihre Distribution? –

+1

Ich habe mit Make Maker angefangen, da das am einfachsten schien. Heutzutage benutze ich normalerweise Module :: Build (was, ich würde sagen, etwas mehr von einer Lernkurve für XS/C-Sachen), weil ich denke, dass es mir mehr Flexibilität gibt, ohne Makefiles hacken zu müssen. Es war auch ziemlich einfach zu erweitern, um die verrückte Magie in Module :: Build :: WithXSpp zu tun. – tsee

+0

könnten Sie ein Modul :: Build-Beispiel für XS bereitstellen oder das in meiner Antwort überprüfen? Ich bin neu und versuche, Best Practices für die Erstellung von XS-Projekten zu finden. –

Verwandte Themen