diff --git a/test_regress/driver.pl b/test_regress/driver.pl index 2ba123be1..79c242571 100755 --- a/test_regress/driver.pl +++ b/test_regress/driver.pl @@ -861,30 +861,50 @@ sub _run { print " > $param{logfile}" if $param{logfile}; print "\n"; - if ($param{logfile}) { - open(SAVEOUT, ">&STDOUT") or die "%Error: Can't dup stdout"; - open(SAVEERR, ">&STDERR") or die "%Error: Can't dup stderr"; - if (0) {close(SAVEOUT); close(SAVEERR);} # Prevent unused warning - if ($param{tee}) { - open(STDOUT, "|tee $param{logfile}") or die "%Error: Can't redirect stdout"; - } else { - open(STDOUT, ">$param{logfile}") or die "%Error: Can't open $param{logfile}"; + # Execute command redirecting output, keeping order between stderr and stdout. + # Must do low-level IO so GCC interaction works (can't be line-based) + my $status; + { + pipe(PARENTRD, CHILDWR) or die "%Error: Can't Pipe, stopped"; + autoflush PARENTRD 1; + autoflush CHILDWR 1; + my $logfh; + if ($param{logfile}) { + $logfh = IO::File->new(">$param{logfile}") or die "%Error: Can't open $param{logfile}"; } - open(STDERR, ">&STDOUT") or die "%Error: Can't dup stdout"; - autoflush STDOUT 1; - autoflush STDERR 1; + my $pid=fork(); + if ($pid) { # Parent + close CHILDWR; + while (1) { + my $buf = ''; + my $got = sysread PARENTRD,$buf,10000; + last if $got==0; + print $buf if $param{tee}; + print $logfh $buf if $logfh; + } + close PARENTRD; + close $logfh if $logfh; + } + else { # Child + close PARENTRD; + close $logfh if $logfh; + # Reset signals + $SIG{ALRM} = 'DEFAULT'; + $SIG{CHLD} = 'DEFAULT'; + # Logging + open(STDOUT, ">&CHILDWR") or croak "%Error: Can't redirect stdout, stopped"; + open(STDERR, ">&STDOUT") or croak "%Error: Can't dup stdout, stopped"; + autoflush STDOUT 1; + autoflush STDERR 1; + system "$command"; + exit ($? ? 10 : 0); # $?<<8 misses coredumps + } + waitpid($pid,0); + $status = $? || 0; } - - system "$command"; - my $status = $?; flush STDOUT; flush STDERR; - if ($param{logfile}) { - open (STDOUT, ">&SAVEOUT"); - open (STDERR, ">&SAVEERR"); - } - if (!$param{fails} && $status) { $self->error("Exec of $param{cmd}[0] failed\n"); } diff --git a/test_regress/t/t_dist_install.pl b/test_regress/t/t_dist_install.pl index 729d32da4..82f467d6f 100755 --- a/test_regress/t/t_dist_install.pl +++ b/test_regress/t/t_dist_install.pl @@ -38,10 +38,11 @@ if (!-r "$root/.git") { # Check empty my @files; $finds = `find $destdir -type f -print`; - foreach my $f (split /\n/, $finds) { - print "\tLEFT: $f\n"; - $f =~ s!^$cwd!.!; - push @files, $f; + foreach my $file (split /\n/, $finds) { + next if $file =~ /\.status/; # Made by driver.pl, not Verilator + print "\tLEFT: $file\n"; + $file =~ s!^$cwd!.!; + push @files, $file; } if ($#files >= 0) { $Self->error("Uninstall missed files: ",join(' ',@files)); diff --git a/test_regress/t/t_lint_only.pl b/test_regress/t/t_lint_only.pl index e0fb17b63..140f40c44 100755 --- a/test_regress/t/t_lint_only.pl +++ b/test_regress/t/t_lint_only.pl @@ -18,6 +18,7 @@ compile ( foreach my $file (glob("$Self->{obj_dir}/*t_lint_only*")) { next if $file =~ /simx_compile.log/; # Made by driver.pl, not Verilator + next if $file =~ /\.status/; # Made by driver.pl, not Verilator $Self->error("%Error: Created $file, but --lint-only shouldn't create files"); }