Blame inc/Module/Install/DSL.pm

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;