#!/usr/bin/perl

use warnings;
use strict;
use lib 'lib';
use BuildHelper;

BEGIN {
    for my $val (qw/PERL5LIB PERL_MB_OPT PERL_LOCAL_LIB_ROOT PERL_MM_OPT/) {
        delete $ENV{$val} if defined $ENV{$val};
    }
};

my($deps,$files) = BuildHelper::get_all_deps();
my $sorted       = BuildHelper::sort_deps($deps, $files);
my $last         = pop @{$sorted};
alarm(5);
if(defined $ARGV[0] and $ARGV[0] eq '-u') {
    open(my $out, '>', 'Makefile.new') or die("cannot open Makefile.new: $!");
    open(my $in, '<', 'Makefile') or die("cannot open Makefile: $!");
    my $found = 0;
    my $prefound = 0;
    my $premodules = {};
    while(my $line = <$in>) {
        if($prefound) {
            my $mod = $line;
            $mod =~ s/\\$//gmx;
            $mod =~ s/^\s*//gmx;
            $mod =~ s/\s*$//gmx;
            chomp($mod);
            if($mod =~ m/\.gz/) {
                for my $m (glob("src/".$mod)) {
                    $m =~ s/^src\///gmx;
                    $premodules->{$m} = $m;
                }
            }
        }
        if($line =~ m/^PREMODULES\s=/) {
            $prefound = 1;
        }
        if($line =~ m/^MODULES\s=/) {
            $prefound = 0;
            print $out "MODULES = \\\n";
            for my $file (@{$sorted}) {
                next if $premodules->{$file};
                printf $out "          %s \\\n", $file;
            }
            printf $out "          %s\n", $last if defined $last;
            print $out "\n";
            $found = 1;
        }
        if($found) {
            $found = 0 if $line =~ m/^\s*$/;
        } else {
            print $out $line;
        }
    }
    close($out);
    close($in);
    `mv Makefile.new Makefile`;
    print "Makefile written\n";
} else {
    print "MODULES = \\\n";
    for my $file (@{$sorted}) {
        printf "          %s \\\n", $file;
    }
    printf "          %s\n", $last if defined $last;
    print "\n\nuse -u to update Makefile automatically\n";
}
exit;
