e6f960ad52f8cd8efaa0c4a9c46ffecdecfdea75
5 use File
::FnMatch
qw(fnmatch
);
8 our $CROSSDIR = "@crossdir@";
9 (our $ME = $0) =~ s
:^.*/::;
11 ###--------------------------------------------------------------------------
17 "usage: $ME [-kns] [-j N] =ARCHGLOB|:FLAVOUR ... [--] CMD [ARGS ...]\n";
21 print STDERR
"$0: $msg\n";
25 ###--------------------------------------------------------------------------
26 ### Read and prepare the configuration.
29 open my $fh, "<", "$CROSSDIR/etc/config.sh" or barf
"open config: $!";
32 if (/^\s*(#|$)/) { next; }
33 if (!/^([^=]+)='(.*)'$/) { barf
"bad config line `$_'"; }
34 my ($k, $v) = ($1, $2);
41 for my $f (split ' ', $C{"FLAVOURS"}) {
42 (my $v = $f) =~ tr/-/_/;
43 my @a = split ' ', $C{"${v}_ARCHS"};
48 ###--------------------------------------------------------------------------
49 ### Parse the command line.
60 my $mo = new MdwOpt
"hC:j:km:ns",
61 { "help" => { 'return' => "h" },
62 "directory" => { 'return' => 'C', 'arg' => 'req' },
63 "jobs" => { 'return' => "j", 'arg' => 'req' },
64 "keep-going" => { 'return' => "k" },
65 "marker" => { 'return' => "m", 'arg' => 'req' },
66 "dry-run" => { 'return' => "n" },
67 "silent" => { 'return' => "s" } },
72 my ($opt, $arg) = $mo->read;
73 last OPT
unless defined $opt;
74 if ($opt eq "h") { usage STDOUT
; exit 0; }
75 elsif ($opt eq "C") { $DIR = $arg; }
77 { $arg =~ /^[+]?\d+$/ or barf
"bad integer `$arg'"; $JOBS = $arg; }
78 elsif ($opt eq "k") { $KEEPGOING = 1; }
79 elsif ($opt eq "m") { $MARKER = $arg; }
80 elsif ($opt eq "n") { $DRYRUN = $arg; }
81 elsif ($opt eq "s") { $SILENT = $arg; }
83 if ($arg =~ /^=(.*)$/) {
86 ARCH
: for my $a (@ALLARCH) {
87 next ARCH
unless fnmatch
$pat, $a;
88 $match = 1; push @ARCH, $a;
90 $match or barf
"no architectures match `$pat'";
91 } elsif ($arg =~ /^:(.*)$/) {
93 exists $FLAVOUR{$f} or barf
"no architeture flavour `$f'";
94 push @ARCH, @
{%FLAVOUR{$f}};
103 $bad = 1 unless @ARCH && @CMD;
104 push @CMD, $mo->rest, @
{$mo->{argv
}};
105 if ($bad) { usage STDERR
; exit 2; }
107 ###--------------------------------------------------------------------------
108 ### Hack the arguments and run `make'.
114 $x =~ s/\Q$MARKER/\$*/g;
119 if ($CMD[0] eq 'make') { $TARGET = "run-make"; shift @CMD; }
120 our @MAKE = ("make");
121 push @MAKE, "-f$CROSSDIR/Makefile";
122 push @MAKE, "-j$JOBS" if defined $JOBS;
123 push @MAKE, "-k" if $KEEPGOING;
124 push @MAKE, "-n" if $DRYRUN;
125 push @MAKE, "-s" if $SILENT;
127 push @MAKE, "ARCHS=" . join " ", @ARCH;
128 push @MAKE, "ARGS=" . join " ", map { hack
$_ } @CMD;
129 push @MAKE, "CROSSDIR=$CROSSDIR";
130 push @MAKE, "DIR=" . hack
$DIR;
134 ###----- That's all, folks --------------------------------------------------