Notizen: Cross-Compilieren unter Debian und Ubuntu

Seitdem Debian und Ubuntu verschiedene Architekturen unterstützen ist es eigentlich relativ einfach, Windows-Software zu unterstützen. Eigentlich… Aber dazu später mehr.

Entwickler-Werkzeuge

Zunächst brauchen wir die Entwickler-Werkzeuge. Da können wir uns aussuchen, ob wir mingw32 oder mingw-w64 verwenden wollen. Hier werden wir mingw-w64 betrachten, damit können wir sowohl für 32-Bit-Windows, als auch für 64-Bit-Windows compilieren. Außerdem verwenden wir xapt, um die Pakete danach zu bauen.

Die Installation erfolgt mittels:
apt-get install mingw-w64 xapt

Für einige andere Architekturen müssen die Werzeuge erst noch gebaut werden, dafür gibt es das Paket buildcross

Host-Triplet

Leider ist noch nicht definiert, wie Windows-Architekturen für Debianpakete benannt werden. Details dazu werden im Wunschzettel für dpkg (engl.) diskutiert. Der Link führt zu einem Patch, der noch eingepflegt werden muss. Die entsprechenden Dateien werden allerdings nicht übersetzt, so dass sie auch nach der Installation geändert werden können. Betroffen sind

/usr/share/dpkg/ostable
/usr/share/dpkg/triplettable
/usr/share/perl5/Dpkg/Vendor/Debian.pm

Dabei fügen wir in /usr/share/dpkg/ostable die folgende Zeile ein:
mingw64-windows w64-mingw32 w64-mingw32[^-]*

In /usr/share/dpkg/triplettable:
mingw64-windows-<cpu> mingw64-<cpu>

Und in /usr/share/perl5/Dpkg/Vendor/Debian.pm ersetzen wir die Zeilen mit dem „-“ am Anfang durch die mit einem „+“ am Anfang:
diff --git a/scripts/Dpkg/Vendor/Debian.pm b/scripts/Dpkg/Vendor/Debian.pm
index 72d9ef0..df2d24f 100644
--- a/scripts/Dpkg/Vendor/Debian.pm
+++ b/scripts/Dpkg/Vendor/Debian.pm
@@ -127,15 +127,17 @@ sub add_hardening_flags {
# (#574716).
$use_feature{"pie"} = 0;
}
- if ($cpu =~ /^(ia64|alpha|mips|mipsel|hppa)$/ or $arch eq "arm") {
+ if ($cpu =~ /^(ia64|alpha|mips|mipsel|hppa)$/ or $arch eq "arm" or $os eq "windows") {
# Stack protector disabled on ia64, alpha, mips, mipsel, hppa.
# "warning: -fstack-protector not supported for this target"
# Stack protector disabled on arm (ok on armel).
# compiler supports it incorrectly (leads to SEGV)
+ # Stack protector disabled on Windows (requires glibc).
$use_feature{"stackprotector"} = 0;
}
- if ($cpu =~ /^(ia64|hppa|avr32)$/) {
+ if ($cpu =~ /^(ia64|hppa|avr32)$/ or $os eq "windows") {
# relro not implemented on ia64, hppa, avr32.
+ # relro not implemented on Windows.
$use_feature{"relro"} = 0;
}

Dabei gibt die Zeile mit „@@“ die ungafähre Position (Zeile/Spalte) in der ungeänderten („-“) und der geänderten Datei („+“) an.

Als nächstes müssen wir noch dpkg die Architektur bekannt machen:
dpkg --add-architecture mingw64-amd64
dpkg --add-architecture mingw64-i386

Erzeugen der benötigten Bibliotheken-Pakete

Ein paar generelle Hinweise zum Konvertieren der Pakete finden sich im Debian-Wiki im Abschnitt „Recipes for converting packages“.

Weitere Infos gibts erstmal hier
Eine andere ressource: MingW-Pakete für Ubuntu
wiki.debian.org/CrossBuildPackagingGuidelines and das gleiche für Ubuntu