sub MY::postamble { return '' if !-e '.git'; my $container = 'graphqlperl/graphql'; my $prereq = "${container}-prereq"; <\$\@ # then some Docker stuff #### sub coretarget { my ($self) = @_; # remember the fundamental ones end up far to right as much deps on them # a "right" is either scalar (named target) or tuple of # [ \@dir, \@targets, \@prereqs ] # @dir is dir parts for use by File::Spec # @targets is make targets within that dir # @prereqs are named targets - undef=[] # all a left's rights are made concurrently, no sequence - list ALL prereqs my @left2rights = ( [ coregen => [ [ [ qw(Basic) ], [ qw(pm_to_blib) ], ], [ [ qw(Basic Core) ], [ qw(pm_to_blib) ], ], [ [ qw(Basic Gen) ], [ qw(all) ], ], ] ], [ core => [ [ [ qw(Basic SourceFilter) ], [ qw(pm_to_blib) ], ], map [ [ 'Basic', $_ ], [ qw(pm_to_blib dynamic) ], [ 'coregen' ], # the modules in PDL::LiteF, used in t/core.t ], qw(Core Ops Primitive Ufunc Slices Bad Math MatrixOps), ] ], [ basic => [ map [ $_, [ qw(pm_to_blib dynamic) ], [ 'core' ], ], @basics, ] ], [ basictest => [ map [ $_, [ 'test' ], [ 'basic' ], ], @basics, ] ], ); join "\n", map flatten_parallel_target($self, $_), @left2rights; } sub format_chunk { my ($self, $left, $deps, $dir, $targets) = @_; my @m = join ' ', $left, ':', @{$deps||[]}; my $fsdir = File::Spec->catdir(@$dir); push @m, "\t" . $self->oneliner( "die \$! unless chdir q($fsdir); exec q(\$(MAKE) @$targets)" ); join '', map "$_\n", @m; } # output: list of make chunks with target, deps, recipes sub flatten_parallel_target { my ($self, $left2rights) = @_; my ($left, $rights) = @$left2rights; my (@deps, @recipes, @otherchunks); for my $right (@$rights) { if (ref $right) { # [ \@dir, \@targets, \@prereqs ] # @dir is dir parts for use by File::Spec # @targets is make targets within that dir # @prereqs are named targets - undef=[] my ($dir, $targets, $prereqs) = @$right; my $target_name = parallel_target_mangle($self, $dir, $targets); push @deps, $target_name; push @otherchunks, format_chunk( $self, $target_name, $prereqs, $dir, $targets ); } else { push @deps, $right; } } ( join(' : ', $left, join ' ', @deps) . "\n", @otherchunks, ); } sub parallel_target_mangle { my ($self, $dir, $targets) = @_; my $target = join '_', @$dir, @$targets; $target =~ s#[/\\]#_#g; # avoid ambiguity with filenames $target; }