diff options
| author | Björn Stenberg <bjorn@haxx.se> | 2009-07-24 21:53:32 +0000 |
|---|---|---|
| committer | Björn Stenberg <bjorn@haxx.se> | 2009-07-24 21:53:32 +0000 |
| commit | 4fc00222cb5851e28e83d367f173038c7d026b03 (patch) | |
| tree | 01dc3cc97e5c09b405249686be586f5c3e1776b9 | |
| parent | eb0061411d6fa08ab540107cdbd2906e18e516d7 (diff) | |
| download | rockbox-4fc00222cb5851e28e83d367f173038c7d026b03.zip rockbox-4fc00222cb5851e28e83d367f173038c7d026b03.tar.gz rockbox-4fc00222cb5851e28e83d367f173038c7d026b03.tar.bz2 rockbox-4fc00222cb5851e28e83d367f173038c7d026b03.tar.xz | |
Dependency generation now uses all cores on multi-core machines.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22021 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | tools/functions.make | 2 | ||||
| -rwxr-xr-x | tools/multigcc.pl | 72 |
2 files changed, 73 insertions, 1 deletions
diff --git a/tools/functions.make b/tools/functions.make index d08742a..045354d 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 0000000..db54435 --- /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, "</proc/cpuinfo") { + $cores = scalar grep /^processor/i, <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 <F>; + close F; + unlink "$tempfile.$pids[$i]"; + } +} |