: eval 'exec perl -wS $0 ${1+"$@"}' if 0; #************************************************************************* # # OpenOffice.org - a multi-platform office productivity suite # # $RCSfile: guw.pl,v $ # # $Revision: 1.27 $ # # last change: $Author: vg $ $Date: 2007-03-26 14:14:42 $ # # The Contents of this file are made available subject to # the terms of GNU Lesser General Public License Version 2.1. # # # GNU Lesser General Public License Version 2.1 # ============================================= # Copyright 2005 by Sun Microsystems, Inc. # 901 San Antonio Road, Palo Alto, CA 94303, USA # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License version 2.1, as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # #************************************************************************* # Description: ?? #--------------------------------------------------------------------------- # external modules use Text::ParseWords; # global vars @params = (); # set debug mode here: #$debug="true"; #$debug_light="true"; #--------------------------------------------------------------------------- # Define known parameter exceptions %knownpara = ( 'echo', [ '/TEST', 'QQQ', 'CCC', 'uno:' ], 'cl', [ '-clr:', '-Z' ], 'csc', [ '-target:' ], 'lib', [ 'OUT:', 'EXTRACT:','out:', 'def:', 'machine:' ], 'link', [ 'BASE:', 'DEBUG', 'DLL', 'LIBPATH', 'MACHINE:', 'MAP', 'NODEFAULTLIB', 'OPT', 'PDB', 'RELEASE', 'SUBSYSTEM', 'STACK', 'out:', 'map:', 'ENTRY:', 'implib:', 'delayload:', 'def', 'COMMENT:' ], 'regcomp', [ '-env:', 'vnd.sun.star.expand:' , 'vnd.openoffice.pymodule' ], 'regmerge', [ '/UCR' ], 'rc', [ '-D' ], 'rsc', [ '-DOOO_' ] ); #--------------------------------------------------------------------------- # procedures #---------------------------------------------------------- # Function name: myCygpath # Description: Transform POSIX path to DOS path # Arguments: 1. Variable (string) with one token # 2. optional - if set remove spaces and shorten to 8.3 # representation. # Return value: Reformatted String #---------------------------------------------------------- sub myCygpath { my $posixpath = shift; my $shortenpath = shift || ''; my $dospath; if ( $posixpath =~ / / and $shortenpath ) { chomp( $dospath = qx{cygpath -d "$posixpath"} ); # "cygpath -d" returns "" if the file doesn't exist. if ($dospath eq "") { $dospath = "."; print(STDERR "Error: guw.pl: Path: $posixpath:\nhas a problem! Probably nonexistent filename with space.\n"); if ( (defined $debug_light) or (defined $debug) ) { die "exiting ...\n"; } } } else { if ( $posixpath =~ /^\// ) { chomp( $dospath = qx{cygpath -w "$posixpath"} ); } else { $dospath = $posixpath; $dospath =~ s/\//\\/g; } } return $dospath; } #---------------------------------------------------------- # Function name: WinFormat # Description: Format variables to Windows Format. # Arguments: 1. Variable (string) with one token # Return value: Reformatted String #---------------------------------------------------------- sub WinFormat { my $variable = shift @_; my( $d1, $d1_prefix, $d2 ); $variable =~ s/(\$\w+)/$1/eeg ; # expand the variables $variable =~ s/(\$\w+)/$1/eeg ; # expand the variables twice! # Include paths or parameters with filenames if ( $variable =~ /\A(-D[\w\.]*=)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # This regex evaluates -D=, sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\ninclude (-D=) path:\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); if ( $d2 ne "" ) { $d2 =~ s/\\/\\\\/g ; } } elsif ( $variable =~ /\A(-?\w[\w\.]*=)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # This regex evaluates [-]X=, sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\ninclude ([-]=) path:\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); } elsif ( $variable =~ /\A(--\w[\w\.\-]*=)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # This regex evaluates --=, sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\ninclude (--=) path:\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); } elsif ( $variable =~ /\A(-\w[\w\.]*:)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # This regex evaluates -X:, sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\nFound (-:):\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); } elsif ( $variable =~ /\A(-\w+:)(.*)\Z/ ) { # This regex evaluates -X:, and prevents translating of these. # option -> $1, rest -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\nFound (-:):\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); } elsif ( $variable =~ /\A(\w+:)[\'\"]?\/\/\/((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # See iz35982 for the reason for the special treatment of this switch. # This regex evaluates :///, sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\nFound (:///):\n$variable\n"); } $d1_prefix = $1."///"; $d1 = $2; $d2 = myCygpath($2,1); $d2 =~ s/\\/\//g ; } elsif ( $variable =~ /\A(-\w)[\'\"]?((?:\/[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # This regex evaluates -X, sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\ninclude (-X) path:\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); } elsif ( $variable =~ /\A(-F[ARdemopr])[\'\"]?((?:\/[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { # This regex evaluates -FX (MSVC switches for output naming), sometimes with quotes or "/" at the end # option -> $1, filename without quotes -> $2 if ( defined $debug ) { print(STDERR "WinFormat:\ncompiler naming (-FX) path:\n$variable\n"); } $d1_prefix = $1; $d1 = $2; $d2 = myCygpath($2,1); } else { $d2 = ""; } if ( $d2 ne "" ) { # Found a parameter $d1 =~ s/\+/\\\+/ ; $d1 =~ s/\./\\\./ ; $variable =~ s/$d1/$d2/ ; } else { # Found no parameter, assume a path $variable =~ s/:/;/g; $variable =~ s/([;]|\A)(\w);/$1$2:/g; # get back the drives # Search for posix path ;entry; (The regex accepts valid paths with at least one /) # and replace with DOS path, accept quotes. # iz28717 Accept ',' as path seperator. while ( $variable =~ /(?:[;,]|\A)[\'\"]?([\w\.\-\+ ~]*(?:\/[\w\.\-\+ ~]+)+\/?)[\'\"]?(?:[;,]|\Z)/ ) { # Normal paths $d1 = $1; $d2 = myCygpath($d1); if ( defined $debug ) { print(STDERR "WinFormat:\nFull path:\n$variable\nTranslated part:$d2\n"); } $d1 =~ s/\+/\\\+/ ; $variable =~ s/$d1/$d2/ ; } } # Sanity check for -X if ( $variable =~ /-\w[\'\"]?(?:(?:\/[\w\.\-\+ ~]+)+)/ ) { print(STDERR "Error: guw.pl: WinFormat: Not converted -X/... type switch in :$variable:.\n"); if ( (defined $debug_light) or (defined $debug) ) { die "\nNot processed -X/...\n"; } } # Sanity check for [-]X(:|=) case if ( $variable =~ /\A-?\w[\w\.]*[=:][\'\"]?(?:\/[\w\.\-\+ ~]+)+/ ) { print(STDERR "Error: guw.pl: WinFormat: Not converted [-]X(=|:)/ type switch in :$variable:.\n"); if ( (defined $debug_light) or (defined $debug) ) { die "\nNot processed [-]X(=|:)/...\n"; } } if ( defined $debug ) { print(STDERR "WinFormat:\nresult:$variable\n");}; return $variable; } #---------------------------------------------------------- # Function name: replace_cyg # Description: Process all arguments and change them to Windows Format. # Arguments: Reference to array with arguments # Return value: - #---------------------------------------------------------- sub replace_cyg { my $args = shift; my( @cmd_file, @cmd_temp ); my $atchars; foreach my $para ( @$args ) { if ( $para =~ "^@" ) { # it's a command file if ( defined $debug ) { print(STDERR "----------------------------\n");}; # Workaround, iz28717, keep number of @'s. $para =~ s/(^\@+)//; $atchars = $1; $filename = $para; if ( defined $debug ) { print(STDERR "filename = $filename \n");}; # open this command file for reading open(CMD, "$filename"); while ( ) { # Remove DOS lineendings. Bug in Cygwin / Perl? $_ =~ s/\r//g; # Remove lineendings and trailing spaces. ( Needed by &parse_line ) $_ =~ s/\n$//g; $_ =~ s/\s+$//g; # Fill all tokens into array @cmd_temp = &parse_line('\s+', 1, $_ ); if ( $#cmd_temp > -1 ) { push( @cmd_file, @cmd_temp); } } close(CMD); # reformat all tokens replace_cyg(\@cmd_file); if ( defined $debug ) { print(STDERR "Tokens processed:\n");}; foreach $i (@cmd_file) { if ( defined $debug ) { print(STDERR "!".$i."!\n");}; } # open this filename for writing (truncate) Textmode? open(CMD, '>', $filename); # write all tokens back into this file print(CMD join(' ', @cmd_file)); close(CMD); # convert '@filename' to dos style $para = WinFormat( $para ); if ( defined $debug ) { print(STDERR "----------------------------\n");}; if ( (defined $debug_light) or (defined $debug) ) { print(STDERR "\nParameter in File:".join(' ', @cmd_file).":\n");} $para = $atchars.$para; } else { # it's just a parameter if ( defined $debug ) { print(STDERR "\nParameter:---${para}---\n");}; # If $tmp1 is empty then $para is a parameter. my $is_no_para = 1; # remove .exe and convert to lower case $shortcommand = lc $command ; $shortcommand =~ s/\.exe$//; $shortcommand =~ /([^\/]+$)/; $shortcommand = $1; foreach $i (@{$knownpara{$shortcommand}}) { if( $para =~ /$i/ ) { $is_no_para = 0; if ( defined $debug ) { print(STDERR "Is parameter exception for ${shortcommand}: ${para}:\n" );}; last; } } if( $is_no_para ) { $para = WinFormat($para); } if ( defined $debug ) { print(STDERR "Converted line:${para}:\n" );}; } # else } # foreach loop } #---------------------------------------------------------- # Function name: replace_cyg_env # Description: Process selected environment variables and change # them to Windows Format. # Arguments: - # Return value: - #---------------------------------------------------------- sub replace_cyg_env { @affected_vars = ( 'SOLAR_VERSION', 'SOLARVERSION', 'SOLARVER', 'SRC_ROOT', 'LOCALINI', 'GLOBALINI', 'SOLARENV', 'STAR_INSTPATH', 'STAR_SOLARPATH', 'STAR_PACKMISC', 'STAR_SOLARENVPATH', 'STAR_INITROOT', 'STAR_STANDLST', 'CLASSPATH', 'JAVA_HOME' ); foreach my $one_var ( @affected_vars ) { my $this_var = $ENV{ $one_var }; if ( defined $this_var ) { if ( defined $debug ) { print(STDERR "ENV $one_var before: ".$ENV{ $one_var}."\n" );}; $ENV{ $one_var } = WinFormat( $this_var ); if ( defined $debug ) { print(STDERR "ENV $one_var after : ".$ENV{ $one_var}."\n" );}; } } } #--------------------------------------------------------------------------- # main @params = @ARGV; $command = shift(@params); while ( $command =~ /^-/ ) { if ( $command eq "-env" ) { replace_cyg_env; } $command = shift(@params); } if ( (defined $debug_light) or (defined $debug) ) { print( STDERR "Command: $command\n" ); } replace_cyg(\@params); if ( (defined $debug_light) or (defined $debug) ) { print(STDERR "\n---------------------\nExecute: $command @params\n----------------\n");}; exec( "$command", @params) or die( "\nError: guw.pl: executing $command failed!\n" );