aboutsummaryrefslogtreecommitdiff
path: root/debian/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'debian/scripts')
-rwxr-xr-xdebian/scripts/abi-check210
-rwxr-xr-xdebian/scripts/config-check413
-rwxr-xr-xdebian/scripts/control-create25
-rwxr-xr-xdebian/scripts/link-headers42
-rwxr-xr-xdebian/scripts/misc/get-firmware45
-rwxr-xr-xdebian/scripts/misc/getabis126
-rwxr-xr-xdebian/scripts/misc/git-ubuntu-log232
-rwxr-xr-xdebian/scripts/misc/insert-changes.pl36
-rwxr-xr-xdebian/scripts/misc/insert-mainline-changes42
-rwxr-xr-xdebian/scripts/misc/insert-ubuntu-changes58
-rwxr-xr-xdebian/scripts/misc/kernelconfig172
-rwxr-xr-xdebian/scripts/misc/retag34
-rwxr-xr-xdebian/scripts/misc/splitconfig.pl107
-rwxr-xr-xdebian/scripts/module-check120
-rwxr-xr-xdebian/scripts/module-inclusion60
-rw-r--r--debian/scripts/sub-flavour69
16 files changed, 1791 insertions, 0 deletions
diff --git a/debian/scripts/abi-check b/debian/scripts/abi-check
new file mode 100755
index 00000000000..c7a02c5589a
--- /dev/null
+++ b/debian/scripts/abi-check
@@ -0,0 +1,210 @@
+#!/usr/bin/perl -w
+
+my $flavour = shift;
+my $prev_abinum = shift;
+my $abinum = shift;
+my $prev_abidir = shift;
+my $abidir = shift;
+my $skipabi = shift;
+
+my $fail_exit = 1;
+my $EE = "EE:";
+my $errors = 0;
+my $abiskip = 0;
+
+my $count;
+
+print "II: Checking ABI for $flavour...\n";
+
+if (-f "$prev_abidir/ignore"
+ or -f "$prev_abidir/$flavour.ignore" or "$skipabi" eq "true") {
+ print "WW: Explicitly asked to ignore ABI, running in no-fail mode\n";
+ $fail_exit = 0;
+ $abiskip = 1;
+ $EE = "WW:";
+}
+
+if ($prev_abinum != $abinum) {
+ print "II: Different ABI's, running in no-fail mode\n";
+ $fail_exit = 0;
+ $EE = "WW:";
+}
+
+if (not -f "$abidir/$flavour" or not -f "$prev_abidir/$flavour") {
+ print "EE: Previous or current ABI file missing!\n";
+ print " $abidir/$flavour\n" if not -f "$abidir/$flavour";
+ print " $prev_abidir/$flavour\n" if not -f "$prev_abidir/$flavour";
+
+ # Exit if the ABI files are missing, but return status based on whether
+ # skip ABI was indicated.
+ if ("$abiskip" eq "1") {
+ exit(0);
+ } else {
+ exit(1);
+ }
+}
+
+my %symbols;
+my %symbols_ignore;
+my %modules_ignore;
+my %module_syms;
+
+# See if we have any ignores
+my $ignore = 0;
+print " Reading symbols/modules to ignore...";
+
+for $file ("$prev_abidir/../blacklist", "$prev_abidir/../../perm-blacklist") {
+ if (-f $file) {
+ open(IGNORE, "< $file") or
+ die "Could not open $file";
+ while (<IGNORE>) {
+ chomp;
+ if ($_ =~ m/M: (.*)/) {
+ $modules_ignore{$1} = 1;
+ } else {
+ $symbols_ignore{$_} = 1;
+ }
+ $ignore++;
+ }
+ close(IGNORE);
+ }
+}
+print "read $ignore symbols/modules.\n";
+
+sub is_ignored($$) {
+ my ($mod, $sym) = @_;
+
+ die "Missing module name in is_ignored()" if not defined($mod);
+ die "Missing symbol name in is_ignored()" if not defined($sym);
+
+ if (defined($symbols_ignore{$sym}) or defined($modules_ignore{$mod})) {
+ return 1;
+ }
+ return 0;
+}
+
+# Read new syms first
+print " Reading new symbols ($abinum)...";
+$count = 0;
+open(NEW, "< $abidir/$flavour") or
+ die "Could not open $abidir/$flavour";
+while (<NEW>) {
+ chomp;
+ m/^(\S+)\s(.+)\s(0x[0-9a-f]+)\s(.+)$/;
+ $symbols{$4}{'type'} = $1;
+ $symbols{$4}{'loc'} = $2;
+ $symbols{$4}{'hash'} = $3;
+ $module_syms{$2} = 0;
+ $count++;
+}
+close(NEW);
+print "read $count symbols.\n";
+
+# Now the old symbols, checking for missing ones
+print " Reading old symbols ($prev_abinum)...";
+$count = 0;
+open(OLD, "< $prev_abidir/$flavour") or
+ die "Could not open $prev_abidir/$flavour";
+while (<OLD>) {
+ chomp;
+ m/^(\S+)\s(.+)\s(0x[0-9a-f]+)\s(.+)$/;
+ $symbols{$4}{'old_type'} = $1;
+ $symbols{$4}{'old_loc'} = $2;
+ $symbols{$4}{'old_hash'} = $3;
+ $count++;
+}
+close(OLD);
+
+print "read $count symbols.\n";
+
+print "II: Checking for missing symbols in new ABI...";
+$count = 0;
+foreach $sym (keys(%symbols)) {
+ if (!defined($symbols{$sym}{'type'})) {
+ print "\n" if not $count;
+ printf(" MISS : %s%s\n", $sym,
+ is_ignored($symbols{$sym}{'old_loc'}, $sym) ? " (ignored)" : "");
+ $count++ if !is_ignored($symbols{$sym}{'old_loc'}, $sym);
+ }
+}
+print " " if $count;
+print "found $count missing symbols\n";
+if ($count) {
+ print "$EE Symbols gone missing (what did you do!?!)\n";
+ $errors++;
+}
+
+
+print "II: Checking for new symbols in new ABI...";
+$count = 0;
+foreach $sym (keys(%symbols)) {
+ if (!defined($symbols{$sym}{'old_type'})) {
+ print "\n" if not $count;
+ print " NEW : $sym\n";
+ $count++;
+ }
+}
+print " " if $count;
+print "found $count new symbols\n";
+if ($count and $prev_abinum == $abinum) {
+ print "WW: Found new symbols within same ABI. Not recommended\n";
+}
+
+print "II: Checking for changes to ABI...\n";
+$count = 0;
+my $moved = 0;
+my $changed_type = 0;
+my $changed_hash = 0;
+foreach $sym (keys(%symbols)) {
+ if (!defined($symbols{$sym}{'old_type'}) or
+ !defined($symbols{$sym}{'type'})) {
+ next;
+ }
+
+ # Changes in location don't hurt us, but log it anyway
+ if ($symbols{$sym}{'loc'} ne $symbols{$sym}{'old_loc'}) {
+ printf(" MOVE : %-40s : %s => %s\n", $sym, $symbols{$sym}{'old_loc'},
+ $symbols{$sym}{'loc'});
+ $moved++;
+ }
+
+ # Changes to export type are only bad if new type isn't
+ # EXPORT_SYMBOL. Changing things to GPL are bad.
+ if ($symbols{$sym}{'type'} ne $symbols{$sym}{'old_type'}) {
+ printf(" TYPE : %-40s : %s => %s%s\n", $sym, $symbols{$sym}{'old_type'}.
+ $symbols{$sym}{'type'}, is_ignored($symbols{$sym}{'loc'}, $sym)
+ ? " (ignored)" : "");
+ $changed_type++ if $symbols{$sym}{'type'} ne "EXPORT_SYMBOL"
+ and !is_ignored($symbols{$sym}{'loc'}, $sym);
+ }
+
+ # Changes to the hash are always bad
+ if ($symbols{$sym}{'hash'} ne $symbols{$sym}{'old_hash'}) {
+ printf(" HASH : %-40s : %s => %s%s\n", $sym, $symbols{$sym}{'old_hash'},
+ $symbols{$sym}{'hash'}, is_ignored($symbols{$sym}{'loc'}, $sym)
+ ? " (ignored)" : "");
+ $changed_hash++ if !is_ignored($symbols{$sym}{'loc'}, $sym);
+ $module_syms{$symbols{$sym}{'loc'}}++;
+ }
+}
+
+print "WW: $moved symbols changed location\n" if $moved;
+print "$EE $changed_type symbols changed export type and weren't ignored\n" if $changed_type;
+print "$EE $changed_hash symbols changed hash and weren't ignored\n" if $changed_hash;
+
+$errors++ if $changed_hash or $changed_type;
+if ($changed_hash) {
+ print "II: Module hash change summary...\n";
+ foreach $mod (sort { $module_syms{$b} <=> $module_syms{$a} } keys %module_syms) {
+ next if ! $module_syms{$mod};
+ printf(" %-40s: %d\n", $mod, $module_syms{$mod});
+ }
+}
+
+print "II: Done\n";
+
+if ($errors) {
+ exit($fail_exit);
+} else {
+ exit(0);
+}
diff --git a/debian/scripts/config-check b/debian/scripts/config-check
new file mode 100755
index 00000000000..f105815a119
--- /dev/null
+++ b/debian/scripts/config-check
@@ -0,0 +1,413 @@
+#!/usr/bin/perl
+#
+# check-config -- check the current config for issues
+#
+use strict;
+
+my $P = 'check-config';
+
+my $test = -1;
+if ($ARGV[0] eq '--test') {
+ $test = $ARGV[1] + 0;
+} elsif ($#ARGV != 4) {
+ die "Usage: $P <config> <arch> <flavour> <commonconfig> <warn-only>\n";
+}
+
+my ($config, $arch, $flavour, $commonconfig, $warn_only) = @ARGV;
+
+my $checks = "$commonconfig/enforce";
+my %values = ();
+
+# If we are in overridden then still perform the checks and emit the messages
+# but do not return failure. Those items marked FATAL will alway trigger
+# failure.
+my $fail_exit = 1;
+$fail_exit = 0 if ($warn_only eq 'true' || $warn_only eq '1');
+my $exit_val = 0;
+
+# Predicate execution engine.
+sub pred_first {
+ my ($rest) = @_;
+ my $depth = 0;
+ my $off;
+ my $char;
+ my $pred;
+
+ for ($off = 0; $off <= length($rest); $off++) {
+ $char = substr($rest, $off, 1);
+ if ($char eq '(') {
+ $depth++;
+ } elsif ($char eq ')') {
+ $depth--;
+ } elsif ($depth == 0 && $char eq '&') {
+ last;
+ } elsif ($depth == 0 && $char eq '|') {
+ last;
+ }
+ }
+ if ($depth > 0) {
+ die "$P: $rest: missing close parenthesis ')'\n";
+ } elsif ($depth < 0) {
+ die "$P: $rest: missing open parenthesis '('\n";
+ }
+
+ ($pred, $rest) = (substr($rest, 0, $off), substr($rest, $off + 1));
+
+ $pred =~ s/^\s*//;
+ $pred =~ s/\s*$//;
+
+ #print "pred<$pred> rest<$rest> char<$char>\n";
+ ($pred, $rest, $char);
+}
+
+sub pred_do {
+ my ($pred) = @_;
+ my (@a) = split(' ', $pred);
+ my $possible;
+
+ if ($a[0] eq 'arch') {
+ die "$P: $pred: malformed -- $pred <arch>\n" if ($#a < 1);
+ for $possible (@a[1..$#a]) {
+ #print " *** ARCH<$flavour ?? $possible>\n";
+ return 1 if ($arch eq $possible);
+ }
+ return 0;
+ } elsif ($a[0] eq 'flavour') {
+ die "$P: $pred: malformed -- $pred <flavour>\n" if ($#a < 1);
+ for $possible (@a[1..$#a]) {
+ #print " *** FLAVOUR<$flavour ?? $a[1]>\n";
+ return 1 if ($flavour eq $possible);
+ }
+ return 0;
+ } elsif ($a[0] eq 'value') {
+ die "$P: $pred: malformed -- $pred <name> <val>\n" if ($#a != 2);
+ #print " *** CHECK<$a[1] $a[2] ?? " . $values{$a[1]} . ">\n";
+ return ($values{$a[1]} eq $a[2]);
+ } elsif ($a[0] eq 'exists') {
+ die "$P: $pred: malformed -- $pred <name>\n" if ($#a != 1);
+ return (defined $values{$a[1]});
+ } else {
+ die "$P: $pred: unknown predicate\n";
+ }
+ return 1;
+}
+sub pred_exec {
+ my ($rest) = @_;
+ my $pred;
+ my $cut = 0;
+ my $res;
+ my $sep;
+
+ #print "pred_exec<$rest>\n";
+
+ ($pred, $rest, $sep) = pred_first($rest);
+
+ # Leading ! implies inversion.
+ if ($pred =~ /^\s*!\s*(.*)$/) {
+ #print " invert<$1>\n";
+ ($cut, $res) = pred_exec($1);
+ $res = !$res;
+
+ # Leading / implies a CUT operation.
+ } elsif ($pred =~ /^\s*\/\s*(.*)$/) {
+ #print " cut<$1>\n";
+ ($cut, $res) = pred_exec($1);
+ $cut = 1;
+
+ # Recurse left for complex expressions.
+ } elsif ($pred =~ /^\s*\((.*)\)\s*$/) {
+ #print " left<$1>\n";
+ ($cut, $res) = pred_exec($1);
+
+ # Check for common syntax issues.
+ } elsif ($pred eq '') {
+ if ($sep eq '&' || $sep eq '|') {
+ die "$P: $pred$rest: malformed binary operator\n";
+ } else {
+ die "$P: $pred$rest: syntax error\n";
+ }
+
+ # A predicate, execute it.
+ } else {
+ #print " DO<$pred> sep<$sep>\n";
+ $res = pred_do($pred);
+ }
+
+ #print " pre-return res<$res> sep<$sep>\n";
+ if ($sep eq '') {
+ #
+
+ # Recurse right for binary operators -- note these are lazy.
+ } elsif ($sep eq '&' || $sep eq '|') {
+ #print " right<$rest> ? sep<$sep> res<$res>\n";
+ if ($rest =~ /^\s*($|\||\&)/) {
+ die "$P: $pred$rest: malformed binary operator\n";
+ }
+ if ($cut == 0 && (($res && $sep eq '&') || (!$res && $sep eq '|'))) {
+ #print " right<$rest>\n";
+ ($cut, $res) = pred_exec($rest);
+ }
+
+ } else {
+ die "$P: $pred$rest: malformed predicate\n";
+ }
+ #warn " return cut<$cut> res<$res> sep<$sep>\n";
+ return ($cut, $res);
+}
+
+#
+# PREDICATE TESTS
+#
+my $test_total = 1;
+my $test_good = 0;
+sub pred_test {
+ my ($pred, $eres, $eerr) = @_;
+ my ($cut, $res, $err, $fail);
+
+ $test_total++;
+ if ($test != 0 && $test != $test_total - 1) {
+ return;
+ }
+
+ eval {
+ ($cut, $res) = pred_exec($pred);
+ };
+ $err = $@;
+ chomp($err);
+
+ $res = !!$res;
+ $eres = !!$eres;
+
+ $fail = '';
+ if (defined $eres && $res != $eres) {
+ $fail = "result missmatch, expected $eres returned $res";
+ }
+ if (defined $eerr && $err eq '') {
+ $fail = "error missmatch, expected '$eerr' returned success";
+ } elsif (defined $eerr && $err !~ /$eerr/) {
+ $fail = "error missmatch, expected '$eerr' returned '$err'";
+ } elsif (!defined $eerr && $err ne '') {
+ $fail = "error missmatch, expected success returned '$err'";
+ }
+
+ if ($fail eq '') {
+ $test_good++;
+ } else {
+ print "$pred: $test_total: FAIL: $fail\n";
+ }
+ #print "TEST<$pred> eres<$eres> eerr<$eerr> res<$res> err<$err>\n";
+}
+if ($test >= 0) {
+ $arch = 'MYARCH';
+ $flavour = 'MYFLAVOUR';
+ %values = ( 'ENABLED' => 'y', 'DISABLED' => 'n' );
+
+ # Errors.
+ my $eunkn = 'unknown predicate';
+ my $epred = 'malformed';
+ my $eclose = 'missing close parenthesis';
+ my $eopen = 'missing open parenthesis';
+ my $ebinary = 'malformed binary operator';
+
+ # Basic predicate tests.
+ print "TEST: $test_total: basic predicate tests ...\n";
+
+ pred_test('nosuchcommand', undef, $eunkn);
+ pred_test('arch', undef, $epred);
+ pred_test('arch MYARCH', 1, undef);
+ pred_test('arch MYARCH NOTMYARCH', 1, undef);
+ pred_test('arch NOTMYARCH MYARCH', 1, undef);
+ pred_test('arch NOTMYARCH NOTMYARCH MYARCH', 1, undef);
+ pred_test('arch NOTMYARCH MYARCH NOTMYARCH', 1, undef);
+ pred_test('arch NOTMYARCH', 0, undef);
+
+ pred_test('flavour', undef, $epred);
+ pred_test('flavour MYFLAVOUR', 1, undef);
+ pred_test('flavour NOTMYFLAVOUR MYFLAVOUR', 1, undef);
+ pred_test('flavour NOTMYFLAVOUR NOTMYFLAVOUR MYFLAVOUR', 1, undef);
+ pred_test('flavour NOTMYFLAVOUR MYFLAVOUR NOTMYFLAVOUR', 1, undef);
+ pred_test('flavour NOTMYFLAVOUR', 0, undef);
+
+ pred_test('value', undef, $epred);
+ pred_test('value ENABLED', undef, $epred);
+ pred_test('value ENABLED ENABLED ENABLED', undef, $epred);
+ pred_test('value ENABLED y', 1, undef);
+ pred_test('value ENABLED n', 0, undef);
+ pred_test('value DISABLED n', 1, undef);
+ pred_test('value DISABLED y', 0, undef);
+
+ pred_test('exists', undef, $epred);
+ pred_test('exists ENABLED ENABLED', undef, $epred);
+ pred_test('exists ENABLED', 1, undef);
+ pred_test('exists DISABLED', 1, undef);
+ pred_test('exists MISSING', 0, undef);
+
+ print "TEST: $test_total: inversion tests ...\n";
+ pred_test('!exists ENABLED', 0, undef);
+ pred_test('!exists MISSING', 1, undef);
+ pred_test('!!exists ENABLED', 1, undef);
+ pred_test('!!exists MISSING', 0, undef);
+ pred_test('!!!exists ENABLED', 0, undef);
+ pred_test('!!!exists MISSING', 1, undef);
+
+ print "TEST: $test_total: parentheses tests ...\n";
+ pred_test('(exists ENABLED)', 1, undef);
+ pred_test('((exists ENABLED))', 1, undef);
+ pred_test('(((exists ENABLED)))', 1, undef);
+ pred_test('(exists MISSING)', 0, undef);
+ pred_test('((exists MISSING))', 0, undef);
+ pred_test('(((exists MISSING)))', 0, undef);
+
+ pred_test('(!exists ENABLED)', 0, undef);
+ pred_test('((!exists ENABLED))', 0, undef);
+ pred_test('(((!exists ENABLED)))', 0, undef);
+ pred_test('(!exists MISSING)', 1, undef);
+ pred_test('((!exists MISSING))', 1, undef);
+ pred_test('(((!exists MISSING)))', 1, undef);
+
+ pred_test('((!(exists ENABLED)))', 0, undef);
+ pred_test('((!(exists MISSING)))', 1, undef);
+ pred_test('(!((exists ENABLED)))', 0, undef);
+ pred_test('(!((exists MISSING)))', 1, undef);
+ pred_test('!(((exists ENABLED)))', 0, undef);
+ pred_test('!(((exists MISSING)))', 1, undef);
+ pred_test('!((!(exists ENABLED)))', 1, undef);
+ pred_test('!((!(exists MISSING)))', 0, undef);
+ pred_test('!(!(!(exists ENABLED)))', 0, undef);
+ pred_test('!(!(!(exists MISSING)))', 1, undef);
+
+ pred_test('(', undef, $eclose);
+ pred_test('()(', undef, $eclose);
+ pred_test('(())(', undef, $eclose);
+ pred_test('((()))(', undef, $eclose);
+ pred_test('(()', undef, $eclose);
+ pred_test('((())', undef, $eclose);
+ pred_test('(((()))', undef, $eclose);
+ pred_test('(()()', undef, $eclose);
+ pred_test('((())()', undef, $eclose);
+
+ pred_test(')', undef, $eopen);
+ pred_test('())', undef, $eopen);
+ pred_test('(()))', undef, $eopen);
+ pred_test('((())))', undef, $eopen);
+
+ print "TEST: $test_total: binary and tests ...\n";
+
+ pred_test('exists ENABLED &', undef, $ebinary);
+ pred_test('& exists ENABLED', undef, $ebinary);
+ pred_test('exists ENABLED & & exists ENABLED', undef, $ebinary);
+
+ pred_test('exists MISSING & exists MISSING', 0, undef);
+ pred_test('exists MISSING & exists ENABLED', 0, undef);
+ pred_test('exists ENABLED & exists MISSING', 0, undef);
+ pred_test('exists ENABLED & exists ENABLED', 1, undef);
+
+ pred_test('exists MISSING & exists MISSING & exists MISSING', 0, undef);
+ pred_test('exists MISSING & exists MISSING & exists ENABLED', 0, undef);
+ pred_test('exists MISSING & exists ENABLED & exists MISSING', 0, undef);
+ pred_test('exists MISSING & exists ENABLED & exists ENABLED', 0, undef);
+ pred_test('exists ENABLED & exists MISSING & exists MISSING', 0, undef);
+ pred_test('exists ENABLED & exists MISSING & exists ENABLED', 0, undef);
+ pred_test('exists ENABLED & exists ENABLED & exists MISSING', 0, undef);
+ pred_test('exists ENABLED & exists ENABLED & exists ENABLED', 1, undef);
+
+ print "TEST: $test_total: binary or tests ...\n";
+
+ pred_test('exists ENABLED |', undef, $ebinary);
+ pred_test('| exists ENABLED', undef, $ebinary);
+ pred_test('exists ENABLED | | exists ENABLED', undef, $ebinary);
+
+ pred_test('exists MISSING | exists MISSING', 0, undef);
+ pred_test('exists MISSING | exists ENABLED', 1, undef);
+ pred_test('exists ENABLED | exists MISSING', 1, undef);
+ pred_test('exists ENABLED | exists ENABLED', 1, undef);
+
+ pred_test('exists MISSING | exists MISSING | exists MISSING', 0, undef);
+ pred_test('exists MISSING | exists MISSING | exists ENABLED', 1, undef);
+ pred_test('exists MISSING | exists ENABLED | exists MISSING', 1, undef);
+ pred_test('exists MISSING | exists ENABLED | exists ENABLED', 1, undef);
+ pred_test('exists ENABLED | exists MISSING | exists MISSING', 1, undef);
+ pred_test('exists ENABLED | exists MISSING | exists ENABLED', 1, undef);
+ pred_test('exists ENABLED | exists ENABLED | exists MISSING', 1, undef);
+ pred_test('exists ENABLED | exists ENABLED | exists ENABLED', 1, undef);
+
+ print "TEST: $test_total: binary or/and combination tests ...\n";
+
+ pred_test('exists MISSING | exists MISSING & exists MISSING', 0, undef);
+ pred_test('exists MISSING | exists MISSING & exists ENABLED', 0, undef);
+ pred_test('exists MISSING | exists ENABLED & exists MISSING', 0, undef);
+ pred_test('exists MISSING | exists ENABLED & exists ENABLED', 1, undef);
+ pred_test('exists ENABLED | exists MISSING & exists MISSING', 1, undef);
+ pred_test('exists ENABLED | exists MISSING & exists ENABLED', 1, undef);
+ pred_test('exists ENABLED | exists ENABLED & exists MISSING', 1, undef);
+ pred_test('exists ENABLED | exists ENABLED & exists ENABLED', 1, undef);
+
+ print "TEST: $test_total: binary and/or combination tests ...\n";
+
+ pred_test('exists MISSING & exists MISSING | exists MISSING', 0, undef);
+ pred_test('exists MISSING & exists MISSING | exists ENABLED', 0, undef);
+ pred_test('exists MISSING & exists ENABLED | exists MISSING', 0, undef);
+ pred_test('exists MISSING & exists ENABLED | exists ENABLED', 0, undef);
+ pred_test('exists ENABLED & exists MISSING | exists MISSING', 0, undef);
+ pred_test('exists ENABLED & exists MISSING | exists ENABLED', 1, undef);
+ pred_test('exists ENABLED & exists ENABLED | exists MISSING', 1, undef);
+ pred_test('exists ENABLED & exists ENABLED | exists ENABLED', 1, undef);
+
+ print "TEST: $test_total: cut tests ...\n";
+ pred_test('(arch MYARCH & exists MISSING) | exists ENABLED', 1, undef);
+ pred_test('(arch MYARCH &/ exists MISSING) | exists ENABLED', 0, undef);
+
+ $test_total--;
+ print "TEST: $test_good/$test_total succeeded\n";
+
+ exit $exit_val;
+}
+
+# Load up the current configuration values -- FATAL if this fails
+print "$P: $config: loading config\n";
+open(CONFIG, "<$config") || die "$P: $config: open failed -- $! -- aborting\n";
+while (<CONFIG>) {
+ # Pull out values.
+ /^#*\s*(CONFIG_\w+)[\s=](.*)$/ or next;
+ if ($2 eq 'is not set') {
+ $values{$1} = 'n';
+ } else {
+ $values{$1} = $2;
+ }
+}
+close(CONFIG);
+
+# FATAL: Check if we have an enforcement list.
+my $pass = 0;
+my $total = 0;
+my $line = '';
+print "$P: $checks: loading checks\n";
+open(CHECKS, "<$checks") || die "$P: $checks: open failed -- $! -- aborting\n";
+while (<CHECKS>) {
+ /^#/ && next;
+ chomp;
+
+ $line .= $_;
+ if ($line =~ /\\$/) {
+ chop($line);
+ $line .= " ";
+ next;
+ }
+ $line =~ /^\s*$/ && next;
+
+ #print "CHECK: <$line>\n";
+ $total++;
+ my (undef, $result) = pred_exec($line);
+ if (!$result) {
+ print "$P: FAIL: $line\n";
+ $exit_val = $fail_exit;
+ } else {
+ $pass++;
+ }
+
+ $line = '';
+}
+close(CHECKS);
+
+print "$P: $pass/$total checks passed -- exit $exit_val\n";
+exit $exit_val;
diff --git a/debian/scripts/control-create b/debian/scripts/control-create
new file mode 100755
index 00000000000..f8ee9a2408e
--- /dev/null
+++ b/debian/scripts/control-create
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+. debian/debian.env
+
+vars=$1
+
+. $vars
+
+if [ "$is_sub" = "" ]; then
+ flavour=$(basename $vars | sed 's/.*\.//')
+ stub=${DEBIAN}/control.d/flavour-control.stub
+else
+ flavour=$(basename $vars .vars)
+ stub=${DEBIAN}/sub-flavours/control.stub
+fi
+
+cat $stub | grep -v '^#' | sed \
+ -e "s#FLAVOUR#$flavour#g" \
+ -e "s#DESC#$desc#g" \
+ -e "s#ARCH#$arch#g" \
+ -e "s#SUPPORTED#$supported#g" \
+ -e "s#TARGET#$target#g" \
+ -e "s#BOOTLOADER#$bootloader#g" \
+ -e "s#=PROVIDES=#$provides#g" \
+ -e "s#=CONFLICTS=#$conflicts#g"
diff --git a/debian/scripts/link-headers b/debian/scripts/link-headers
new file mode 100755
index 00000000000..fb42dbd12e4
--- /dev/null
+++ b/debian/scripts/link-headers
@@ -0,0 +1,42 @@
+#!/bin/bash -e
+
+. debian/debian.env
+
+hdrdir="$1"
+symdir="$2"
+flavour="$3"
+
+echo "Symlinking and copying headers for $flavour..."
+
+excludes="( -path ./debian -prune -o -path ./${DEBIAN} -prune -o -path ./.git ) -prune -o"
+
+(
+find . $excludes -type f \
+ \( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \
+ -name '*.sh' -o -name '*.pl' -o -name '*.lds' \) -print
+find ./include ./scripts -name .gitignore -prune -o -type f -print
+find ./include -mindepth 1 -maxdepth 1 $excludes -type d -print
+) | (
+while read file; do
+ dir=$file
+ lastdir=$file
+
+ if [ -e "$hdrdir/$file" -o -L "$hdrdir/$file" ]; then
+ continue
+ fi
+
+ while [ ! -e "$hdrdir/$dir" -a ! -L "$hdrdir/$dir" ]; do
+ lastdir=$dir
+ dir=`dirname $dir`
+ done
+ # If the last item to exist is a symlink we assume all is good
+ if [ ! -L "$hdrdir/$dir" ]; then
+ # Turns things like "./foo" into "../"
+ deref="`echo -n $lastdir | sed -e 's/^\.//' -e's,/[^/]*,../,g'`"
+ item="`echo -n $lastdir | sed -e 's/^\.\///'`"
+ ln -s $deref$symdir/$item $hdrdir/$item
+ fi
+done
+)
+
+exit
diff --git a/debian/scripts/misc/get-firmware b/debian/scripts/misc/get-firmware
new file mode 100755
index 00000000000..3d49e289468
--- /dev/null
+++ b/debian/scripts/misc/get-firmware
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Find all files in linux-firmware that are new or different since the previous release
+# and copy them into the kernel firmware directory. You should only do this on the
+# backport branch since it would be redundant on the released kernel. It assumed you've
+# unpacked linux-firmware from each release into separate directories.
+#
+# Example: $0 ~/ubuntu/linux-firmware-precise ~/ubuntu/linux-firmware-quantal
+
+if [ "$1" = "" ] || [ "$2" = "" ] || [ ! -f $1/WHENCE ] || [ ! -f $2/WHENCE ]
+then
+ echo You must supply 2 firmware directories.
+ exit 1
+fi
+
+if [ ! -f debian/debian.env ]
+then
+ echo You must run this script from the root of the repo
+ exit 1
+fi
+
+CDIR=`pwd`
+OFW=$1
+NFW=$2
+
+cd $NFW
+#
+# Find all files in $NFW that are new or different from $1
+#
+(find . -type f | egrep -v "debian|git|LICEN|WHEN|READ|Make|configure" | sed 's;\./;;' | \
+while read f
+do
+ if [ ! -f $OFW/$f ]
+ then
+ echo $f
+ elif ! cmp $f $OFW/$f > /dev/null
+ then
+ echo $f
+ fi
+done) |\
+while read f
+do
+ mkdir -p $CDIR/firmware/`dirname $f`
+ cp -v $f $CDIR/firmware/`dirname $f`
+done
diff --git a/debian/scripts/misc/getabis b/debian/scripts/misc/getabis
new file mode 100755
index 00000000000..c48199de512
--- /dev/null
+++ b/debian/scripts/misc/getabis
@@ -0,0 +1,126 @@
+#!/bin/bash
+
+if [ "$#" != "2" ]; then
+ echo "Usage: $0 <release> <revision>" 1>&2
+ exit 1
+fi
+
+if [ "$DEBIAN" = "" ]; then
+ . debian/debian.env
+fi
+
+ver=$1
+revision=$2
+abi=$(echo $revision | awk -F. '{print $1}')
+
+verabi=$ver-$abi
+verfull=$ver-$revision
+
+WGET="wget --tries=1 --timeout=10 --quiet -c"
+
+abidir="`pwd`/$DEBIAN/abi/$verfull"
+tmpdir="`pwd`/abi-tmp-$verfull"
+origdir="`pwd`"
+fwinfo=$abidir/fwinfo
+
+test -d $tmpdir || mkdir $tmpdir
+
+package_prefixes() {
+ __package_prefixes="$@"
+}
+
+getall() {
+ arch=$1
+ shift
+
+ mkdir -p $abidir/$arch
+
+ for sub in $@; do
+ if [ -f $abidir/$arch/$sub ]; then
+ echo "Exists: $sub"
+ continue
+ fi
+ echo -n "Fetching $sub($arch)..."
+ prefixes=""
+ filenames=""
+ cd $tmpdir
+ for prefix in $__package_prefixes
+ do
+ filename=${prefix}-${verabi}-${sub}_${verfull}_${arch}.deb
+ for r in "${repo_list[@]}"
+ do
+ if ! [ -f $filename ]; then
+ $WGET $r/$filename
+ fi
+ if [ -f $filename ]; then
+ prefixes="$prefixes $prefix"
+ filenames="$filenames $filename"
+ break
+ fi
+ done
+ done
+ if [ "$filenames" != "" ]; then
+ echo -n "extracting$prefixes..."
+ for filename in $filenames
+ do
+ dpkg-deb --extract $filename tmp
+ done
+ find tmp -name "*.ko" | while read f; do
+ modinfo $f | grep ^firmware >> $fwinfo
+ done
+ if [ -f tmp/boot/abi-* ]; then
+ mv tmp/boot/abi-* $abidir/$arch/$sub
+ else
+ echo -n "NO ABI FILE..."
+ fi
+ (cd tmp; find lib/modules/$verabi-$sub/kernel -name '*.ko') | \
+ sed -e 's/.*\/\([^\/]*\)\.ko/\1/' | sort > \
+ $abidir/$arch/$sub.modules
+ (
+ cd tmp;
+ # Prevent exposing some errors when called by python scripts. SIGPIPE seems to get
+ # exposed when using the `find ...` form of the command.
+ ko=$(find lib/modules/$verabi-$sub/kernel \
+ -name '*.ko' | head -1)
+ readelf -p .comment "$ko" | awk '
+ ($1 == "[") {
+ printf("%s", $3);
+ for (n=4; n<=NF; n++) {
+ printf(" %s", $n);
+ }
+ print ""
+ }' | sort -u >$abidir/$arch/$sub.compiler
+ version=`cat $abidir/$arch/$sub.compiler`
+ echo -n "$version..."
+ )
+ rm -rf tmp $filenames
+ echo "done."
+ else
+ echo "FAILED."
+ fi
+ cd $origdir
+ done
+}
+
+# MAIN
+
+# Setup abi directory
+mkdir -p $abidir
+echo $abi > $abidir/abiname
+
+# NOTE: The flavours are hardcoded, because they may have changed from the
+# current build.
+
+__package_prefixes="linux-image"
+
+. $DEBIAN/etc/getabis
+
+compilers=`cat $abidir/*/*.compiler | sort -u | wc -l`
+if [ "$compilers" != 1 ]; then
+ echo "WARNING: inconsistant compiler versions detected" 1>&2
+fi
+
+sort < $fwinfo | uniq > fwinfo.tmp
+mv fwinfo.tmp $fwinfo
+
+rmdir $tmpdir
diff --git a/debian/scripts/misc/git-ubuntu-log b/debian/scripts/misc/git-ubuntu-log
new file mode 100755
index 00000000000..2967d875bd6
--- /dev/null
+++ b/debian/scripts/misc/git-ubuntu-log
@@ -0,0 +1,232 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Text::Wrap;
+
+my $kernel_auth = "Upstream Kernel Changes";
+
+my (%map, @reverts);
+my $pstate = 1;
+my $no_kern_log = 0;
+my $print_shas = 0;
+my $first_print = 1;
+
+while (@ARGV) {
+ my $opt = $ARGV[0];
+ shift;
+ if ($opt eq "--no-kern-log") {
+ $no_kern_log = 1;
+ } elsif ($opt eq "--print-shas") {
+ $print_shas = 1;
+ } else {
+ print STDERR "Unknown options: $opt\n";
+ exit(1);
+ }
+}
+
+sub check_reverts($) {
+ my ($entry) = @_;
+ my ($check);
+
+ foreach $check (reverse @reverts) {
+ my $desc = "Revert \"" . $entry->{'desc'} . "\"";
+ if ($check->{'desc'} eq $desc) {
+ @reverts = grep($_->{'desc'} ne $desc, @reverts);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+sub add_entry($) {
+ my ($entry) = @_;
+ my $key = $entry->{'author'};
+
+ # store description in array, in email->{desc list} map
+ if (exists $map{$key}) {
+ # grab ref
+ my $obj = $map{$key};
+
+ # add desc to array
+ push(@$obj, $entry);
+ } else {
+ # create new array, containing 1 item
+ my @arr = ($entry);
+
+ # store ref to array
+ $map{$key} = \@arr;
+ }
+}
+
+sub shortlog_entry($$$$$) {
+ my ($name, $desc, $bug, $cve, $commit) = @_;
+ my $entry;
+
+ $desc =~ s#/pub/scm/linux/kernel/git/#/.../#g;
+ $desc =~ s#\[PATCH\] ##g;
+
+ $desc =~ s#^\s*##g;
+ $desc =~ s# *UBUNTU: ##g;
+
+ $entry->{'desc'} = $desc;
+ if ($bug ne '') {
+ $entry->{'bugno'} = $bug;
+ }
+ $entry->{'cve'} = $cve;
+ $entry->{'commit'} = $commit;
+ $entry->{'author'} = $name;
+
+ if ($desc =~ /^Revert "/) {
+ push(@reverts, $entry);
+ return;
+ }
+
+ return if check_reverts($entry);
+
+ add_entry($entry);
+}
+
+# sort comparison function
+sub by_name($$) {
+ my ($a, $b) = @_;
+
+ uc($a) cmp uc($b);
+}
+
+sub shortlog_output {
+ my ($obj, $key, $entry);
+
+ foreach $key (sort by_name keys %map) {
+ next if $key eq $kernel_auth and $no_kern_log;
+
+ print "\n" unless $first_print;
+ $first_print = 0;
+
+ # output author
+ printf " [ %s ]\n\n", $key;
+
+ # output author's 1-line summaries
+ $obj = $map{$key};
+ foreach $entry (reverse @$obj) {
+ print wrap(" * ", " ", $entry->{'desc'}) . "\n";
+ # For non upstream changes, add other info.
+ if ($key ne $kernel_auth) {
+ if ($print_shas) {
+ print " - GIT-SHA " . $entry->{'commit'} .
+ "\n";
+ }
+ }
+ if (defined($entry->{'bugno'})) {
+ print " - LP: #" . $entry->{'bugno'} . "\n";
+ }
+ if (defined($entry->{'cve'})) {
+ print " - " . $entry->{'cve'} . "\n";
+ }
+ }
+ }
+}
+
+sub changelog_input {
+ my ($author, $desc, $commit, $entry, $cve);
+
+ while (<STDIN>) {
+ # get commit
+ if ($pstate == 1) {
+ next unless /^commit (.*)/;
+
+ $commit = $1;
+
+ $pstate++;
+ }
+
+ # get author and email
+ elsif ($pstate == 2) {
+ my ($email);
+
+ next unless /^[Aa]uthor:?\s*(.*?)\s*<(.*)>/;
+
+ $author = $1;
+ $email = $2;
+ $desc = undef;
+ $cve = undef;
+
+ # cset author fixups
+ if (!$author) {
+ $author = $email;
+ }
+ $pstate++;
+ }
+
+ # skip to blank line
+ elsif ($pstate == 3) {
+ next unless /^\s*$/;
+ $pstate++;
+ }
+
+ # skip to non-blank line
+ elsif ($pstate == 4) {
+ next unless /^\s*?(.*)/;
+ my $ignore = 0;
+ my $do_ignore = 0;
+ my $bug = undef;
+ my %bugz = ();
+ my $k;
+
+ # skip lines that are obviously not
+ # a 1-line cset description
+ next if /^\s*From: /;
+
+ chomp;
+ $desc = $1;
+
+ if ($desc =~ /^ *(Revert "|)UBUNTU:/) {
+ $do_ignore = 1;
+ } else {
+ $do_ignore = 0;
+ $author = $kernel_auth;
+ $ignore = 1 if $desc =~ /Merge /;
+ }
+ while (<STDIN>) {
+ $ignore = 1 if ($do_ignore && /^ *Ignore: yes/i);
+ if (/^ *Bug: *(#|)([0-9#,\s]*)\s*$/i) {
+ foreach $k (split('(,|\s)\s*(#|)', $2)) {
+ $bugz{$k} = 1 if (($k ne '') and ($k =~ /[0-9]+/));
+ }
+ }
+ elsif (/^ *BugLink: *http.*:\/\/.*\/([0-9]+)/i) {
+ $bugz{$1} = 1;
+ }
+ elsif (/^ *(CVE-.*)/) {
+ $cve = $1
+ }
+ last if /^commit /;
+ }
+
+ $bug = join(", #", sort keys(%bugz));
+ if (!$ignore) {
+ &shortlog_entry($author, $desc, $bug,
+ $cve, $commit, 0);
+ }
+
+ $pstate = 1;
+ if ($_ && /^commit (.*)/) {
+ $commit = $1;
+ $pstate++;
+ }
+ }
+
+ else {
+ die "invalid parse state $pstate";
+ }
+ }
+
+ foreach $entry (@reverts) {
+ add_entry($entry);
+ }
+}
+
+&changelog_input;
+&shortlog_output;
+
+exit(0);
diff --git a/debian/scripts/misc/insert-changes.pl b/debian/scripts/misc/insert-changes.pl
new file mode 100755
index 00000000000..c820597a9fc
--- /dev/null
+++ b/debian/scripts/misc/insert-changes.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl -w
+
+my $debian;
+$droot = $ARGV[0] if (defined $ARGV[0]);
+$droot = 'debian' if (!defined $droot);
+$debian = $ARGV[1] if (defined $ARGV[1]);
+$debian = 'debian.master' if (!defined $debian);
+
+system("make -s -f $droot/rules printchanges > $debian/changes");
+
+open(CHANGELOG, "< $debian/changelog") or die "Cannot open changelog";
+open(CHANGES, "< $debian/changes") or die "Cannot open new changes";
+open(NEW, "> $debian/changelog.new") or die "Cannot open new changelog";
+
+$printed = 0;
+
+while (<CHANGELOG>) {
+ if (/^ CHANGELOG: /) {
+ next if $printed;
+
+ while (<CHANGES>) {
+ print NEW;
+ }
+
+ $printed = 1;
+ } else {
+ print NEW;
+ }
+}
+
+close(NEW);
+close(CHANGES);
+close(CHANGELOG);
+
+rename("$debian/changelog.new", "$debian/changelog");
+unlink("$debian/changes");
diff --git a/debian/scripts/misc/insert-mainline-changes b/debian/scripts/misc/insert-mainline-changes
new file mode 100755
index 00000000000..5678b1031e5
--- /dev/null
+++ b/debian/scripts/misc/insert-mainline-changes
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+
+if ($#ARGV != 2) {
+ warn "Usage: $0 <changelog> <to> <range>\n";
+ die " $0 debian.master/changelog v3.2.3 v3.2.2..v3.2.3\n";
+}
+my ($changelog, $to, $range) = @ARGV;
+
+my @changes = ();
+
+push(@changes, "\n");
+push(@changes, " [ Upstream Kernel Changes ]\n\n");
+push(@changes, " * rebase to $to\n");
+
+open(LOG, "git log '$range'|") || die "$0: git log failed: - $!\n";
+while (<LOG>) {
+ if (m@BugLink: .*launchpad.net/.*/([0-9]+)\s$@) {
+ push(@changes, " - LP: #$1\n");
+ }
+}
+close(LOG);
+
+open(CHANGELOG, "< $changelog") or die "Cannot open changelog";
+open(NEW, "> $changelog.new") or die "Cannot open new changelog";
+
+$printed = 3;
+while (<CHANGELOG>) {
+ if (/^ CHANGELOG: /) {
+ $printed--;
+ print NEW;
+ if ($printed == 0) {
+ print NEW @changes;
+ }
+ next;
+ }
+ print NEW;
+}
+
+close(NEW);
+close(CHANGELOG);
+
+rename("$changelog.new", "$changelog");
diff --git a/debian/scripts/misc/insert-ubuntu-changes b/debian/scripts/misc/insert-ubuntu-changes
new file mode 100755
index 00000000000..9ede7f3950d
--- /dev/null
+++ b/debian/scripts/misc/insert-ubuntu-changes
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+if ($#ARGV != 2) {
+ die "Usage: $0 <changelog> <stop at> <start at>\n";
+}
+my ($changelog, $end, $start) = @ARGV;
+
+$end =~ s/.*\.//;
+$start =~ s/.*\.//;
+
+my @changes = ();
+my $output = 0;
+open(CHG, "<debian.master/changelog") ||
+ open(CHG, "<debian/changelog") ||
+ die "$0: debian/changelog: open failed - $!\n";
+while (<CHG>) {
+ if (/^\S+\s+\((.*\.(\d+))\)/) {
+ if ($2 <= $end) {
+ last;
+ }
+ if ($2 == $start) {
+ $output = 1;
+ }
+ if ($output) {
+ push(@changes, "\n [ Ubuntu: $1 ]\n\n");
+ next;
+ }
+ }
+ next if ($output == 0);
+
+ next if (/^\s*$/);
+ next if (/^\s--/);
+ next if (/^\s\s[^\*\s]/);
+
+ push(@changes, $_);
+}
+close(CHG);
+
+open(CHANGELOG, "< $changelog") or die "Cannot open changelog";
+open(NEW, "> $changelog.new") or die "Cannot open new changelog";
+
+$printed = 3;
+while (<CHANGELOG>) {
+ if (/^ CHANGELOG: /) {
+ $printed--;
+ print NEW;
+ if ($printed == 0) {
+ print NEW @changes;
+ }
+ next;
+ }
+ print NEW;
+}
+
+close(NEW);
+close(CHANGELOG);
+
+rename("$changelog.new", "$changelog");
diff --git a/debian/scripts/misc/kernelconfig b/debian/scripts/misc/kernelconfig
new file mode 100755
index 00000000000..310d1f8951f
--- /dev/null
+++ b/debian/scripts/misc/kernelconfig
@@ -0,0 +1,172 @@
+#!/bin/bash
+
+. debian/debian.env
+
+# Script to merge all configs and run 'make silentoldconfig' on it to wade out bad juju.
+# Then split the configs into distro-commmon and flavour-specific parts
+
+# We have to be in the top level kernel source directory
+if [ ! -f MAINTAINERS ] || [ ! -f Makefile ]; then
+ echo "This does not appear to be the kernel source directory." 1>&2
+ exit 1
+fi
+
+mode=${1:?"Usage: $0 [oldconfig|editconfig]"}
+yes=0
+case "$mode" in
+ update*configs) mode='silentoldconfig' ;;
+ default*configs) mode='oldconfig'; yes=1 ;;
+ edit*configs) ;; # All is good
+ gen*configs) mode='genconfigs' ;; # All is good
+ dump*configs) mode='config'; yes=1 ;;
+ *) echo "$0 called with invalid mode" 1>&2
+ exit 1 ;;
+esac
+kerneldir="`pwd`"
+confdir="$kerneldir/${DEBIAN}/config"
+sharedconfdir="$kerneldir/debian.master/config"
+variant="$2"
+
+. $DEBIAN/etc/kernelconfig
+
+bindir="`pwd`/${DROOT}/scripts/misc"
+common_conf="$confdir/config.common.$family"
+tmpdir=`mktemp -d`
+mkdir "$tmpdir/CONFIGS"
+
+if [ "$mode" = "genconfigs" ]; then
+ keep=1
+ mode="oldconfig"
+ test -d CONFIGS || mkdir CONFIGS
+fi
+
+for arch in $archs; do
+ rm -rf build
+ mkdir build
+
+ # Map debian archs to kernel archs
+ case "$arch" in
+ ppc64) kernarch="powerpc" ;;
+ amd64) kernarch="x86_64" ;;
+ lpia) kernarch="x86" ;;
+ sparc) kernarch="sparc64" ;;
+ armel|armhf) kernarch="arm" ;;
+ *) kernarch="$arch" ;;
+ esac
+
+ archconfdir=$confdir/$arch
+ flavourconfigs=$(cd $archconfdir && ls config.flavour.*)
+
+ # Merge configs
+ # We merge config.common.ubuntu + config.common.<arch> +
+ # config.flavour.<flavour>
+
+ for config in $flavourconfigs; do
+ fullconf="$tmpdir/$arch-$config-full"
+ case $config in
+ *)
+ : >"$fullconf"
+ if [ -f $common_conf ]; then
+ cat $common_conf >> "$fullconf"
+ fi
+ if [ -f $archconfdir/config.common.$arch ]; then
+ cat $archconfdir/config.common.$arch >> "$fullconf"
+ fi
+ cat "$archconfdir/$config" >>"$fullconf"
+ if [ -f $confdir/OVERRIDES ]; then
+ cat $confdir/OVERRIDES >> "$fullconf"
+ fi
+ ;;
+ esac
+ done
+
+ for config in $flavourconfigs; do
+ if [ -f $archconfdir/$config ]; then
+ fullconf="$tmpdir/$arch-$config-full"
+ cat "$fullconf" > build/.config
+ # Call oldconfig or menuconfig
+ case "$mode" in
+ editconfigs)
+ # Interactively edit config parameters
+ while : ; do
+ echo -n "Do you want to edit config: $arch/$config? [Y/n] "
+ read choice
+
+ case "$choice" in
+ y* | Y* | "" )
+ make O=`pwd`/build ARCH=$kernarch menuconfig
+ break ;;
+ n* | N* )
+ break ;;
+ *)
+ echo "Entry not valid"
+ esac
+ done
+ ;;
+ *)
+ echo "* Run $mode (yes=$yes) on $arch/$config ..."
+ if [ "$yes" -eq 1 ]; then
+ yes "" | make O=`pwd`/build ARCH=$kernarch "$mode"
+ else
+ make O=`pwd`/build ARCH=$kernarch "$mode"
+ fi ;;
+ esac
+ cat build/.config > $archconfdir/$config
+ cat build/.config > "$tmpdir/CONFIGS/$arch-$config"
+ if [ "$keep" = "1" ]; then
+ cat build/.config > CONFIGS/$arch-$config
+ fi
+ else
+ echo "!! Config not found $archconfdir/$config..."
+ fi
+ done
+
+ echo "Running splitconfig.pl for $arch"
+ echo
+
+ # Can we make this more robust by avoiding $tmpdir completely?
+ # This approach was used for now because I didn't want to change
+ # splitconfig.pl
+ (cd $archconfdir; $bindir/splitconfig.pl config.flavour.*; mv config.common \
+ config.common.$arch; cp config.common.$arch $tmpdir)
+done
+
+rm -f $common_conf
+
+# Now run splitconfig.pl on all the config.common.<arch> copied to
+# $tmpdir
+(cd $tmpdir; $bindir/splitconfig.pl *)
+(
+ cd $confdir;
+ rm -f *-full
+ grep -v 'is UNMERGABLE' <$tmpdir/config.common >$common_conf
+ for arch in $archs; do
+ grep -v 'is UNMERGABLE' <$tmpdir/config.common.$arch \
+ >$arch/config.common.$arch
+ done
+)
+
+echo ""
+echo "Running config-check for all configurations ..."
+echo ""
+fail=0
+for arch in $archs; do
+ archconfdir=$confdir/$arch
+ flavourconfigs=$(cd $archconfdir && ls config.flavour.*)
+ for config in $flavourconfigs; do
+ flavour="${config##*.}"
+ if [ -f $archconfdir/$config ]; then
+ fullconf="$tmpdir/CONFIGS/$arch-$config"
+ "$bindir/../config-check" "$fullconf" "$arch" "$flavour" "$sharedconfdir" "0" || let "fail=$fail+1"
+ fi
+ done
+done
+
+if [ "$fail" != 0 ]; then
+ echo ""
+ echo "*** ERROR: $fail config-check failures detected"
+ echo ""
+fi
+
+rm -rf build
+
diff --git a/debian/scripts/misc/retag b/debian/scripts/misc/retag
new file mode 100755
index 00000000000..94cf169a076
--- /dev/null
+++ b/debian/scripts/misc/retag
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+
+open(TAGS, "git tag -l |") or die "Could not get list of tags";
+@tags = <TAGS>;
+close(TAGS);
+
+open(LOGS, "git log --pretty=short |") or die "ERROR: Calling git log";
+my $commit = "";
+
+while (<LOGS>) {
+ my $origtag;
+
+ if (m|^commit (.*)$|) {
+ $commit = $1;
+ next;
+ }
+
+ m|\s*UBUNTU: (Ubuntu-2\.6\..*)| or next;
+
+ $tag = $1;
+
+ ($origtag) = grep(/^$tag.orig$/, @tags);
+
+ if (!defined($origtag)) {
+ print "I: Adding original tag for $tag\n";
+ system("git tag -m $tag $tag.orig $tag");
+ }
+
+ print "I: Tagging $tag => $commit\n";
+
+ system("git tag -f -m $tag $tag $commit");
+}
+
+close(LOGS);
diff --git a/debian/scripts/misc/splitconfig.pl b/debian/scripts/misc/splitconfig.pl
new file mode 100755
index 00000000000..3270edeb4e0
--- /dev/null
+++ b/debian/scripts/misc/splitconfig.pl
@@ -0,0 +1,107 @@
+#!/usr/bin/perl -w
+
+%allconfigs = ();
+%common = ();
+
+print "Reading config's ...\n";
+
+for $config (@ARGV) {
+ # Only config.*
+ next if $config !~ /^config\..*/;
+ # Nothing that is disabled, or remnant
+ next if $config =~ /.*\.(default|disabled|stub)$/;
+
+ %{$allconfigs{$config}} = ();
+
+ print " processing $config ... ";
+
+ open(CONFIG, "< $config");
+
+ while (<CONFIG>) {
+ # Skip comments
+ /^#*\s*CONFIG_(\w+)[\s=](.*)$/ or next;
+
+ ${$allconfigs{$config}}{$1} = $2;
+
+ $common{$1} = $2;
+ }
+
+ close(CONFIG);
+
+ print "done.\n";
+}
+
+print "\n";
+
+print "Merging lists ... \n";
+
+# %options - pointer to flavour config inside the allconfigs array
+for $config (keys(%allconfigs)) {
+ my %options = %{$allconfigs{$config}};
+
+ print " processing $config ... ";
+
+ for $key (keys(%common)) {
+ next if not defined $common{$key};
+
+ # If we don't have the common option, then it isn't
+ # common. If we do have that option, it must have the same
+ # value. EXCEPT where this file does not have a value at all
+ # which may safely be merged with any other value; the value
+ # will be elided during recombination of the parts.
+ if (!defined($options{$key})) {
+ # Its ok really ... let it merge
+ } elsif (not defined($options{$key})) {
+ undef $common{$key};
+ } elsif ($common{$key} ne $options{$key}) {
+ undef $common{$key};
+ }
+ }
+
+ print "done.\n";
+}
+
+print "\n";
+
+print "Creating common config ... ";
+
+open(COMMON, "> config.common");
+print COMMON "#\n# Common config options automatically generated by splitconfig.pl\n#\n";
+
+for $key (sort(keys(%common))) {
+ if (not defined $common{$key}) {
+ print COMMON "# CONFIG_$key is UNMERGABLE\n";
+ } elsif ($common{$key} eq "is not set") {
+ print COMMON "# CONFIG_$key is not set\n";
+ } else {
+ print COMMON "CONFIG_$key=$common{$key}\n";
+ }
+}
+close(COMMON);
+
+print "done.\n\n";
+
+print "Creating stub configs ...\n";
+
+for $config (keys(%allconfigs)) {
+ my %options = %{$allconfigs{$config}};
+
+ print " processing $config ... ";
+
+ open(STUB, "> $config");
+ print STUB "#\n# Config options for $config automatically generated by splitconfig.pl\n#\n";
+
+ for $key (sort(keys(%options))) {
+ next if defined $common{$key};
+
+ if ($options{$key} =~ /^is /) {
+ print STUB "# CONFIG_$key $options{$key}\n";
+ } else {
+ print STUB "CONFIG_$key=$options{$key}\n";
+ }
+ }
+
+ close(STUB);
+
+ print "done.\n";
+}
diff --git a/debian/scripts/module-check b/debian/scripts/module-check
new file mode 100755
index 00000000000..c754ea368cf
--- /dev/null
+++ b/debian/scripts/module-check
@@ -0,0 +1,120 @@
+#!/usr/bin/perl -w
+
+$flavour = shift;
+$prev_abidir = shift;
+$abidir = shift;
+$skipmodule = shift;
+
+print "II: Checking modules for $flavour...";
+
+if (-f "$prev_abidir/ignore.modules"
+ or -f "$prev_abidir/$flavour.ignore.modules") {
+ print "explicitly ignoring modules\n";
+ exit(0);
+}
+
+if (not -f "$abidir/$flavour.modules" or not -f
+ "$prev_abidir/$flavour.modules") {
+ print "previous or current modules file missing!\n";
+ print " $abidir/$flavour.modules\n";
+ print " $prev_abidir/$flavour.modules\n";
+ if (defined($skipmodule)) {
+ exit(0);
+ } else {
+ exit(1);
+ }
+}
+
+print "\n";
+
+my %modules;
+my %modules_ignore;
+my $missing = 0;
+my $new = 0;
+my $errors = 0;
+
+# See if we have any ignores
+if (-f "$prev_abidir/../modules.ignore") {
+ my $ignore = 0;
+ open(IGNORE, "< $prev_abidir/../modules.ignore") or
+ die "Could not open $prev_abidir/../modules.ignore";
+ print " reading modules to ignore...";
+ while (<IGNORE>) {
+ chomp;
+ next if /\s*#/;
+ $modules_ignore{$_} = 1;
+ $ignore++;
+ }
+ close(IGNORE);
+ print "read $ignore modules.\n";
+}
+
+# Read new modules first
+print " reading new modules...";
+$new_count = 0;
+open(NEW, "< $abidir/$flavour.modules") or
+ die "Could not open $abidir/$flavour.modules";
+while (<NEW>) {
+ chomp;
+ $modules{$_} = 1;
+ $new_count++;
+}
+close(NEW);
+print "read $new_count modules.\n";
+
+# Now the old modules, checking for missing ones
+print " reading old modules...";
+$old_count = 0;
+open(OLD, "< $prev_abidir/$flavour.modules") or
+ die "Could not open $prev_abidir/$flavour.modules";
+while (<OLD>) {
+ chomp;
+ if (not defined($modules{$_})) {
+ print "\n" if not $missing;
+ $missing++;
+ if (not defined($modules_ignore{$_})) {
+ print " MISS: $_\n";
+ $errors++;
+ } else {
+ print " MISS: $_ (ignored)\n";
+ }
+ } else {
+ $modules{$_}++;
+ }
+ $old_count++;
+}
+close(OLD);
+# Check for new modules
+foreach $mod (keys(%modules)) {
+ if ($modules{$mod} < 2) {
+ print "\n" if not $missing and not $new;
+ print " NEW : $mod\n";
+ $new++;
+ }
+}
+if ($new or $missing) {
+ print " read $old_count modules : new($new) missing($missing)\n";
+} else {
+ print "read $old_count modules.\n";
+}
+
+
+# Let's see where we stand...
+if ($errors) {
+ if (defined($skipmodule)) {
+ print "WW: Explicitly asked to ignore failures (probably not good)\n";
+ } else {
+ print "EE: Missing modules (start begging for mercy)\n";
+ exit 1
+ }
+}
+
+if ($new) {
+ print "II: New modules (you've been busy, wipe the poop off your nose)\n";
+} else {
+ print "II: No new modules (hope you're happy, slacker)\n";
+}
+
+print "II: Done\n";
+
+exit(0);
diff --git a/debian/scripts/module-inclusion b/debian/scripts/module-inclusion
new file mode 100755
index 00000000000..deb07a8133a
--- /dev/null
+++ b/debian/scripts/module-inclusion
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+#
+# Build a new directory of modules based on an inclusion list.
+# The includsion list format must be a bash regular expression.
+#
+# usage: $0 ROOT INCLUSION_LIST
+# example: $0 debian/build/build-virtual \
+# debian/build/build-virtual-ALL debian/build/build-virtual \
+# debian.master/control.d/virtual.inclusion-list
+master=0
+if [ "$1" = "--master" ]; then
+ master=1
+ shift
+fi
+
+ROOT=$1
+NROOT=$2
+ILIST=$3
+
+#
+# Prep a destination directory.
+#
+mkdir -p ${NROOT}
+
+# Copy over the framework...
+if [ "$master" -eq 1 ]; then
+ (cd ${ROOT}; find . ! -name "*.ko" -type f) | \
+ while read f
+ do
+ mkdir -p ${NROOT}/`dirname $f`
+ mv ${ROOT}/$f ${NROOT}/$f
+ done
+fi
+
+cat ${ILIST} |while read i
+do
+ #
+ # 'find' blurts a warning if it cannot find any ko files.
+ #
+ if echo "$i" | grep '\*' > /dev/null
+ then
+ (cd ${ROOT}; eval find "${i}" -name "*.ko") |while read f
+ do
+ mkdir -p ${NROOT}/`dirname $f`
+ mv ${ROOT}/$f ${NROOT}/$f
+ done
+ else
+ if [ -f "${ROOT}/$i" ]
+ then
+ mkdir -p ${NROOT}/`dirname $i`
+ mv ${ROOT}/$i ${NROOT}/$i
+ else
+ echo Warning: Could not find ${ROOT}/$i
+ fi
+ fi
+
+done
+
+exit 0
diff --git a/debian/scripts/sub-flavour b/debian/scripts/sub-flavour
new file mode 100644
index 00000000000..01004939617
--- /dev/null
+++ b/debian/scripts/sub-flavour
@@ -0,0 +1,69 @@
+#!/bin/bash
+
+. debian/debian.env
+
+echo "SUB_PROCESS $FROM => $TO"
+
+export from_pkg="linux-image-$ABI_RELEASE-$FROM"
+export to_pkg="linux-image-$ABI_RELEASE-$TO"
+
+from_moddir="debian/$from_pkg/lib/modules/$ABI_RELEASE-$FROM"
+to_moddir="debian/$to_pkg/lib/modules/$ABI_RELEASE-$FROM"
+
+install -d "debian/$to_pkg/boot"
+install -m644 debian/$from_pkg/boot/config-$ABI_RELEASE-$FROM \
+ debian/$to_pkg/boot/
+install -m600 debian/$from_pkg/boot/{vmlinuz,System.map}-$ABI_RELEASE-$FROM \
+ debian/$to_pkg/boot/
+
+#
+# Print some warnings if there are files in the sub-flavours list
+# that do not actually exist.
+#
+cat ${DEBIAN}/sub-flavours/$TO.list | while read line
+do
+(
+ cd debian/$from_pkg/lib/modules/$ABI_RELEASE-$FROM/kernel;
+ #
+ # If its a wildcard, then check that there are files that match.
+ #
+ if echo "$line" | grep '\*' > /dev/null
+ then
+ if [ `eval find "$line" -name '*.ko' 2>/dev/null|wc -l` -lt 1 ]
+ then
+ echo SUB_INST Warning - No files in $line
+ fi
+ #
+ # Else it should be a single file reference.
+ #
+ elif [ ! -f "$line" ]
+ then
+ echo SUB_INST Warning - could not find "$line"
+ fi
+)
+done
+
+cat ${DEBIAN}/sub-flavours/$TO.list | while read line; do
+ (
+ cd debian/$from_pkg/lib/modules/$ABI_RELEASE-$FROM/kernel;
+ if echo "$line" | grep '\*' > /dev/null
+ then
+ eval find "$line" -name '*.ko' 2>/dev/null || true
+ elif [ -f "$line" ]
+ then
+ echo "$line"
+ fi
+ );
+done | while read mod; do
+ echo "SUB_INST checking: $mod"
+ fromdir="/lib/modules/$ABI_RELEASE-$FROM/"
+ egrep "^($fromdir)?kernel/$mod:" \
+ $from_moddir/modules.dep | sed -e "s|^$fromdir||" -e 's/://' -e 's/ /\n/g' | \
+ while read m; do
+ m="${fromdir}$m"
+ test -f debian/$to_pkg/$m && continue
+ echo "SUB_INST installing: $m"
+ install -D -m644 debian/$from_pkg/$m \
+ debian/$to_pkg/$m
+ done
+done