Perl::Dist::Strawberry - Strawberry Perl for win32


Perl-Dist-Strawberry documentation Contained in the Perl-Dist-Strawberry distribution.

Index


Code Index:

NAME

Top

Perl::Dist::Strawberry - Strawberry Perl for win32

DESCRIPTION

Top

Strawberry Perl is a binary distribution of Perl for the Windows operating system. It includes a bundled compiler and pre-installed modules that offer the ability to install XS CPAN modules directly from CPAN.

The purpose of the Strawberry Perl series is to provide a practical Win32 Perl environment for experienced Perl developers to experiment with and test the installation of various CPAN modules under Win32 conditions, and to provide a useful platform for doing real work.

Strawberry Perl includes:

The Perl::Dist::Strawberry module available on CPAN contains the modules and perldist_strawberry script that are used to generate the Strawberry Perl installers.

Please note that Perl::Dist::Strawberry does not include the resulting Strawberry Perl installer. See the Strawberry Perl website at http://strawberryperl.com/ to download the Strawberry Perl installer.

See Perl::Dist::WiX for details on how the underlying distribution construction toolkit works.

CHANGES FROM CORE PERL

Top

Strawberry Perl is and will continue to be based on the latest "stable" releases of Perl, currently 5.8.9, and 5.10.0.

Some additional modifications are included that improve general compatibility with the Win32 platform or improve "turnkey" operation on Win32.

Whenever possible, these modifications will be made only by preinstalling additional or updated CPAN modules within Strawberry Perl, particularly modules that have been newly included as core Perl modules in the "development" branch of perl to address Win32 compatibility issues.

Additionally, a stub CPAN Config.pm file is added. This provides a complete zero-conf preconfiguration for CPAN, using a stable http://cpan.strawberryperl.com/ redirector to bounce to a known-reliable mirrors.

A more-thorough network-aware zero-conf capability is currently being developed and will be included at a later time.

Strawberry has never patched the Perl source code or modified the perl.exe binary.

CONFIGURATION

Top

At present, Strawberry Perl must be installed in C:\strawberry. The executable installer adds the following environment variable changes:

  * Adds directories to PATH
    - C:\strawberry\perl\bin  
    - C:\strawberry\c\bin  

Users installing Strawberry Perl without the installer will need to add the environment entries manually.

METHODS

Top

In addition to extending various underlying Perl::Dist::WiX methods, Strawberry Perl adds some additional methods that provide installation support for miscellaneous tools that have not yet been promoted to the core.

default_machine

  Perl::Dist::Strawberry->default_machine->run;

The default_machine class method is used to setup the most common machine for building Strawberry Perl.

The machine provided creates a standard 5.8.9 distribution (.zip and .msi), a standard 5.10.1 distribution (.zip and .msi) and a Portable-enabled 5.10.0 distribution (.zip only).

Returns a Perl::Dist::WiX::Util::Machine object.

SUPPORT

Top

Bugs should be reported via the CPAN bug tracker at

http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Perl-Dist-Strawberry

Please note that only bugs in the distribution itself or the CPAN configuration should be reported to RT. Bugs in individual modules should be reported to their respective distributions.

For more support information and places for discussion, see the Strawberry Perl Support page http://strawberryperl.com/support.html.

AUTHOR

Top

Adam Kennedy <adamk@cpan.org>

Curtis Jewell <csjewell@cpan.org>

COPYRIGHT

Top


Perl-Dist-Strawberry documentation Contained in the Perl-Dist-Strawberry distribution.
package Perl::Dist::Strawberry;

use 5.010;
use strict;
use parent                      qw( Perl::Dist::WiX 
                                    Perl::Dist::Strawberry::Libraries );
use File::Spec::Functions       qw( catfile catdir  );
use URI::file                   qw();
use File::ShareDir              qw();
require Perl::Dist::WiX::Util::Machine;

our $VERSION = '2.01';
$VERSION = eval $VERSION;

#####################################################################
# Build Machine Generator

sub default_machine {
	my $class = shift;

	# Create the machine
	my $machine = Perl::Dist::WiX::Util::Machine->new(
		class => $class,
		@_,
	);

	# Set the different versions
	$machine->add_dimension('version');
	$machine->add_option('version',
		perl_version => '589',
	    build_number => 3,
	);
# Not worrying about building 5.10.0 in October.
#	$machine->add_option('version',
#		perl_version => '5100',
#	);
	$machine->add_option('version',
		perl_version => '5101',
	);
# Too many bugs in portable to want to try to do it in October.
#	$machine->add_option('version',
#		perl_version => '5101',
#		portable     => 1,
#	);

	# Set the different paths
	$machine->add_dimension('drive');
	$machine->add_option('drive',
		image_dir => 'C:\strawberry',
	);
	$machine->add_option('drive',
		image_dir => 'D:\strawberry',
		msi       => 1,
		zip       => 0,
	);

	return $machine;
}





#####################################################################
# Configuration

# Apply default paths
sub new {
	my $dist_dir = File::ShareDir::dist_dir('Perl-Dist-Strawberry');
	my $class = shift;
	
	if ($Perl::Dist::WiX::VERSION < '1.090') {
		PDWiX->throw('Perl::Dist::WiX version is not high enough.')
	}

	$class->SUPER::new(
		app_id               => 'strawberryperl',
		app_name             => 'Strawberry Perl',
		app_publisher        => 'Vanilla Perl Project',
		app_publisher_url    => 'http://www.strawberryperl.com/',
		image_dir            => 'C:\strawberry',

		# Perl version
		perl_version         => '5101',
		
		# Program version.
		build_number         => 0,
#		beta_number          => 3,
		
		# New options for msi building...
		msi_license_file     => catfile($dist_dir, 'License-short.rtf'),
		msi_product_icon     => catfile(File::ShareDir::dist_dir('Perl-Dist-WiX'), 'win32.ico'),
		msi_help_url         => 'http://www.strawberryperl.com/support.html',
		msi_banner_top       => catfile($dist_dir, 'StrawberryBanner.bmp'),
		msi_banner_side      => catfile($dist_dir, 'StrawberryDialog.bmp'),

		# Set e-mail to something Strawberry-specific.
		perl_config_cf_email => 'win32-vanilla@perl.org',

		# Build both msi and zip versions
		msi                  => 1,
		zip                  => 1,

		# Tasks to complete to create Strawberry
		tasklist => [
			'final_initialization',
			'install_c_toolchain',
			'install_strawberry_c_toolchain',
			'install_c_libraries',
			'install_strawberry_c_libraries',
			'install_perl',
			'install_perl_toolchain',
			'install_cpan_upgrades',
			'install_strawberry_modules_1',
			'install_strawberry_modules_2',
			'install_strawberry_modules_3',
			'install_strawberry_modules_4',
			'install_win32_extras',
			'install_strawberry_extras',
			'install_portable',
			'remove_waste',
			'add_forgotten_files',
			'create_distribution_list',
			'regenerate_fragments',
			'write',
			'create_release_notes',
		],
		
		@_,
	);
}

sub dist_dir {
	return File::ShareDir::dist_dir('Perl-Dist-Strawberry');
}

# Lazily default the full name.
# Supports building multiple versions of Perl.
sub app_ver_name {
	$_[0]->{app_ver_name} or
	$_[0]->app_name
		. ($_[0]->portable ? ' Portable' : '')
		. ' ' . $_[0]->perl_version_human
		. '.' . $_[0]->build_number
		. ($_[0]->beta_number ? ' Beta ' . $_[0]->beta_number : '');
}

sub add_forgotten_files {
	my $self = shift;
	
	$self->add_to_fragment('IO_Scalar', 
		[ catfile($self->image_dir(), qw( perl site lib auto IO Stringy .packlist )) ]
	);

	$self->add_to_fragment('Digest_HMAC_MD5', 
		[ catfile($self->image_dir(), qw( perl site lib auto Digest HMAC .packlist )) ]
	);
	
	return 1;
}

# Lazily default the file name.
# Supports building multiple versions of Perl.
sub output_base_filename {
	$_[0]->{output_base_filename} or
	'strawberry-perl'
		. '-' . $_[0]->perl_version_human
		. '.' . $_[0]->build_number
		. ($_[0]->image_dir =~ /^d:/i ? '-ddrive' : '')
		. ($_[0]->portable ? '-portable' : '')
		. ($_[0]->beta_number ? '-beta-' . $_[0]->beta_number : '')
}




#####################################################################
# Customisations for C assets

sub install_strawberry_c_toolchain {
	my $self = shift;

	# Extra Binary Tools
	$self->install_patch;

	return 1;
}

sub install_strawberry_c_libraries {
	my $self = shift;

	# XML Libraries
	$self->install_zlib();
	$self->install_libiconv();
	$self->install_libxml();
	$self->install_expat();
	$self->install_libxslt();

	# Math Libraries
	$self->install_gmp();

	# Graphics libraries
	$self->install_libjpeg();
	$self->install_libgif();
	$self->install_libtiff();
	$self->install_libpng();
	$self->install_libgd();
	$self->install_libfreetype();
	
	# Database Libraries
	$self->install_libdb();
	$self->install_libpostgresql();

	# Crypto libraries
	$self->install_libopenssl();
	
	return 1;
}






#####################################################################
# Customisations for Perl assets

sub patch_include_path {
	my $self  = shift;

	# Find the share path for this distribution
	my $share = File::ShareDir::dist_dir('Perl-Dist-Strawberry');
	my $path  = File::Spec->catdir( $share, 'strawberry' );
	unless ( -d $path ) {
		die("Directory $path does not exist");
	}

	# Prepend to the default include path
	return [ $path,
		@{ $self->SUPER::patch_include_path },
	];
}

sub install_perl_589_bin {
	my $self   = shift;
	my %params = @_;
	my $patch  = delete($params{patch}) || [];
	return $self->SUPER::install_perl_589_bin(
		patch => [ qw{
			win32/config.gc
		}, @$patch ],
		%params,
	);
}

sub install_perl_5100_bin {
	my $self   = shift;
	my %params = @_;
	my $patch  = delete($params{patch}) || [];
	return $self->SUPER::install_perl_5100_bin(
		patch => [ qw{
			win32/config.gc
		}, @$patch ],
		%params,
	);
}

sub install_perl_5101_bin {
	my $self   = shift;
	my %params = @_;
	my $patch  = delete($params{patch}) || [];
	return $self->SUPER::install_perl_5101_bin(
		patch => [ qw{
			win32/config.gc
		}, @$patch ],
		%params,
	);
}

sub install_strawberry_modules_1 {
	my $self = shift;

	# Install LWP::Online so our custom minicpan code works
	$self->install_distribution(
		name     => 'ADAMK/LWP-Online-1.07.tar.gz',
		mod_name => 'LWP::Online',
		makefilepl_param => ['INSTALLDIRS=vendor'],
	);

	# Win32 Modules
	$self->install_modules( qw{
		Win32::File
		File::Remove
		Win32::File::Object
		Win32::API
		Parse::Binary
		Win32::Exe
		Win32::EventLog
	} );

	# Install additional math modules
	$self->install_pari;
	$self->install_modules( qw{
		Math::BigInt::GMP
	} );
	# XML Modules
	$self->install_distribution(
		name             => 'MSERGEANT/XML-Parser-2.36.tar.gz',
		mod_name         => 'XML::Parser',
		makefilepl_param => [
			'INSTALLDIRS=vendor',
			'EXPATLIBPATH=' . $self->dir(qw{ c lib     }),
			'EXPATINCPATH=' . $self->dir(qw{ c include }),
		],
	);

	$self->install_modules( qw{
		XML::NamespaceSupport
		XML::SAX
		XML::LibXML
		XML::LibXSLT
	} );

	# Insert ParserDetails.ini
	$self->add_to_fragment('XML_SAX', [ catfile($self->image_dir, qw(perl site lib XML SAX ParserDetails.ini)) ]);

	return 1;
}

sub install_strawberry_modules_2 {
	my $self = shift;
	
	# Networking Enhancements
	# All the Bundle::LWP modules are
	# included in the toolchain or in the upgrades.
	
	# Binary Package Support
	$self->install_modules( qw{
		PAR::Dist
		PAR::Dist::FromPPD
		PAR::Dist::InstallPPD
		Tree::DAG_Node
		Sub::Uplevel
		Test::Warn
		Test::Tester
		Test::NoWarnings
		Test::Deep
		IO::Scalar
	} );
	$self->install_distribution(
		name             => 'RKINYON/DBM-Deep-1.0013.tar.gz',
		mod_name         => 'DBM::Deep',
		makefilepl_param => ['INSTALLDIRS=vendor'],
		buildpl_param    => ['--installdirs', 'vendor'],
		force            => 1,
	);
	$self->install_modules( qw{
		YAML::Tiny
		PAR
		PAR::Repository::Query
		PAR::Repository::Client
	} );
	$self->install_ppm;

	my $cpan_sources = catdir($self->image_dir, 'cpan', 'sources');
	unless (-d $cpan_sources) {
		require File::Path;
		File::Path::mkpath($cpan_sources);
	}
	
	# Console Utilities
	$self->install_modules( qw{
		Number::Compare
		File::Find::Rule
		Data::Compare
		File::chmod
		Params::Util
		CPAN::Checksums
		CPAN::Inject
		File::pushd
		pler
		pip
	} );
	
	return 1;
}

sub install_strawberry_modules_3 {
	my $self = shift;

	# CPAN::SQLite Modules
	$self->install_modules( qw{
		DBI
		DBD::SQLite
		CPAN::DistnameInfo
		CPAN::SQLite
	} );
	
	# CPANPLUS::Internals::Source::SQLite 
	# needs this module, so adding it.
	$self->install_modules( qw{
		DBIx::Simple
	} ) if ($self->perl_version >= 5100);
	
	# TODO: BerkeleyDB does not build yet.
	#$self->install_distribution(
	#	name => 'BerkeleyDB',
	#	url  => 'http://strawberryperl.com/package/BerkeleyDB-0.34-vanilla.tar.gz',
	#);

	# Support for other databases.
	$self->install_modules( qw{
		DB_File
		DBD::ODBC
	} );
	$self->install_dbd_mysql;
	$self->install_module(
		name  => 'DBD::Pg',
		force => 1,
	);

	my $filelist = $self->install_binary(
		name       => 'db_libraries',
		url        => $self->binary_url('DatabaseLibraries-09162009.zip'),
		install_to => q{.}
	);
	$self->insert_fragment( 'db_libraries', $filelist );

	# JSON and local library installation
	$self->install_modules( qw{
		common::sense
		JSON::XS
		JSON
		local::lib
	} );	

	# Graphics module installation.
	$self->install_module( name => 'Imager' );
	$self->install_module( name => 'GD' );
	
	return 1;
}

sub install_strawberry_modules_4 {
	my $self = shift;

	# Required for Net::SSLeay.
	local $ENV{'OPENSSL_PREFIX'} = catdir($self->image_dir, 'c');
	# This is required for IO::Socket::SSL.
	local $ENV{'SKIP_RNG_TEST'} = 1;
	# This is required for Net::SSH::Perl.
	local $ENV{'HOME'} = $ENV{'USERPROFILE'};

	# We have to tell the Makefile.PL where the OpenSSL 
	# libraries are by passing a parameter for Crypt::SSLeay.
	$self->install_distribution( 
		mod_name => 'Crypt::SSLeay',
		name     => 'DLAND/Crypt-SSLeay-0.57.tar.gz',
		makefilepl_param => [
			'INSTALLDIRS=vendor', '--lib', $ENV{'OPENSSL_PREFIX'} ,
		],
	);

	$self->install_modules( qw{
		Net::SSLeay
		Digest::HMAC_MD5
		IO::Socket::SSL
		Net::SMTP::TLS	
	});

	# The rest of the Net::SSH::Perl toolchain.
	$self->install_module(
		name  => 'Data::Random',
		force => 1, # Timing-dependent test.
	);
	$self->install_modules( qw{
		Math::GMP
		Data::Buffer
		Crypt::DSA
		Class::ErrorHandler
		Convert::ASN1
		Crypt::CBC
		Crypt::DES
		Crypt::DES_EDE3
	});
	# Has what appears to be a timing-dependent test.
	$self->install_module(
		name => 'Convert::PEM',
		force => 1,
	);
	$self->install_modules( qw{
		Crypt::DH
		Crypt::Blowfish
		Tie::EncryptedHash
		Class::Loader
		Crypt::Random
		Convert::ASCII::Armour
		Digest::MD2
		Sort::Versions
		Crypt::Primes
		Crypt::RSA
		Digest::BubbleBabble
		Crypt::IDEA
		String::CRC32
	});

	# Since	Net::SSH::Perl does not work under Win32 yet, it
	# is not being installed.  When it does, add it to the end
	# of the previous install_modules call.

	# Module::Signature toolchain.
	$self->install_modules( qw{
		Test::Manifest
		Crypt::Rijndael
		Crypt::CAST5_PP
		Crypt::RIPEMD160
		Crypt::Twofish
		Crypt::OpenPGP
		Algorithm::Diff
		Text::Diff
		Module::Signature
	});
	
	return 1;
}





#####################################################################
# Customisations to Windows assets

sub install_strawberry_extras {
	my $self = shift;

	my $dist_dir = File::ShareDir::dist_dir('Perl-Dist-Strawberry');
	
	# Links to the Strawberry Perl website.
	# Don't include this for non-Strawberry sub-classes
	if ( ref($self) eq 'Perl::Dist::Strawberry' ) {
		$self->install_website(
			name       => 'Strawberry Perl Website',
			url        => $self->strawberry_url,
			icon_file  => catfile($dist_dir, 'strawberry.ico')
		);
		$self->install_website(
			name       => 'Strawberry Perl Release Notes',
			url        => $self->strawberry_release_notes_url,
			icon_file  => catfile($dist_dir, 'strawberry.ico')
		);
		# Link to IRC.
		$self->install_website(
			name       => 'Live Support',
			url        => 'http://widget.mibbit.com/?server=irc.perl.org&channel=%23win32',
			icon_file  => catfile($dist_dir, 'onion.ico')
		);
		$self->patch_file( 'README.txt' => $self->image_dir, { dist => $self } );
	}

	my $license_file_from = catfile($dist_dir, 'License.rtf');
	my $license_file_to = catfile($self->license_dir, 'License.rtf');
	my $readme_file = catfile($self->image_dir, 'README.txt');

	$self->_copy($license_file_from, $license_file_to);
	$self->add_to_fragment('perl_licenses', [ $license_file_to, $readme_file ]);

	return 1;
}

sub strawberry_url {
	my $self = shift;
	my $path = $self->output_base_filename;

	# Strip off anything post-version
	unless ( $path =~ s/^(strawberry-perl-\d+(?:\.\d+)+).*$/$1/ ) {
		die "Failed to generate the strawberry subpath";
	}

	return "http://strawberryperl.com/$path";
}

sub strawberry_release_notes_url {
	my $self = shift;
	my $path = $self->perl_version_human
		. q{.} . $self->build_number
		. ($self->beta_number ? '.beta' : '');

	return "http://strawberryperl.com/release-notes/$path.html";
}