|
Packit |
549706 |
#line 1
|
|
Packit |
549706 |
package Module::Install::DSL;
|
|
Packit |
549706 |
|
|
Packit |
549706 |
use strict;
|
|
Packit |
549706 |
use vars qw{$VERSION $ISCORE};
|
|
Packit |
549706 |
BEGIN {
|
|
Packit |
549706 |
$VERSION = '0.91';
|
|
Packit |
549706 |
$ISCORE = 1;
|
|
Packit |
549706 |
*inc::Module::Install::DSL::VERSION = *VERSION;
|
|
Packit |
549706 |
@inc::Module::Install::DSL::ISA = __PACKAGE__;
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
sub import {
|
|
Packit |
549706 |
# Read in the rest of the Makefile.PL
|
|
Packit |
549706 |
open 0 or die "Couldn't open $0: $!";
|
|
Packit |
549706 |
my $dsl;
|
|
Packit |
549706 |
SCOPE: {
|
|
Packit |
549706 |
local $/ = undef;
|
|
Packit |
549706 |
$dsl = join "", <0>;
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Change inc::Module::Install::DSL to the regular one.
|
|
Packit |
549706 |
# Remove anything before the use inc::... line.
|
|
Packit |
549706 |
$dsl =~ s/.*?^\s*use\s+(?:inc::)?Module::Install::DSL(\b[^;]*);\s*\n//sm;
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Load inc::Module::Install as we would in a regular Makefile.Pl
|
|
Packit |
549706 |
SCOPE: {
|
|
Packit |
549706 |
package main;
|
|
Packit |
549706 |
require inc::Module::Install;
|
|
Packit |
549706 |
inc::Module::Install->import;
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Add the ::DSL plugin to the list of packages in /inc
|
|
Packit |
549706 |
my $admin = $Module::Install::MAIN->{admin};
|
|
Packit |
549706 |
if ( $admin ) {
|
|
Packit |
549706 |
my $from = $INC{"$admin->{path}/DSL.pm"};
|
|
Packit |
549706 |
my $to = "$admin->{base}/$admin->{prefix}/$admin->{path}/DSL.pm";
|
|
Packit |
549706 |
$admin->copy( $from => $to );
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Convert the basic syntax to code
|
|
Packit |
549706 |
my $code = "package main;\n\n"
|
|
Packit |
549706 |
. dsl2code($dsl)
|
|
Packit |
549706 |
. "\n\nWriteAll();\n";
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Execute the script
|
|
Packit |
549706 |
eval $code;
|
|
Packit |
549706 |
print STDERR "Failed to execute the generated code" if $@;
|
|
Packit |
549706 |
|
|
Packit |
549706 |
exit(0);
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
sub dsl2code {
|
|
Packit |
549706 |
my $dsl = shift;
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Split into lines and strip blanks
|
|
Packit |
549706 |
my @lines = grep { /\S/ } split /[\012\015]+/, $dsl;
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Each line represents one command
|
|
Packit |
549706 |
my @code = ();
|
|
Packit |
549706 |
foreach my $line ( @lines ) {
|
|
Packit |
549706 |
# Split the lines into tokens
|
|
Packit |
549706 |
my @tokens = split /\s+/, $line;
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# The first word is the command
|
|
Packit |
549706 |
my $command = shift @tokens;
|
|
Packit |
549706 |
my @params = ();
|
|
Packit |
549706 |
my @suffix = ();
|
|
Packit |
549706 |
while ( @tokens ) {
|
|
Packit |
549706 |
my $token = shift @tokens;
|
|
Packit |
549706 |
if ( $token eq 'if' or $token eq 'unless' ) {
|
|
Packit |
549706 |
# This is the beginning of a suffix
|
|
Packit |
549706 |
push @suffix, $token;
|
|
Packit |
549706 |
push @suffix, @tokens;
|
|
Packit |
549706 |
last;
|
|
Packit |
549706 |
} else {
|
|
Packit |
549706 |
# Convert to a string
|
|
Packit |
549706 |
$token =~ s/([\\\'])/\\$1/g;
|
|
Packit |
549706 |
push @params, "'$token'";
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
};
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Merge to create the final line of code
|
|
Packit |
549706 |
@tokens = ( $command, @params ? join( ', ', @params ) : (), @suffix );
|
|
Packit |
549706 |
push @code, join( ' ', @tokens ) . ";\n";
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
# Join into the complete code block
|
|
Packit |
549706 |
return join( '', @code );
|
|
Packit |
549706 |
}
|
|
Packit |
549706 |
|
|
Packit |
549706 |
1;
|