package Ovid::Dependency; use strict; use Ovid::Common; use Ovid::Error; @Ovid::Dependency::ISA = qw(Ovid::Common Ovid::Error); sub init { my $self = shift; if (my $t = $self->dir){ $self->find_builder($t); } } sub accessors { return { scalar => [qw(builder dir)], array => [qw()]}; } sub find_builder { my ($self, $dir) = @_; $dir ||= $self->dir; fatal "missing builder directory" unless $dir; my @builders = qw(Makefile.PL); my $builder; for my $f (@builders) { my $p = qq[$dir/$f]; if ( -f $p ){ $builder = $p; last; } } if ($builder){ debug "got builder file. $builder"; } else { fatal "cannot find builder file @builders"; } $self->builder($builder); } sub dependencies { my ($self, $dir ) = @_; my $builder = $self->find_builder; my $pid = open(D, "-|"); my $prefix='ovid-dependency:::'; if ($pid == -1){ fatal "cannot fork"; } elsif ($pid) { # parent my @deps; while (defined ($_ = )) { chomp; if (/^$prefix(\S+)\s+(\S+)/){ push @deps, { name => $1, version => $2 }; } } close(D) || warning "child process failed $?"; return @deps; } else { # child my @deps; close STDIN; my $outhandle = \*STDOUT; eval { no warnings; no strict; local *CORE::exit = *CORE::return; my $orig_method = \&ExtUtils::MakeMaker::WriteMakefile; local *ExtUtils::MakeMaker::WriteMakefile = sub { my %deps = @_; push @deps, $deps{PREREQ_PM}; goto $orig_method; }; chdir ($dir) or fatal "cannot chdir to $dir. $!"; do $builder; }; if ($@) { fatal "cannot get dependencies. $@"; } else { for my $r (@deps){ while (my ($k, $v) = each %$r){ print $outhandle qq[${prefix}$k\t$v\n]; } } } close $outhandle; exit; } } 1;