mirror of
https://github.com/ctm/executor.git
synced 2024-11-23 05:33:16 +00:00
143 lines
4.2 KiB
Perl
Executable File
143 lines
4.2 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# This perl script takes a directory containing an Executor/DOS
|
|
# distribution and creates a Jered-style installation script. I'll
|
|
# clean this up once we have a better build procedure in place.
|
|
# Once the script is created, you copy it to DOS, make sure you have
|
|
# a copy of the Executor release in the DOS directory you specified,
|
|
# cd to the directory containing `makedisk', and type:
|
|
#
|
|
# makedisk C:\install.scr
|
|
#
|
|
# where C:\install.scr is the path where you put the script created
|
|
# by this program.
|
|
#
|
|
# Sample usage of this perl script:
|
|
#
|
|
# makedosinst /releases/dos/1.99c '1.99c' 'C:\EXECUTOR.19C' install.scr
|
|
|
|
# Make sure we've got the right number of arguments.
|
|
if ($#ARGV != 3 && ($#ARGV != 4 || $ARGV[0] ne '-self-extracting')) {
|
|
die "Usage: $0 [-self-extracting] distribution_directory release_name "
|
|
. "DOS_distribution_directory dest_script_file\n";
|
|
}
|
|
|
|
if ($ARGV[0] eq '-self-extracting') {
|
|
shift @ARGV;
|
|
$self_extracting = 1;
|
|
} else {
|
|
$self_extracting = 0;
|
|
}
|
|
|
|
$src_dir = $ARGV[0];
|
|
$version_name = $ARGV[1];
|
|
$dos_dir = $ARGV[2];
|
|
|
|
|
|
open (STDOUT, ">$ARGV[3]") || die "Unable to open output file.\n";
|
|
|
|
$dos_dir =~ tr/a-z/A-Z/;
|
|
&check_dos_pathname ($dos_dir, $dos_dir);
|
|
|
|
open (PREAMBLE, "<dosinst.preamble")
|
|
|| die "Can't open \"dosinst.preamble\"!\n";
|
|
chdir ($src_dir) || die "Unable to read directory \"$src_dir\".\n";
|
|
|
|
# Run find to get all the relevant filenames.
|
|
open (FILES, "(cd $src_dir && find . -type f -print) | sort |")
|
|
|| die "Unable to run find!";
|
|
|
|
if ($self_extracting) {
|
|
print "SFX=TRUE\r\nBUILDTO=C:\\TMP\r\nDRIVESIZE=1024000000\r\n";
|
|
} else {
|
|
print "BUILDTO=A:\r\nDRIVESIZE=1457664\r\n";
|
|
}
|
|
|
|
# Copy the install script preamble to stdout
|
|
while (<PREAMBLE>) {
|
|
chop;
|
|
$_ =~ s/\@executor-version@/$version_name/g;
|
|
print $_ . "\r\n";
|
|
}
|
|
|
|
# Print out the FILE section header.
|
|
print ("; Flag denoting the start of the file section.\r\n" .
|
|
"*FILE\r\n");
|
|
|
|
while (<FILES>)
|
|
{
|
|
chop;
|
|
|
|
($orig_path = $_) =~ s/^.\///g; # Remove initial "./".
|
|
($path = $orig_path) =~ tr/a-z/A-Z/; # Convert to upper case.
|
|
$path =~ s/\//\\/g; # Translate "/" to "\".
|
|
|
|
&check_dos_pathname ($path, $_);
|
|
|
|
# Prompt for overwrites for all files except the System File,
|
|
# which they must overwrite.
|
|
if ($path =~ /\.HFV/ && $path !~ /EXSYSTEM\.HFV/) {
|
|
$prompt_before_overwrite = 1;
|
|
} else {
|
|
$prompt_before_overwrite = 0;
|
|
}
|
|
|
|
if ($self_extracting || $path !~ /README.1ST/) {
|
|
if ($path =~ /\....$/) {
|
|
($compressed_path = $path) =~ s/.$/\$/g;
|
|
} elsif ($path =~ /\./) {
|
|
($compressed_path = $path) =~ s/.$/\$/g;
|
|
} else {
|
|
$compressed_path = $path . ".\$";
|
|
}
|
|
|
|
if ($paths_in_use{$compressed_path}) {
|
|
die "I end up using compressed filename \"$compressed_path\""
|
|
. "for files \"$orig_path\" and \""
|
|
. $paths_in_use{$compressed_path} . "\"!\n";
|
|
}
|
|
$paths_in_use{$compressed_path} = $orig_path;
|
|
|
|
# If it has any lower case letters, assume we want it compressed.
|
|
$file_list .= "ORIG=$dos_dir\\$path; SOURCE=INSTDATA"
|
|
. "; DEST=$path; OPN=3 CPN=$prompt_before_overwrite\r\n";
|
|
} else {
|
|
# It's a README, so don't compress it, and put it first.
|
|
$file_list = "ORIG=$dos_dir\\$path; SOURCE=$path; DEST=$path; "
|
|
. "OPN=0 CPN=$prompt_before_overwrite\r\n"
|
|
. $file_list;
|
|
}
|
|
}
|
|
|
|
# Print out the file list and the FILE section trailer.
|
|
print $file_list;
|
|
print (";End of File marker\r\n" .
|
|
"*END\r\n");
|
|
|
|
|
|
# This subroutine verifies that a pathname is suitable for DOS.
|
|
sub check_dos_pathname {
|
|
$dos_path = $_[0];
|
|
$orig_path = $_[1];
|
|
|
|
# Make sure this filename will work well in DOS land.
|
|
if ($dos_path =~ /\..*\./) {
|
|
die "Too many periods in filename \"" . $orig_path . "\"\n";
|
|
}
|
|
elsif ($dos_path =~ /[^\._[A-Z]\d\\]/) {
|
|
die "Non-alphanumeric character in filename \"" . $orig_path . "\"\n";
|
|
}
|
|
elsif ($dos_path =~ /[_A-Z\d]{9,}/) {
|
|
die "Too many characters before the `.' in filename \""
|
|
. $orig_path . "\"\n";
|
|
}
|
|
elsif ($dos_path =~ /\..{4,}/) {
|
|
die "Too many characters after the `.' in filename \""
|
|
. $orig_path . "\"\n";
|
|
}
|
|
elsif ($dos_path =~ /\..*\\/) {
|
|
die "There is a `.' in a directory name in filename \""
|
|
. $orig_path . "\"\n";
|
|
}
|
|
}
|