summaryrefslogtreecommitdiffstats
path: root/bin/sbuild-cross-resolver
diff options
context:
space:
mode:
Diffstat (limited to 'bin/sbuild-cross-resolver')
-rwxr-xr-xbin/sbuild-cross-resolver77
1 files changed, 77 insertions, 0 deletions
diff --git a/bin/sbuild-cross-resolver b/bin/sbuild-cross-resolver
new file mode 100755
index 0000000..110fd53
--- /dev/null
+++ b/bin/sbuild-cross-resolver
@@ -0,0 +1,77 @@
+#!/usr/bin/perl
+#
+# This script is in the public domain
+#
+# Author: Johannes Schauer Marin Rodrigues <josch@mister-muffin.de>
+#
+# Thin layer around /usr/lib/apt/solvers/apt which removes M-A:foreign and
+# Essential:yes packages that are not arch:all and not arch:native from the
+# EDSP before handing it to the apt solver. This is useful for resolving cross
+# build dependencies as it makes sure that M-A:foreign packages and
+# Essential:yes packages in the solution must come from the build architecture.
+
+use strict;
+use warnings;
+
+if (! -e '/usr/lib/apt/solvers/apt') {
+ printf STDOUT 'Error: ERR_NO_SOLVER\n';
+ printf STDOUT 'Message: The external apt solver doesn\'t exist. You must install the apt-utils package.\n';
+ exit 1;
+}
+
+my $buffer = '';
+my $architecture = undef;
+my $essential = 0;
+my $multiarch = 'no';
+my $build_arch;
+sub keep {
+ if ( $multiarch ne 'foreign' and !$essential ) {
+ return 1;
+ }
+ if ( !defined $architecture ) {
+ print STDOUT 'Error: ERR_NO_ARCH\n';
+ print STDOUT 'Message: package without architecture\n';
+ exit 1;
+ }
+ if ( $architecture eq 'all' or $architecture eq $build_arch ) {
+ return 1;
+ }
+ return 0;
+}
+open my $fh, '|-', '/usr/lib/apt/solvers/apt';
+my $first_stanza = 1;
+while ( my $line = <STDIN> ) {
+ $buffer .= $line;
+ if ( $line eq "\n" ) {
+ if ($first_stanza) {
+ if (! defined $architecture) {
+ print STDOUT 'ERROR: ERR_NO_ARCH';
+ print STDOUT 'Message: no Architecture field in first stanza';
+ exit 1;
+ }
+ $build_arch = $architecture;
+ $first_stanza = 0;
+ }
+ if (keep) {
+ print $fh $buffer;
+ }
+ $buffer = '';
+ $architecture = undef;
+ $essential = 0;
+ $multiarch = 'no';
+ next;
+ }
+ if ( $line =~ /^Essential: yes\n$/ ) {
+ $essential = 1;
+ }
+ if ( $line =~ /^Multi-Arch: (.*)\n$/ ) {
+ $multiarch = $1;
+ }
+ if ( $line =~ /^Architecture: (.*)\n$/ ) {
+ $architecture = $1;
+ }
+}
+if (keep) {
+ print $fh $buffer;
+}
+close $fh;