diff options
Diffstat (limited to 'solenv/bin/subsequenttests')
-rwxr-xr-x | solenv/bin/subsequenttests | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/solenv/bin/subsequenttests b/solenv/bin/subsequenttests new file mode 100755 index 000000000000..34e6b8034c70 --- /dev/null +++ b/solenv/bin/subsequenttests @@ -0,0 +1,131 @@ +eval 'exec "$PERL" -Sw "$0" "$@"' + if 0; +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org 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 version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#***********************************************************************/ + +use lib("$ENV{SOLARENV}/bin/modules"); +use SourceConfig; + +my $max_running = 1; +while (@ARGV) { + my $arg = shift(@ARGV); + if ($arg =~ /^-P([1-9]\d*)$/) { + $max_running = $1; + } elsif ($arg eq '--') { + last; + } else { + print STDERR "unknown argument \"$arg\"\n"; + print STDERR "usage: $0 [-P<n>] [-- <args>]\n"; + print STDERR " -P<n> number of parallel dmake invocations\n"; + print STDERR " <args> are passed to dmake invocations\n"; + exit(1); + } +} + +my @testpaths = (); +my $sc = SourceConfig->new(); +my $module; +foreach $module ($sc->get_active_modules()) { + my $buildlst = $sc->get_module_build_list($module); + next unless defined($buildlst); + my %deps = (); + open(BUILDLST, $buildlst) or die("cannot open $buildlst"); + while (<BUILDLST>) { + next unless + /^\s*\w+\s+(\S+)\s+nmake\s+-\s+all\s+(\S+)(\s+(:?\S+\s+)*)NULL\s*$/; + my ($dir, $id, $ids) = ($1, $2, $3); + $dir =~ s|\\|/|g; + $dir =~ s|^[^/]+||; + my $path = $sc->get_module_path($module) . $dir; + my $makefile = $path . '/makefile.mk'; + open(MAKEFILE, $makefile) or die("cannot open $makefile"); + while (<MAKEFILE>) { + if (/\bOOO_SUBSEQUENT_TESTS\b/) { + push(@testpaths, $path); + $deps{$id} = $ids; + last; + } + } + close(MAKEFILE); + } + close(BUILDLST); + my $id1; + foreach $id1 (keys(%deps)) { + my ($id2, $ids); + while (($id2, $ids) = each(%deps)) { + $ids !~ /\s\Q$id1\E\s/ or die("$module: $id2 depends on $id1"); + } + } +} + +my $cmd = 'dmake'; +foreach (@ARGV) { + s/'/'\''/g; + $cmd .= " '" . $_ . "'"; +} +$cmd .= ' 2>&1 |'; + +my %pids = (); +my @failedpaths = (); +my $running = 0; +my $counter = 0; +while (@testpaths || $running > 0) { + while (@testpaths && $running < $max_running) { + my $testpath = shift(@testpaths); + ++$counter; + print("$counter: make $testpath\n"); + my $pid = fork(); + defined($pid) or die("$counter: $!"); + if ($pid == 0) { + chdir($testpath) or die("$counter: $!"); + $ENV{'OOO_SUBSEQUENT_TESTS'} = 'TRUE'; + open(OUTPUT, $cmd) or die("$counter: $!"); + while (<OUTPUT>) { + s/\r?\n$//; + print("$counter: $_\n"); + } + close(OUTPUT); + exit($? == 0 ? 0 : 1); + } + $pids{$pid} = $testpath; + ++$running; + } + my $pid = wait(); + $pid != -1 or die($!); + my $testpath = delete($pids{$pid}); + defined($testpath) or die("unmatched PID $pid"); + if ($? != 0) { + @testpaths = (); + push(@failedpaths, $testpath); + } + --$running; +} +my $failedpath; +foreach $failedpath (@failedpaths) { + print STDERR "failed in $failedpath\n"; +} +exit(scalar(@failedpaths) == 0 ? 0 : 1); |