Files
itgmania212121/Utils/install-stepmania.pl
T
Martin Natano e3347276b5 Build LoadingWindow_Gtk as an object module
CMake object modules have the advantage of allowing to set additional
compile flags for the involved files, but it's linked into the main
binary with the rest of the object files.

This removes GtkModule.so and the dynamic loading code that goes with
it.
2022-03-31 12:06:18 -07:00

243 lines
4.1 KiB
Perl

#!/usr/bin/perl
use warnings;
use strict;
sub ReadCommand
{
while(my $line = <F>)
{
chomp $line;
$line =~ s/[;#].*//;
$line =~ s/^ *//;
$line =~ s/ *$//;
# \foo\bar -> /foo/bar
$line =~ s-\\-/-g;
my $cur = 0;
my $quote = 0; # none
my @ret;
for(my $i = 0; $i < length($line); ++$i)
{
my $ch = substr($line,$i,1);
# Check for quotes. Any quote causes the parameter to
# be created; eg:
# Foo "" bar
# is "Foo", "", "bar".
if( $quote == 0 && $ch eq '\'' )
{
$ret[$cur] .= "";
$quote = 1;
next;
}
elsif( $quote == 0 && $ch eq '"' )
{
$ret[$cur] .= "";
$quote = 2;
next;
}
elsif( $quote == 1 && $ch eq '\'' )
{
$ret[$cur] .= "";
$quote = 0;
next;
}
elsif( $quote == 2 && $ch eq '"' )
{
$ret[$cur] .= "";
$quote = 0;
next;
}
elsif( $quote == 0 && $ch eq ' ' )
{
if( defined $ret[$cur] )
{
++$cur;
}
next;
}
$ret[$cur] .= $ch;
}
return @ret;
}
print "guh\n";
return 0;
}
sub CreateDirectories
{
my @dirs = split /\//, $_[0];
my $dir = "";
for( my $i = 0; $i <= $#dirs; ++$i )
{
$dir .= $dirs[$i] . "/";
if( ! -d $dir )
{
mkdir($dir) || die "mkdir($dir): $!";
}
}
}
if ($#ARGV == -1)
{
print "Install where? (eg. /usr/games/stepmania5)\n";
exit 1;
}
my $instdir = $ARGV[0];
print "Installing to $instdir\n";
# Normally, this script is run after building, which means we probably
# have a Makefile available. Look for it, and pull out vpath, if any,
# to see where the real source directory is.
my $bin_path;
if( -e "Makefile" )
{
my $vpath=`grep 'VPATH =' Makefile`;
chomp $vpath;
if( $vpath =~ /^VPATH = (.*)/ )
{
print "Vpath: $1\n";
$bin_path = `pwd`; # arr?
chomp $bin_path;
$bin_path .= "/src/";
chdir("$1") || die "chdir($1): $!";
}
}
if( !defined($bin_path) )
{
$bin_path="";
}
print "Binary path: $bin_path\n";
open(F, "stepmania.nsi") || die "Couldn't open stepmania.nsi: $!";
# Search for the default installation section.
my $FoundSection = 0;
while(!eof(F))
{
my @line=ReadCommand();
$#line == -1 && next;
if( $#line >= 1 && $line[0] eq "Section" && $line[1] eq "" )
{
$FoundSection = 1;
last;
}
}
$FoundSection || die "stepmania.nsi parse error";
my $FoundEnd = 0;
if( ! -d $instdir )
{
mkdir($instdir) || die "mkdir($instdir): $!";
}
my $OutPath = "";
while(!eof(F))
{
my @line=ReadCommand();
$#line == -1 && next;
if ( $line[0] eq "SectionEnd" )
{
$FoundEnd = 1;
last;
}
my $ignore=0;
for( my $i = 0; $i <= $#line; ++$i )
{
$line[$i] =~ s/\$INSTDIR/$instdir/g;
# If any arguments contain $SMPROGRAMS, it's related to the start menu; ignore it.
if( $line[$i] =~ /\$SMPROGRAMS/ )
{
$ignore=1;
}
}
$ignore && next;
# if ( $line[0] eq "CreateDirectory" )
# {
# if( ! -d $line[1] )
# {
# mkdir($line[1]) || die "mkdir($line[1]): $!";
# }
# next;
# }
if ( $line[0] eq "SetOutPath" )
{
$OutPath = $line[1];
next;
}
if ( $line[0] eq "File" )
{
my $pos = 1;
my $recurse = 0;
if( $line[$pos] eq "/r" )
{
++$pos;
$recurse = 1;
}
my $fn = $line[$pos];
# Ignore Windows binaries.
if ( $fn =~ /.*dll/i || $fn =~ /.*exe/i || $fn =~ /.*vdi/i )
{
next;
}
# Only create directories if we're actually installing something to them.
CreateDirectories( $OutPath );
my $args="-p";
if( $recurse )
{
$args="$args -r";
}
print "$fn -> $OutPath\n";
system("cp $args \"$fn\" \"$OutPath\"") && die;
next;
}
if ( $line[0] eq "RMDir" )
{
my $pos = 1;
my $recurse = 0;
if( $line[$pos] eq "/r" )
{
++$pos;
$recurse = 1;
}
my $dir = $line[$pos];
my $args="-f";
if( $recurse )
{
$args="$args -r";
}
if( -d $dir )
{
system("rm $args \"$dir\"");
}
next;
}
}
$FoundSection || print "warning: SectionEnd not found\n";
close F;
system("cp -vp \"" . $bin_path . "stepmania5\" \"$instdir\"");