Vorige: Cross-Kompilieren, Nach oben: Fremde Architekturen [Inhalt][Index]
Die Befehle, die es erlauben, mit einem gewählten System Erstellungen durchzuführen, haben die Befehlszeilenoptionen --list-systems und --system.
Die Befehlszeilenoption --list-systems listet alle unterstützten Systeme auf, mit denen erstellt werden kann, wenn man sie als Argument für --system angibt.
$ guix build --list-systems Die verfügbaren Systeme sind: - x86_64-linux [current] - aarch64-linux - armhf-linux - i586-gnu - i686-linux - mips64el-linux - powerpc-linux - powerpc64le-linux - riscv64-linux $ guix build --system=i686-linux hello /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12 $ file /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello: ELF 32-bit LSB executable, Intel 80386 …
Im obigen Beispiel ist das aktuelle System x86_64-linux. Wir erstellen das hello-Paket aber für das System i686-linux.
Das geht, weil der i686-Befehlssatz der CPU eine Teilmenge des x86_64-Befehlssatzes ist, also Binärdateien für i686 auf einem x86_64-System laufen können.
Wenn wir aber im Rahmen desselben Beispiels das System aarch64-linux
wählen und guix build --system=aarch64-linux hello
auch wirklich
Ableitungen erstellen muss, klappt das vielleicht erst nach einem weiteren
Schritt.
Denn Binärdateien mit dem Zielsystem aarch64-linux können auf einem x86_64-linux-System erst mal nicht ausgeführt werden. Deshalb wird nach einer Emulationsschicht gesucht. Der GNU-Guix-Daemon kann den binfmt_misc-Mechanismus des Linux-Kernels dafür einsetzen. Zusammengefasst würde der Linux-Kernel die Ausführung einer Binärdatei für eine fremde Plattform wie aarch64-linux auslagern auf ein Programm der Anwendungsebene („User Space“); normalerweise lagert man so auf einen Emulator aus.
Es gibt einen Dienst, der QEMU als Hintergrundprogramm für den
binfmt_misc
-Mechanismus registriert (siehe qemu-binfmt-service-type
). Auf Debian-basierten
Fremddistributionen ist deren Alternative das Paket qemu-user-static
.
Wenn der binfmt_misc
-Mechanismus falsch eingerichtet ist, schlägt die
Erstellung folgendermaßen fehl:
$ guix build --system=armhf-linux hello --check … unsupported-platform /gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv aarch64-linux while setting up the build environment: a `aarch64-linux' is required to build `/gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv', but I am a `x86_64-linux'…
Aber wenn der binfmt_misc
-Mechanismus richtig mit QEMU verbunden
wurde, kann man diese Meldung erwarten:
$ guix build --system=armhf-linux hello --check /gnu/store/13xz4nghg39wpymivlwghy08yzj97hlj-hello-2.12
Der größte Vorteil, den man davon hat, nativ zu erstellen statt zu cross-kompilieren, ist, dass die Erstellung bei mehr Paketen klappt. Doch es hat seinen Preis: Mit QEMU als Hintergrundprogramm zu kompilieren ist viel langsamer als Cross-Kompilierung, weil jede Anweisung emuliert werden muss.
Die Verfügbarkeit von Substituten für die Architektur, die man bei
--system
angibt, lindert dieses Problem. Eine andere Möglichkeit ist,
GNU Guix auf einer Maschine zu installieren, deren CPU den Befehlssatz
tatsächlich unterstützt, für den man erstellen möchte. Diese Maschine kann
man über den Mechanismus zum Auslagern von Erstellungen einbeziehen (siehe
Nutzung der Auslagerungsfunktionalität).
Vorige: Cross-Kompilieren, Nach oben: Fremde Architekturen [Inhalt][Index]