The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

package
MyBuilder;
use strict;
use warnings qw(FATAL all NONFATAL misc);
use base qw(Module::Build File::Spec);
sub lexpand {
return unless defined $_[0];
%{$_[0]};
}
sub my_cpanfile_specs {
my ($pack) = @_;
my $file = Module::CPANfile->load("cpanfile");
my $prereq = $file->prereq_specs;
my %args;
%{$args{requires}} = lexpand($prereq->{runtime}{requires});
foreach my $phase (qw/configure runtime build test/) {
%{$args{$phase . "_requires"}} = lexpand($prereq->{$phase}{requires});
}
%{$args{recommends}} = (map {lexpand($prereq->{$_}{recommends})}
keys %$prereq);
%args
}
#
# To include yatt_dist as_is
#
sub process_yatt_dist_files {
my ($self) = @_;
$self->pm_files(\ my %pm_files);
$self->pod_files(\ my %pod_files);
$self->script_files(\ my %script_files);
foreach my $desc ([pm => \%pm_files], [pod => \%pod_files]) {
my ($ext, $map) = @$desc;
my ($src, $dest) = ("Lite.$ext", "lib/YATT/Lite.$ext");
$map->{$src} = $dest;
$self->_yatt_dist_ensure_blib_copied($src, $dest);
}
# Lite/ should go into blib/lib/YATT/Lite
find({no_chdir => 1, wanted => sub {
return $self->prune if /^\.git|^lib$/;
return if -d $_;
my $dest;
if (/\.pm$/) {
$dest = \%pm_files
} elsif (/\.pod$/) {
$dest = \%pod_files
} else {
return;
}
my $d = $dest->{$_} = "lib/YATT/$_";
$self->_yatt_dist_ensure_blib_copied($_, $d);
}}, "Lite");
# scripts/
find({no_chdir => 1, wanted => sub {
return $self->prune if /^\.git|^lib$/;
return if -d $_;
return unless -x $_ and m{/yatt[^/]*$};
my $d = $script_files{$_} = "bin/". File::Basename::basename($_);
$self->_yatt_dist_ensure_blib_copied($_, $d);
}}, 'scripts');
# elisp/ also should go into blib/lib/YATT/
# XXX: This may be changed to blib/lib/YATT/Lite/ or somewhere else.
find({no_chdir => 1, wanted => sub {
return $self->prune if /^\.git|^lib$/;
return if -d $_;
return unless m{\.el$};
my $d = $pm_files{$_} = "lib/YATT/$_";
$self->_yatt_dist_ensure_blib_copied($_, $d);
}}, 'elisp');
}
sub _yatt_dist_ensure_blib_copied {
my ($self, $from, $dest) = @_;
my $to = $self->catfile($self->blib, $dest);
if ($ENV{DEBUG_BUILD}) {
print STDERR "$from => $to\n";
} else {
$self->copy_if_modified(from => $from, to => $to);
}
}
sub prune {
$File::Find::prune = 1;
}
#========================================
#
# To remove leading 'v' from dist_version.
#
sub dist_version {
my ($self) = @_;
my $ver = $self->SUPER::dist_version
or die "Can't detect dist_version";
$ver =~ s/^v//;
$ver;
}
1;
__END__
# Please ignore below.
$build->add_build_element($elem);
$build->process_${element}_files($element);
$build->_find_file_by_...;
$self->copy_if_modified(from => $fn, to => $self->catfile($self->blib, $dest));
ExtUtils::Install::install(
$self->install_map, $self->verbose, 0, $self->{args}{uninst}||0
);
$self->install_map
$self->install_types
# install_base => installbase_relpaths
# prefix => prefix_relpaths
# else => install_sets(installdirs)
# +
# %{install_path}
$localdir = catdir($blib, $type);
$dest = $self->install_destination($type)
$map{$localdir} = $dest;
_default_install_paths
=>
* install_sets
* install_base_relpaths
* prefix_relpaths
ACTION_code
ACTION_install