Wow, what great timing :)

To add to your use case, on the project I'm currently working on, we have 5 CPAN-style dists, probably 10 by the time we are done, but they all need to be installed in a particular order.

Due to the peculiarities of the situation, doing a CPAN::Inject style setup isn't going to work for us.

Is this usable in that sort of situation?

If so could you demonstrate the usage?

Thanks

Adam K

Shlomi Fish wrote:
Hi all!

As part of developing Test::Run, I maintain several CPAN modules and install them to a directory under my home-dir. Now, until today what I did was write a bash function to run the installation commands ("perl Makefile.PL PREFIX=$FOO", "make", "make test", make install", or the Module::Build equivalents), one by one for each of the modules. However, if one of the commands would have failed, it would still proceed.

A long time ago, I thought of a better idea in which I generate a makefile that will run the commands and break if one of them fails. Today, when I needed to update the list of installed modules, I decided to catch two birds with one stone, and wrote the makefile generator. I wrote it in Perl and it is included below. (it is licensed under the MIT X11 licence).
Now here's how I'm using it. In my bash theme ([1]), I have:

<<<
__prepare_install_all_to_temp_makefile()
{
    (
        perl ~/bin/gen-perl-modules-inst-makefile.pl \
            --prefix="$inst_modules_dir" \
            -o "$modules_makefile" \
            --dir="$test_run" \
            --dir="$cmdline" \
--dir="$modules_dir/plugins/backend/Test-Run-Plugin-ColorSummary" \ --dir="$modules_dir/plugins/cmdline/Test-Run-CmdLine-Plugin-ColorSummary"
    )
}


This is the function that calls the generator script to prepare the makefile.

And then I use this makefile by calling "make all" to build, test and install all the modules one by one, or "make $(pwd)" to build one of them.

I hope you'll find this piece of advice useful.

Regards,

        Shlomi Fish

[1] - http://www.onlamp.com/pub/a/onlamp/2006/02/02/bash_themes.html

Here's the script:

<<<<<<<<<<
#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

my $o_fn = "-";
my $prefix = "/usr";
my @dirs;

GetOptions (
    "o=s" => \$o_fn,
    "prefix=s" => \$prefix,
    "dir=s\@" => [EMAIL PROTECTED],
);

my $text = "";

sub process_dir
{
    my $dir = shift;
    if (-e "$dir/Build.PL")
    {
        process_mb_dir($dir);
    }
    elsif (-e "$dir/Makefile.PL")
    {
        process_eumm_dir($dir);
    }
    else
    {
        die "Unknown install method for directory $dir.";
    }
}

sub process_eumm_dir
{
    my $dir = shift;
handle_deps($dir, [ "perl Makefile.PL PREFIX=\"$prefix\"", "make", "make test", "make install",
        ]
    );
}

sub process_mb_dir
{
    my $dir = shift;
handle_deps($dir, [ "perl Build.PL", "./Build", "./Build test", "./Build install prefix=\"$prefix\"",
        ]
    );
}

my $id_num = 1;

sub handle_deps
{
    my ($dir, $deps_ref) = @_;
    my @deps = reverse(@$deps_ref);
    my $id = "target" . ($id_num++);
    $text .= "${dir}: $id-step0\n\n";
    foreach my $i (0 .. $#deps)
    {
$text .= "$id-step${i}: " . (($i == $#deps) ? "" : ("$id-step" . ($i+1))) . "\n";
        $text .= "\t(cd $dir && " . $deps[$i] . ")\n";
        $text .= "\n";
    }
}

foreach my $d (@dirs)
{
    process_dir($d);
}

if ($o_fn eq "-")
{
    open O, ">&STDOUT";
}
else
{
    open O, ">", $o_fn;
}
print O "all: ", join(" ", @dirs) . "\n\n";
print O $text;
close(O);

Reply via email to