diff --git a/tools/functions.make b/tools/functions.make index d08742a133..045354da66 100644 --- a/tools/functions.make +++ b/tools/functions.make @@ -33,7 +33,7 @@ c2obj = $(addsuffix .o,$(basename $(subst $(ROOTDIR),$(BUILDDIR),$(1)))) # calculate dependencies for a list of source files $(2) and output them # to a file $(1)_, to be later renamed to $(1). mkdepfile = $(shell \ - $(CC) $(PPCFLAGS) $(OTHER_INC) -MG -MM -include config.h $(2) | \ + perl $(TOOLSDIR)/multigcc.pl $(CC) $(PPCFLAGS) $(OTHER_INC) -MG -MM -include config.h -- $(2) | \ sed -e "s: lang.h: lang/lang_core.o:" \ -e 's:_asmdefs.o:_asmdefs.h:' \ -e "s: max_language_size.h: lang/max_language_size.h:" | \ diff --git a/tools/multigcc.pl b/tools/multigcc.pl new file mode 100755 index 0000000000..db544355ca --- /dev/null +++ b/tools/multigcc.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl +use List::Util 'shuffle'; # standard from Perl 5.8 and later + +my $tempfile = "multigcc.out"; +my @params; +my @files; +my $list = \@params; + +# parse command line arguments +for my $a (@ARGV) { + if ($a eq "--") { + $list = \@files; + next; + } + + push @{$list}, $a; +} + +my $command = join " ", @params; + +# shuffle the file list to spread the load as evenly as we can +@files = shuffle(@files); + +# count number of cores +my $cores = 1; +if (open CPUINFO, "; + close CPUINFO; +} + +# don't run empty children +if (scalar @files < $cores) +{ + $cores = 1; +} + +# fork children +my @pids; +my $slice = int((scalar @files / $cores) + 0.5); +for my $i (0 .. $cores-1) +{ + my $pid = fork; + if ($pid) + { + # mother + $pids[$i] = $pid; + } + else + { + # get my slice of the files + my @list = @files[$i * $slice .. $i * $slice + $slice - 1]; + + # run command + system("$command @list > $tempfile.$$"); + + exit; + } +} + +for my $i (0 .. $cores - 1) +{ + # wait for child to complete + waitpid $pids[$i], 0; + + # read & print result + if (open F, "<$tempfile.$pids[$i]") + { + print ; + close F; + unlink "$tempfile.$pids[$i]"; + } +}