From: Arnaud Giersch Date: Tue, 8 Apr 2014 11:43:26 +0000 (+0200) Subject: Update tesh.pl. X-Git-Tag: v3_11~130 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/fdaf71eadd3dc888cf85b3339d8b19d9e0561358 Update tesh.pl. * avoid to launch a shell for subcommands * improve substitutions for variables All tests pass on Linux, let's see what's happening on windows. --- diff --git a/buildtools/Cmake/Scripts/tesh.pl b/buildtools/Cmake/Scripts/tesh.pl index 451b26a991..0b819b1841 100755 --- a/buildtools/Cmake/Scripts/tesh.pl +++ b/buildtools/Cmake/Scripts/tesh.pl @@ -33,6 +33,7 @@ my $tesh_name; my $error=0; my $exitcode=0; my @bg_cmds; +my (%environ); $path =~ s|[^/]*$||; push @INC,$path; @@ -40,6 +41,7 @@ push @INC,$path; use Getopt::Long qw(GetOptions); use strict; use Term::ANSIColor; +use Text::ParseWords; use IPC::Open3; use IO::File; @@ -51,13 +53,24 @@ else{ $ENV{"PRINTF_EXPONENT_DIGITS"} = "2"; } -#Add current directory to path -$ENV{PATH} = "$ENV{PATH}:."; - ## ## Command line option handling ## +sub var_subst { + my ($text, $name, $value) = @_; + if ($value) { + $text =~ s/\${$name(?::[=-][^}]*)?}/$value/g; + $text =~ s/\$$name(\W|$)/$value$1/g; + } + else { + $text =~ s/\${$name:=([^}]*)}/$1/g; + $text =~ s/\${$name}//g; + $text =~ s/\$$name(\W|$)/$1/g; + } + return $text; +} + # option handling helper subs sub cd_cmd { my $directory=$_[1]; @@ -89,20 +102,8 @@ sub setenv_cmd { die "[Tesh/CRITICAL] Malformed argument to setenv: expected 'name=value' but got '$_[1]'\n"; } - if($var =~ /bindir/){ - print "[Tesh/INFO] setenv $var=$ctn\n"; - $bindir = $ctn; - } - else - { - if($var =~ /srcdir/){ - $srcdir = $ctn; - } - else{ - $ENV{$var} = $ctn; - print "[Tesh/INFO] setenv $var=$ctn\n"; - } - } + print "[Tesh/INFO] setenv $var=$ctn\n"; + $environ{$var} = $ctn; } # Main option parsing sub @@ -220,25 +221,31 @@ sub exec_cmd { } # cleanup the command line - if($OS eq "WIN"){ - $cmd{'cmd'} =~ s/\${EXEEXT:=}/.exe/g; - $cmd{'cmd'} =~ s/\${EXEEXT}/.exe/g; - $cmd{'cmd'} =~ s/\$EXEEXT/.exe/g; - } - else{ - $cmd{'cmd'} =~ s/\${EXEEXT:=}//g; - } - $cmd{'cmd'} =~ s/\${bindir:=}/$bindir/g; - $cmd{'cmd'} =~ s/\${srcdir:=}/$srcdir/g; - $cmd{'cmd'} =~ s/\${bindir:=.}/$bindir/g; - $cmd{'cmd'} =~ s/\${srcdir:=.}/$srcdir/g; - $cmd{'cmd'} =~ s/\${bindir}/$bindir/g; - $cmd{'cmd'} =~ s/\${srcdir}/$srcdir/g; -# $cmd{'cmd'} =~ s|^\./||g; -# $cmd{'cmd'} =~ s|tesh|tesh.pl|g; - $cmd{'cmd'} =~ s/\(%i:%P@%h\)/\\\(%i:%P@%h\\\)/g; + if($OS eq "WIN") { + var_subst($cmd{'cmd'}, "EXEEXT", ".exe"); + } else { + var_subst($cmd{'cmd'}, "EXEEXT", ""); + } + + # substitute environ variables + foreach my $key (keys %environ) { + $cmd{'cmd'} = var_subst($cmd{'cmd'}, $key, $environ{$key}); + } + # substitute remaining variables, if any + while ($cmd{'cmd'} =~ /\${(\w+)(?::[=-][^}]*)?}/) { + $cmd{'cmd'} = var_subst($cmd{'cmd'}, $1, ""); + } + while ($cmd{'cmd'} =~ /\$(\w+)/) { + $cmd{'cmd'} = var_subst($cmd{'cmd'}, $1, ""); + } + + # add cfg options $cmd{'cmd'} .= " $opts{'cfg'}" if (defined($opts{'cfg'}) && length($opts{'cfg'})); + # final cleanup + $cmd{'cmd'} =~ s/^\s+//; + $cmd{'cmd'} =~ s/\s+$//; + print "[$tesh_name:$cmd{'line'}] $cmd{'cmd'}\n" ; ### @@ -248,7 +255,8 @@ sub exec_cmd { $cmd{'got'} = IO::File->new_tmpfile; $cmd{'got'}->autoflush(1); local *E = $cmd{'got'}; - $cmd{'pid'} = open3(\*CHILD_IN, ">&E", ">&E", $cmd{'cmd'} ); + $cmd{'pid'} = open3(\*CHILD_IN, ">&E", ">&E", + quotewords('\s+', 0, $cmd{'cmd'})); # push all provided input to executing child map { print CHILD_IN "$_\n"; } @{$cmd{'in'}};