diff --git a/configure/RULES_BUILD b/configure/RULES_BUILD index 4440b2345..a58590739 100644 --- a/configure/RULES_BUILD +++ b/configure/RULES_BUILD @@ -348,7 +348,7 @@ testspec: $(TESTSCRIPTS) test-results: tapfiles ifneq ($(TAPFILES),) ifdef RUNTESTS_ENABLED - prove --failures --ext .tap --exec cat --color $(TAPFILES) + prove --failures --ext .tap --exec "$(CAT)" --color $(TAPFILES) endif endif diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index 230a2c18b..bd663070f 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -33,9 +33,16 @@ ok(msi('-S../t6-substitute.txt ../t6-template.txt'), slurp('../t6-result.txt')); # Output option -o my $out = 't7-output.txt'; -unlink $out; -msi("-I.. -o $out ../t1-template.txt"); -ok(slurp($out), slurp('../t1-result.txt')); +my $count = 5; # Try up to 5 times... +my $result; +do { + unlink $out; + msi("-I.. -o $out ../t1-template.txt"); + $result = slurp($out); + print "# msi output file empty, retrying\n" + if $result eq ''; +} while ($result eq '') && (--$count > 0); +ok($result, slurp('../t1-result.txt')); # Dependency generation, include/substitute model ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt')); diff --git a/src/tools/EPICS/Release.pm b/src/tools/EPICS/Release.pm index e2c4a6826..bceed2ed7 100644 --- a/src/tools/EPICS/Release.pm +++ b/src/tools/EPICS/Release.pm @@ -17,22 +17,24 @@ sub readReleaseFiles { $Rmacros->{'EPICS_HOST_ARCH'} = $hostarch if $hostarch; return unless (-e $relfile); - readRelease($relfile, $Rmacros, $Rapps); + + my %done; + &readRelease($relfile, $Rmacros, $Rapps, \%done); if ($hostarch) { my $hrelfile = "$relfile.$hostarch"; - readRelease($hrelfile, $Rmacros, $Rapps) if (-e $hrelfile); + &readRelease($hrelfile, $Rmacros, $Rapps, \%done) if (-e $hrelfile); $hrelfile .= '.Common'; - readRelease($hrelfile, $Rmacros, $Rapps) if (-e $hrelfile); + &readRelease($hrelfile, $Rmacros, $Rapps, \%done) if (-e $hrelfile); } if ($arch) { my $crelfile = "$relfile.Common.$arch"; - readRelease($crelfile, $Rmacros, $Rapps) if (-e $crelfile); + &readRelease($crelfile, $Rmacros, $Rapps, \%done) if (-e $crelfile); if ($hostarch) { my $arelfile = "$relfile.$hostarch.$arch"; - readRelease($arelfile, $Rmacros, $Rapps) if (-e $arelfile); + &readRelease($arelfile, $Rmacros, $Rapps, \%done) if (-e $arelfile); } } } @@ -41,10 +43,16 @@ sub readReleaseFiles { # Parse a configure/RELEASE* file and anything it includes # sub readRelease { - my ($file, $Rmacros, $Rapps) = @_; - # $Rmacros is a reference to a hash, $Rapps a ref to an array + my ($file, $Rmacros, $Rapps, $Rdone) = @_; + # $Rmacros and $Rdone are hash-refs, $Rapps an array-ref + + if (exists $Rdone->{$file}) { + die "Release.pm: Recursive loop found in RELEASE files,\n" . + "discovered in $file\n"; + } open(my $IN, '<', $file) or croak "Can't open $file: $!\n"; + $Rdone->{$file}++; while (<$IN>) { chomp; s/ \r $//x; # Shouldn't need this, but sometimes... @@ -69,7 +77,7 @@ sub readRelease { my ($op, $path) = m/^ \s* (-? include) \s+ (.*)/x; $path = expandMacros($path, $Rmacros); if (-e $path) { - readRelease($path, $Rmacros, $Rapps); + &readRelease($path, $Rmacros, $Rapps, $Rdone); } elsif ($op eq "include") { carp "EPICS/Release.pm: Include file '$path' not found\n"; }