#!/usr/bin/env perl

# bin/buildmod - Module builder.
# Copyright (C) 2010-2011 Xelhua Development Group, et al.
# This program is free software; rights to this code are stated in doc/LICENSE.
use 5.010_000;
use strict;
use warnings;
use English qw(-no_match_vars);
use FindBin qw($Bin);
our $Bin = $Bin;

our $VERSION = 1.00;

# Get module parameter.
if (!defined $ARGV[0]) {
    say 'Not enough parameters. Usage: buildmod <module>';
    exit;
}
my $module = $ARGV[0];

# Set full path.
my $type = 0;
my $modulep;
if (-e "$Bin/../modules/$module.pm") {
    $modulep = "$Bin/../modules/$module.pm";
    $type = 1;
}
else {
    if (-e "$Bin/../modules/$module/Buildfile") {
        $modulep = "$Bin/../modules/$module/Buildfile";
        $type = 2;
    }
    else {
        say 'No such module '.$module;
        exit;
    }
}

my $data;
if ($type == 1) {
    open my $FHM, '<', $modulep;
    my @BUF = <$FHM>;
    close $FHM;

    foreach my $line (@BUF) {
        $line =~ s/(\r|\n)//g;
        
        if ($line =~ m/^# build: /sm) {
            $data = substr $line, 9;
        }
    }

    if (!defined $data) {
        say 'No build line found in '.$module.'.pm. Aborting.';
        exit;
    }
}
elsif ($type == 2) {
    open my $FHM, '<', $modulep;
    my @BUF = <$FHM>;
    close $FHM;

    foreach my $line (@BUF) {
        $line =~ s/(\r|\n)//g;
        
        $data .= $line;
    }
    
    if (!defined $data) {
        say 'No build datafound in '.$module.'/Buildfile. Aborting.';
        exit;
    }
    else {
        $data = substr $data, 1;
    }
}

# Start build.
my @pars = split ' ', $data;
my $die = 0;

say 'Building '.$module.'.....';

foreach (@pars) {
    my ($opt, $val) = split m/[=]/;

    given ($opt) {
        when ('cpan') {
            say 'Checking for required CPAN modules.....'; print $RS;
            my @vals = split ',', $val;
            my $res = 0;
            foreach my $cpanmod (@vals) {
                $res = eval('require '.$cpanmod.'; 1;');
                say '    '.$cpanmod.': '.(($res) ? 'Found' : 'Not Found');
                if (!$res) { $die = 1; }
            }
            print $RS;
            
            if ($die) { say 'Failed to build '.$module.'.'; exit; }
        }
        when ('perl') {
            print 'Checking Perl version..... '.$PERL_VERSION.' - ';
            if ($] < $val) { $die = 1; }
            say (($die) ? 'Not OK' : 'OK');
            print $RS;
            if ($die) { say 'Failed to build '.$module.'.'; exit; }
        }
    }
}

say 'Done.';

# vim: set ai sw=4 ts=4:
