#! /usr/bin/perl -w
BEGIN {
die <<UX if $^O !~ /win32|cygwin/i;
This program is only intented to be run under MSWin32,
for the binary installations. Please install the toolkit from the
source distribution, by typing
perl Makefile.PL
make install
UX
}
use strict;
use Config;
use File::Path;
use File::Find;
use File::Copy;
my $install = 1;
for ( @ARGV) {
$_ = lc $_;
if ( $_ eq '-uninstall') {
$install = 0;
last;
}
if (
$_ eq 'help' || $_ eq 'h' || $_ eq '?' ||
$_ eq '-help' || $_ eq '-h' || $_ eq '-?' ||
$_ eq '--help' || $_ eq '--h' || $_ eq '--?'
) {
print <<SD;
Prima binary distribution installer for MS systems ( WinNT, Win9X).
Format: perl ms_install.pl [ -uninstall]
SD
exit(0);
}
}
my $mswin32 = ($^O =~ /MSWin32/);
my $cygwin = ($^O =~ /cygwin/);
my $iarc = $Config{ installsitearch};
my $ibin = $Config{ installbin};
my $perlpath = $Config{ perlpath};
unless ( $cygwin) {
$iarc =~ s/\//\\/g;
$ibin =~ s/\//\\/g;
}
die "Broken config: cannot find directory $iarc\n" unless -d $iarc;
die "Broken config: cannot find directory $ibin\n" unless -d $ibin;
$iarc =~ s/(\\|\/)$//;
my $binlib = $^O;
$binlib =~ s/\s/_/g;
die "No distribution found. The install script must be put into the toolkit root directory\n"
unless -f 'Prima.pm';
my (@instfiles, @instdir);
sub abort
{
warn $_[0];
unlink $_ for @instfiles;
rmdir $_ for @instdir;
rmdir $_ for @instdir;
rmdir $_ for @instdir;
exit;
}
if ( $install) {
my (@cp, @cpbin);
finddepth( sub {
my $destdir = $File::Find::dir;
$destdir =~ s/^\.//;
if ( $File::Find::dir =~ /(utils|pod)/i) {
if ( m/^(.*)\.pl$/i) {
$destdir = $ibin;
} else {
$destdir =~ s/[\\\/]*(utils|pod)//i;
$destdir = $iarc . $destdir;
}
} else {
$destdir = $iarc . $destdir;
}
return if -d $_ && m/(utils|pod|test|unix|img|CVS|include|scripts)$/i;
return if $File::Find::dir =~ /test|CVS|include|unix|bsd|scripts/i;
return if m/ms_install|Makefile|\.(pdb|opt|pal|obj|log|dsp|dsw|ncb|c|cls|h|inc|def|tml|o)/;
if ( -d $_) {
print "Creating $destdir/$_\n";
File::Path::mkpath( "$destdir/$_");
push @instdir,"$destdir/$_";
} elsif ( m/^(.*)\.pl$/i) {
my $un = $1;
$destdir = $ibin unless $File::Find::dir =~ /examples/i;
push @cpbin, [ "$File::Find::dir/$_", "$destdir/$un"];
} elsif ( /(\S*\.dll)$/i && !(/Prima[^\\\/]*\.dll$/i)) {
push @cp, [ "$File::Find::dir/$_", "$ibin/$_" ];
} else {
push @cp, [ "$File::Find::dir/$_", "$destdir/$_"];
}
}, ".");
print "Copying files...\n";
for ( @cp) {
my ( $from, $to) = @$_;
print "Installing $to ...\n";
push @instfiles, $to;
next if copy $from, $to;
abort "Error:$!\n";
}
print "Copying executables...\n";
for ( @cpbin) {
my ( $src, $dst) = @$_;
$dst .= $mswin32 ? '.bat' : '';
push @instfiles, $dst;
print "Installing $src ...\n";
if ( $mswin32) {
print "Installing $dst ...\n";
$dst =~ s/bat$/pl/;
abort "Error:$!\n" unless copy $src, $dst;
my $i = system("pl2bat $dst");
$src = $dst;
$dst =~ s/pl$/bat/;
abort "Error: pl2bat $dst failed\n" unless -f $dst;
unlink $src;
} else {
open SRCPL, "<$src" or abort "Cannot open $src: $!";
open DSTPL, ">$dst" or abort "Cannot create $dst: $!";
print DSTPL <<ENDP;
#!$Config{perlpath} -w
ENDP
my $filestart = 1;
while ( <SRCPL>) {
next if $filestart && /^\#\!/;
$filestart = 0;
print DSTPL;
}
close SRCPL;
close DSTPL;
}
}
if ( open F, "> install.log") {
print F "f:$_\n" for @instfiles;
print F "d:$_\n" for @instdir;
close F;
} else {
print "(!) Unable to write 'install.log' ($!), uninstall will be unavailable\n";
}
print <<D;
Installation of the Prima tookit is finished. Congratulations!
* To try out examples, cd to $iarc/examples and run the batch files there.
* To run Visual Builder, type 'VB'.
* To read the documentation, type 'podview'.
* To uninstall the toolkit, run 'perl ms_install.pl -uninstall'.
Visit http://www.prima.eu.org/ for the newest version.
D
my $found;
$ibin = lc $ibin;
$ibin =~ s/\\/\//g;
$ibin =~ s/[\/]*$//;
for ( split ( $Config{ path_sep}, $ENV{PATH})) {
my $path = lc;
$path =~ s/\\/\//g;
$path =~ s/[\/]*$//;
next if $path ne $ibin;
$found = 1;
}
warn <<NODLL unless $found;
** Warning: the executable and DLL files were installed into $ibin.
However, this directory does not seem to be included into
your PATH environment variable. You have to add $ibin
into your PATH, otherwise the toolkit will not work.
NODLL
} else {
die "Cannot uninstall - install.log not found\n" unless open F, "install.log";
my @dirs;
while ( <F>) {
chomp;
next unless m/^(.)\:(.*)$/;
print "Deleting $2...\n";
if ( $1 eq 'f') {
unlink $2;
} elsif ( $1 eq 'd') {
rmdir $2;
push @dirs, $2;
}
}
close F;
rmdir $_ for @dirs;
rmdir $_ for @dirs;
print "Done.\n";
}