5 use File::FnMatch qw(fnmatch);
8 our $CROSSDIR = "@crossdir@";
9 (our $ME = $0) =~ s:^.*/::;
11 ###--------------------------------------------------------------------------
17 "usage: $ME [-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.
57 my $mo = new MdwOpt "hC:j:m:",
58 { "help" => { 'return' => "h" },
59 "directory" => { 'return' => 'C', 'arg' => 'req' },
60 "jobs" => { 'return' => "j", 'arg' => 'req' },
61 "marker" => { 'return' => "m", 'arg' => 'req' } },
66 my ($opt, $arg) = $mo->read;
67 last OPT unless defined $opt;
68 if ($opt eq "h") { usage STDOUT; exit 0; }
69 elsif ($opt eq "C") { $DIR = $arg; }
71 { $arg =~ /^[+]?\d+$/ or barf "bad integer `$arg'"; $JOBS = $arg; }
72 elsif ($opt eq "m") { $MARKER = $arg; }
74 if ($arg =~ /^=(.*)$/) {
77 ARCH: for my $a (@ALLARCH) {
78 next ARCH unless fnmatch $pat, $a;
79 $match = 1; push @ARCH, $a;
81 $match or barf "no architectures match `$pat'";
82 } elsif ($arg =~ /^:(.*)$/) {
84 exists $FLAVOUR{$f} or barf "no architeture flavour `$f'";
85 push @ARCH, @{%FLAVOUR{$f}};
94 $bad = 1 unless @ARCH && @CMD;
95 push @CMD, $mo->rest, @{$mo->{argv}};
96 if ($bad) { usage STDERR; exit 2; }
98 ###--------------------------------------------------------------------------
99 ### Hack the arguments and run `make'.
105 $x =~ s/\Q$MARKER/\$*/g;
110 if ($CMD[0] eq 'make') { $TARGET = "run-make"; shift @CMD; }
111 our @MAKE = ("make");
112 push @MAKE, "-f$CROSSDIR/Makefile";
113 push @MAKE, "-j$JOBS" if defined $JOBS;
115 push @MAKE, "ARCHS=" . join " ", @ARCH;
116 push @MAKE, "ARGS=" . join " ", map { hack $_ } @CMD;
117 push @MAKE, "CROSSDIR=$CROSSDIR";
118 push @MAKE, "DIR=" . hack $DIR;
122 ###----- That's all, folks --------------------------------------------------