#!/usr/bin/perl
use strict;

# map of name to full path
my %names;
# map of path to dependencies
my %deps;
# map of whether to print dep
my %print_dep;

# function to set the print_dep variable to 1 for every module
# that we use
sub set_needed_dep
{
  my $dep_name = shift;

  if($print_dep{$dep_name} != 1 and $print_dep{$dep_name} != 2)
  {
    $print_dep{$dep_name} = 1;
    if(length($deps{$dep_name}) > 0)
    {
      foreach my $n (split(/ +/, $deps{$dep_name}))
      {
        set_needed_dep($n);
      }
    }
  }
}

# main program starts here
# open modules.dep and scan dependencies
open(DEP, "$ENV{MODULEDIR}/modules.dep") or die "Can't open modules.dep";
# set the line separater to be two new-line characters
$/ = "\n\n";
while(<DEP>)
{
# when a \ is used to split lines then recombine them
  $_ =~ s/\\\n//g;
  chomp;

# replace multiple spaces and tab characters with a single space
  $_ =~ s/[\t ]+/ /g;
  my @line = split(':', $_);
  my $name = $line[0];
  $name =~ s/^.*\///;
  $name =~ s/\..*$//;
  $names{$name} = $line[0];
  $line[1] =~ s/^[ \t]*//;
  $deps{$line[0]} = $line[1];
#print "$name: $line[1]\n";
}
close(DEP);
$/ = "\n";

# get the list of modules to use
open(MODULES, "grep -v ^# /etc/mkinitrd/modules | grep .|") or die "Can't open modules";
while(<MODULES>)
{
  chomp;
  foreach my $n ($names{$_}, split(' ', $deps{$names{$_}}) )
  {
    if(length($n) > 0)
    {
      $n =~ s/[ \t]*//g;
      chomp $n;
      $n =~ s/\\$//;
      my $dir = $n;
      $dir =~ s/[a-z0-9\-\.]*$//;
#      printf stderr "mkdir -p $ENV{INITRDDIR}$dir\n";
#      printf stderr "cp $n $ENV{INITRDDIR}$n\n";
      system("mkdir -p $ENV{INITRDDIR}$dir");
      system("cp $n $ENV{INITRDDIR}$n");
      set_needed_dep($n);
    }
  }
}
close(MODULES);
open(DEP, ">$ENV{INITRDDIR}$ENV{MODULEDIR}/modules.dep") or die "Can't open modules.dep";
foreach my $n(keys %print_dep)
{
  if($print_dep{$n} == 1)
  {
    print DEP "$n: $deps{$n}\n\n";
  }
}
close(DEP);
#system("rm $ENV{INITRDDIR}$ENV{MODULEDIR}/modules.*map");
