diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-06-11 22:32:06 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-06-11 22:32:06 +0000 |
commit | 467298a34215401cdcbb1dded51bc2aba5f1f41c (patch) | |
tree | 1923f32fbc9cf8f0b4ab291d1eb9fad5ab872d68 /t/xs.t | |
download | Module-Build-tarball-master.tar.gz |
Module-Build-0.4214HEADModule-Build-0.4214master
Diffstat (limited to 't/xs.t')
-rw-r--r-- | t/xs.t | 217 |
1 files changed, 217 insertions, 0 deletions
@@ -0,0 +1,217 @@ +#!/usr/bin/perl -w + +use strict; +use lib 't/lib'; +use MBTest; +use Config; + +my $tmp; + +blib_load('Module::Build'); + +{ + my ($have_c_compiler, $tmp_exec) = check_compiler(); + + if ( !$have_c_compiler ) { + plan skip_all => 'No compiler found'; + } elsif ( $^O eq 'VMS' ) { + plan skip_all => 'Child test output confuses harness'; + } elsif ( !$Config{usedl} ) { + plan skip_all => 'Perl not compiled for dynamic loading' + } else { + plan tests => 22; + } + require Cwd; + $tmp = MBTest->tmpdir( $tmp_exec ? () : (DIR => Cwd::cwd) ); +} + + + +######################### + +use DistGen; +my $dist = DistGen->new( dir => $tmp, xs => 1 )->chdir_in->regen; + +my $mb = $dist->new_from_context; + +eval {$mb->dispatch('clean')}; +is $@, ''; + +eval {$mb->dispatch('build')}; +is $@, ''; + +{ + # Make sure it actually works: that we can call methods in the XS module + + # Unfortunately, We must do this is a subprocess because some OS will not + # release the handle on a dynamic lib until the attaching process terminates + + ok $mb->run_perl_command(['-Mblib', '-M'.$dist->name, '-e1']); + + like stdout_of( sub {$mb->run_perl_command([ + '-Mblib', '-M'.$dist->name, + '-we', "print @{[$dist->name]}::okay()"])}), qr/ok$/; + + like stdout_of( sub {$mb->run_perl_command([ + '-Mblib', '-M'.$dist->name, + '-we', "print @{[$dist->name]}::version()"])}), qr/0.01$/; + + like stdout_of( sub {$mb->run_perl_command([ + '-Mblib', '-M'.$dist->name, + '-we', "print @{[$dist->name]}::xs_version()"])}), qr/0.01$/; + +} + +{ + # Try again in a subprocess + eval {$mb->dispatch('clean')}; + is $@, ''; + + + $mb->create_build_script; + my $script = $mb->build_script; + ok -e $script; + + eval {$mb->run_perl_script($script)}; + is $@, ''; +} + +# We can't be verbose in the sub-test, because Test::Harness will +# think that the output is for the top-level test. +stdout_stderr_of( sub { eval {$mb->dispatch('test')} }); +is $@, ''; + +eval {$mb->dispatch('clean')}; +is $@, ''; + + +SKIP: { + skip( "skipping a Unixish-only tests", 1 ) + unless $mb->is_unixish; + + $mb->{config}->push(ld => "FOO=BAR ".$mb->config('ld')); + eval {$mb->dispatch('build')}; + is $@, ''; + $mb->{config}->pop('ld'); +} + +eval {$mb->dispatch('realclean')}; +is $@, ''; + +# Make sure blib/ is gone after 'realclean' +ok ! -e 'blib'; + +######################################## + +# Try a XS distro with a deep namespace + + +$dist->reset( name => 'Simple::With::Deep::Name', dir => $tmp, xs => 1 ); +$dist->chdir_in->regen; + +$mb = $dist->new_from_context; + +eval { $mb->dispatch('build') }; +is $@, ''; + +stdout_stderr_of( sub { eval { $mb->dispatch('test') } } ); +is $@, ''; + +eval { $mb->dispatch('clean') }; + +eval { $mb->dispatch('build', 'pureperl_only' => 1) }; +like $@, qr/\ACan\'t build xs files under --pureperl-only/, 'Can\'t build xs under pureperl'; + +eval { $mb->dispatch('build', pureperl_only => 1, allow_pureperl => 1) }; +is $@, '', 'Can\'t build xs under pureperl, unless allow_pureperl'; + +eval { $mb->dispatch('realclean') }; +is $@, ''; + +######################################## + +# Try a XS distro using a flat directory structure +# and a 'dist_name' instead of a 'module_name' + +$dist->reset( name => 'Dist-Name', dir => $tmp, xs => 1 )->chdir_in; + +$dist->remove_file('lib/Dist-Name.pm'); +$dist->remove_file('lib/Dist-Name.xs'); + +$dist->change_build_pl + ({ + dist_name => 'Dist-Name', + dist_version_from => 'Simple.pm', + pm_files => { 'Simple.pm' => 'lib/Simple.pm' }, + xs_files => { 'Simple.xs' => 'lib/Simple.xs' }, + }); + +$dist->add_file('Simple.xs', <<"---"); +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +MODULE = Simple PACKAGE = Simple + +SV * +okay() + CODE: + RETVAL = newSVpv( "ok", 0 ); + OUTPUT: + RETVAL +--- + +$dist->add_file( 'Simple.pm', <<"---" ); +package Simple; + +\$VERSION = '0.01'; + +require Exporter; +require DynaLoader; + +\@ISA = qw( Exporter DynaLoader ); +\@EXPORT_OK = qw( okay ); + +bootstrap Simple \$VERSION; + +1; + +__END__ + +=head1 NAME + +Simple - Perl extension for blah blah blah + +=head1 DESCRIPTION + +Stub documentation for Simple. + +=head1 AUTHOR + +A. U. Thor, a.u.thor\@a.galaxy.far.far.away + +=cut +--- +$dist->change_file('t/basic.t', <<"---"); +use Test::More tests => 2; +use strict; + +use Simple; +ok( 1 ); + +ok( Simple::okay() eq 'ok' ); +--- + +$dist->regen; + +$mb = $dist->new_from_context; + +eval { $mb->dispatch('build') }; +is $@, ''; + +stdout_of( sub { eval { $mb->dispatch('test') } } ); +is $@, ''; + +eval { $mb->dispatch('realclean') }; +is $@, ''; + |