I know some people were looking into this but it turned out to be fairly easy. Needs live testing though.
David ---------- Forwarded message ---------- From: <dagol...@cvs.perl.org> Date: Aug 28, 2009 6:30 PM Subject: [svn:Module-Build] r13232 - in Module-Build/trunk: . lib/Module/Build t To: <svn-commit-modules-module-bu...@perl.org> Author: dagolden Date: Fri Aug 28 15:29:59 2009 New Revision: 13232 Modified: Module-Build/trunk/Changes Module-Build/trunk/lib/Module/Build/API.pod Module-Build/trunk/lib/Module/Build/Base.pm Module-Build/trunk/t/extend.t Module-Build/trunk/t/share_dir.t Log: share_dir installation support complete share_dirs now install, hopefully correctly. This needs offline verification or optional testing only if File::ShareDir is installed. Todo: add File::ShareDir to requires automatically with an appropriate minimum version for "new" style share directory layout. Modified: Module-Build/trunk/Changes ============================================================================== --- Module-Build/trunk/Changes (original) +++ Module-Build/trunk/Changes Fri Aug 28 15:29:59 2009 @@ -6,6 +6,9 @@ - Generates MYMETA.yml during Build.PL (new standard protocol for communicating configuration results between toolchain components) [David Golden] + - Added 'share_dir' property top provide File::ShareDir support; + set automatically if a directory called 'share' exists + [David Golden] Bug fixes: - Fix the t/destinations.t fix. [David Golden, with thanks to Eric Wilhelm] Modified: Module-Build/trunk/lib/Module/Build/API.pod ============================================================================== --- Module-Build/trunk/lib/Module/Build/API.pod (original) +++ Module-Build/trunk/lib/Module/Build/API.pod Fri Aug 28 15:29:59 2009 @@ -737,6 +737,32 @@ instead of C<script_files>. Please consider this usage deprecated, though it will continue to exist for several version releases. +=item share_dir + +[version 0.36] + +An optional parameter specifying directories of static data files to +be installed as read-only files for use with L<File::ShareDir>. The +C<share_dir> property supports both distribution-level and +module-level share files. + +The default when C<share_dir> is not set is for any files in a F<share> +directory at the top level of the distribution to be installed in +distribution-level share directory. Alternatively, C<share_dir> can be set to +a directory name or an arrayref of directory names containing files to be +installed in the distribution-level share directory. + +If C<share_dir> is a hashref, it may have C<dist> or C<module> keys +providing full flexibility in defining share directories to install. + + share_dir => { + dist => [ 'examples', 'more_examples' ], + module => { + Foo::Templates => ['share/html', 'share/text'], + Foo::Config => 'share/config', + } + } + =item sign [version 0.16] Modified: Module-Build/trunk/lib/Module/Build/Base.pm ============================================================================== --- Module-Build/trunk/lib/Module/Build/Base.pm (original) +++ Module-Build/trunk/lib/Module/Build/Base.pm Fri Aug 28 15:29:59 2009 @@ -831,7 +831,7 @@ __PACKAGE__->add_property(auto_configure_requires => 1); __PACKAGE__->add_property(blib => 'blib'); __PACKAGE__->add_property(build_class => 'Module::Build'); -__PACKAGE__->add_property(build_elements => [qw(PL support pm xs pod script)]); +__PACKAGE__->add_property(build_elements => [qw(PL support pm xs share_dir pod script)]); __PACKAGE__->add_property(build_script => 'Build'); __PACKAGE__->add_property(build_bat => 0); __PACKAGE__->add_property(config_dir => '_build'); @@ -2459,6 +2459,59 @@ } } +sub process_share_dir_files { + my $self = shift; + my $files = $self->_find_share_dir_files; + return unless $files; + + # XXX need to add File::ShareDir as 'requires' + + # root for all File::ShareDir paths + my $share_prefix = File::Spec->catdir($self->blib, qw/lib auto share/); + + # copy all share files to blib + while (my ($file, $dest) = each %$files) { + $self->copy_if_modified( + from => $file, to => File::Spec->catfile( $share_prefix, $dest ) + ); + } +} + +sub _find_share_dir_files { + my $self = shift; + my $share_dir = $self->share_dir; + return unless $share_dir; + + my @file_map; + if ( $share_dir->{dist} ) { + my $prefix = "dist/" . $self->dist_name; + push @file_map, $self->_share_dir_map( $prefix, $share_dir->{dist} ); + } + + if ( $share_dir->{module} ) { + for my $mod ( keys %{ $share_dir->{module} } ) { + (my $altmod = $mod) =~ s{::}{-}g; + my $prefix = "module/$altmod"; + push @file_map, $self->_share_dir_map($prefix, $share_dir->{module}{$mod}); + } + } + + return { @file_map }; +} + +sub _share_dir_map { + my ($self, $prefix, $list) = @_; + my %files; + for my $dir ( @$list ) { + for my $f ( @{ $self->rscan_dir( $dir, sub {-f} )} ) { + $files{$f} = File::Spec->catfile( + $prefix, File::Spec->abs2rel( $f, $dir ) + ); + } + } + return %files; +} + sub process_PL_files { my ($self) = @_; my $files = $self->find_PL_files; Modified: Module-Build/trunk/t/extend.t ============================================================================== --- Module-Build/trunk/t/extend.t (original) +++ Module-Build/trunk/t/extend.t Fri Aug 28 15:29:59 2009 @@ -79,7 +79,7 @@ $mb->add_build_element('foo'); $mb->add_build_element('foo'); - is_deeply $mb->build_elements, [qw(PL support pm xs pod script foo)], + is_deeply $mb->build_elements, [qw(PL support pm xs share_dir pod script foo)], 'The foo element should be in build_elements only once'; $mb->dispatch('build'); Modified: Module-Build/trunk/t/share_dir.t ============================================================================== --- Module-Build/trunk/t/share_dir.t (original) +++ Module-Build/trunk/t/share_dir.t Fri Aug 28 15:29:59 2009 @@ -9,7 +9,7 @@ # Begin testing #--------------------------------------------------------------------------# -plan tests => 12; +plan tests => 19; require_ok('Module::Build'); ensure_blib('Module::Build'); @@ -21,7 +21,7 @@ my $tmp = MBTest->tmpdir; use DistGen; -my $dist = DistGen->new( dir => $tmp ); +my $dist = DistGen->new( dir => $tmp, name => 'Simple::Share' ); $dist->regen; END{ $dist->remove } @@ -44,11 +44,12 @@ $dist->add_file('share/foo.txt',<< '---'); This is foo.txt --- -$dist->add_file('other/bar.txt',<< '---'); +$dist->add_file('other/share/bar.txt',<< '---'); This is bar.txt --- $dist->regen; ok( -e catfile(qw/share foo.txt/), "Created 'share' directory" ); +ok( -e catfile(qw/other share bar.txt/), "Created 'other/share' directory" ); # Check default when share_dir is not given $mb = $dist->new_from_context; @@ -119,7 +120,7 @@ license => 'perl', share_dir => { dist => 'share', - module => { $dist->name => 'other' }, + module => { $dist->name => 'other/share' }, }, } ); @@ -127,7 +128,7 @@ $mb = $dist->new_from_context; is_deeply( $mb->share_dir, { dist => [ 'share' ], - module => { $dist->name => ['other'] }, + module => { $dist->name => ['other/share'] }, }, "Hashref share_dir w/ both dist and module shares (scalar-form)" ); @@ -139,7 +140,7 @@ license => 'perl', share_dir => { dist => [ 'share' ], - module => { $dist->name => ['other'] }, + module => { $dist->name => ['other/share'] }, }, } ); @@ -147,11 +148,63 @@ $mb = $dist->new_from_context; is_deeply( $mb->share_dir, { dist => [ 'share' ], - module => { $dist->name => ['other'] }, + module => { $dist->name => ['other/share'] }, }, "Hashref share_dir w/ both dist and module shares (array-form)" ); +#--------------------------------------------------------------------------# +# test constructing to/from mapping +#--------------------------------------------------------------------------# + +is_deeply( $mb->_find_share_dir_files, + { + 'share/foo.txt' => 'dist/Simple-Share/foo.txt', + 'other/share/bar.txt' => 'module/Simple-Share/bar.txt', + }, + "share_dir filemap for copying to lib complete" +); + +#--------------------------------------------------------------------------# +# test moving files to blib +#--------------------------------------------------------------------------# +$mb->dispatch('build'); + +ok( -d 'blib', "Build ran and blib exists" ); +ok( -d 'blib/lib/auto/share', "blib/lib/auto/share exists" ); + +my $share_list = Module::Build->rscan_dir('blib/lib/auto/share', sub {-f}); + +is_deeply( + $share_list, [ + 'blib/lib/auto/share/dist/Simple-Share/foo.txt', + 'blib/lib/auto/share/module/Simple-Share/bar.txt', + ], + "share_dir files copied to blib" +); + +#--------------------------------------------------------------------------# +# test installing +#--------------------------------------------------------------------------# + +my $temp_install = 'temp_install'; +mkdir $temp_install; +ok( -d $temp_install, "temp install dir created" ); + +$mb->install_base($temp_install); +stdout_of( sub { $mb->dispatch('install') } ); + +$share_list = Module::Build->rscan_dir( + "$temp_install/lib/perl5/auto/share", sub {-f} +); + +is_deeply( + $share_list, [ + "$temp_install/lib/perl5/auto/share/dist/Simple-Share/foo.txt", + "$temp_install/lib/perl5/auto/share/module/Simple-Share/bar.txt", + ], + "share_dir files correctly installed" +);