#! /usr/bin/env perl
#
# (c) 2009 Technische Universität Dresden
#
# Adam Lackorzynski <adam@os.inf.tu-dresden.de>
#

use strict;
use warnings;

BEGIN { unshift @INC, $ENV{L4DIR}.'/tool/lib'
           if $ENV{L4DIR} && -d $ENV{L4DIR}.'/tool/lib/L4';}

use L4::ModList;
use L4::Grub;
use File::Temp qw/tempdir/;
use File::Copy;
use File::Basename;

my $module_path  = $ENV{SEARCHPATH} || ".";
my %opts         = L4::Grub::parse_gengrub_args();
my $modulesfile  = shift;
my $isofilename  = shift;

unless (defined $isofilename) {
  print "usage: $0 MODULESFILE ISOFILENAME entry1 [entry2] ...\n";
  exit(1);
}

my $tmpdir    = tempdir(CLEANUP => 1); 

L4::Grub::prepare_grub1_dir($tmpdir);

open(A, ">$tmpdir/boot/grub/menu.lst")
  || die "Cannot create '$tmpdir/boot/grub/menu.lst': $!!";

delete $opts{timeout}
  if @ARGV > 1 and defined $opts{timeout} and $opts{timeout} == 0;

my @entries;
foreach my $entryname (@ARGV)
  {
    print "Processing entry '$entryname'\n";
    my %entry = L4::ModList::get_module_entry($modulesfile, $entryname,
                                              $module_path);
    push @entries, \%entry;
  }

L4::ModList::merge_entries($module_path, undef, @entries);

print A L4::Grub::grub1_config_prolog(%opts);
foreach my $e (@entries)
  {
    print A L4::ModList::generate_grub1_entry($e->{entry}, '', %$e);

    foreach (@{$e->{mods}}, $e->{bootstrap})
      {
        my $usf = $_->{unique_short_filepath};
        if (! -e $tmpdir."/".$usf)
          {
            my $subpath = $tmpdir."/".dirname($usf);
            mkdir $subpath || die "Could not mkdir $subpath: $!";
            copy($_->{file}, $tmpdir."/".$usf);
          }
      }
  }
close A;

#system("cat $tmpdir/boot/grub/menu.lst");
L4::Grub::grub1_mkisofs($isofilename, $tmpdir);
