Ich bräuchte mal Unterstützung dabei, wie ich eine bestimmte GCC Version nutzen kann die ich brauche, um einen Canadian Cross zu generieren, also einen Compiler mit Build ≠ Host ≠ Target ≠ Build.
Den benötigten Build → Target Compiler kann ich selbst generieren. Was mir zur Erzeugung des Host → Target Compilers fehlt ist der Build → Host Compiler, nämlich https://packages.msys2.org/packages/mingw-w64-i686-gcc
Für den benötigten Cross Compiler gibt es also Packages zur Installation, allerdings kann ich auf Build keine Software installieren, und die Admins sind beschränkt auf Debian, für welches es kein mingw-w64-i686-gcc Paket gibt.
Soweit ich das verstehe, wäre Docker eine Möglichkeit. Allerdings habe ich noch nie was mit Docker gemacht, und beim Lesen der Tutorials dreh ich mich im Kreis und komme vom Hölzchen aufs Stöckchen.
Vielleicht findet sich ja hier im Forum jemand, der den Nerv hat, nem Docker Dummy den Weg zu weisen...
Das scheinen zumindest die benötigten Compiler zu sein; ich geh mal davon aus, dass auch die benötigten Binutils dabei sind? Was aber auf jeden Fall auch gebraucht wird ist die Windows Laufzeitumgebung mit kernel32.dll etc, weil man ohne die kein lauffähiges Programm hinbekommt.
Und wenn ich nach i686-mingw oder i386-mingw suche wird auf der Seite nix gefunden...
Den benötigten Build → Target Compiler kann ich selbst generieren.
Nein, mit MinGW hat das nix zu tun. Der Build → Target Compiler wird gebraucht, um Target-Bibliotheken des zu bauenden Canadian Cross zu übersetzen (libgcc, libc, libm, ...). Die Target-Libs können ja nicht mit dem Canadian Cross selbst erzeugt werden, weil der ja auf i686-mingw läuft.
Das scheinen zumindest die benötigten Compiler zu sein; ich geh mal
davon aus, dass auch die benötigten Binutils dabei sind? Was aber auf
jeden Fall auch gebraucht wird ist die Windows Laufzeitumgebung mit
kernel32.dll etc, weil man ohne die kein lauffähiges Programm
hinbekommt.
Die kernel32.dll brauchst Du nicht zum erstellen von windows binaries. Das brauchst Du erst wenn Du sie lauffen lassen willst. Das entweder auf einer windows kiste oder in wine.
Binutils und 'development files' sind im debian repo in entsprechenden Paketen auch dabei:
1
aptitude search binutils-mingw
2
p binutils-mingw-w64 - Cross-binutils for Win32 and Win64 using MinGW-w64
3
p binutils-mingw-w64-i686 - Cross-binutils for Win32 (x86) using MinGW-w64
4
p binutils-mingw-w64-i686:i386 - Cross-binutils for Win32 (x86) using MinGW-w64
5
p binutils-mingw-w64-x86-64 - Cross-binutils for Win64 (x64) using MinGW-w64
6
p binutils-mingw-w64-x86-64:i386 - Cross-binutils for Win64 (x64) using MinGW-w64
Das hier sollte alles liefern um unter Linux fremde Windows binaries zu erzeugen. Es zieht die binutils, und vieles mehr, als dependency schon an.
Das geht alles noch viel kuerzer, ich mag aber im Docker meinen eigenen usernamen haben. Falls im docker entweder root oder ein spezieller dockeuser kann all das groupadd und useradd ins Dockerfile verschoben werden.
Bauen und starten. Im gleichen Verzeichnis in dem das Dockerfile liegt:
Zum erstellen diverser GCC Compiler verwenden wir hier https://github.com/crosstool-ng/crosstool-ng/. Das erleichtert die Sache ungemein und funktioniert auch ohne Docker inkl. Canadian-Cross.
Ich verstehe sowieso nicht ganz, was das soll hier. Soll das eine theoretische Arbeit werden?
Beispielsweise: Plattformen A B und C und C wäre dann Docker oder eine VM?? Oder B?? Oder doch eher A??
-> Vorschlag: zuerstmal etwas mehr Plan in das Vorhaben hineinbringen, das kann man den zum ersten viel besser kommunizieren, und zweitens, lohnt es sich auch erst dann, nach weiteren Informationen im Netz zu suchen, wenn eben klarer ist, wo man überhaupt hin will.
Ich versuche mal einen Ansatz:
Also die Entwicklungsumgebung ist beschränkt, welche Möglichkeiten hast du trotzdem, Crosscompiling zu machen?
Kannst du die Admins diesbezüglich ausfragen, oder ist das nicht erwünscht?
Das scheinen zumindest die benötigten Compiler zu sein; ich geh mal
davon aus, dass auch die benötigten Binutils dabei sind? Was aber auf
jeden Fall auch gebraucht wird ist die Windows Laufzeitumgebung mit
kernel32.dll etc, weil man ohne die kein lauffähiges Programm
hinbekommt.
Die kernel32.dll brauchst Du nicht zum erstellen von windows binaries.
Also wenn ich eine main.c mit i686-w64-mingw32-gcc übersetze:
Sieht für mich so aus also würde gegen die Host-Libs gelinkt.
docker run -it -e LOCAL_UID=$(id -u) -e LOCAL_GID=$(id -g) -e
Kann man auch ein Executable erstellen anstatt docker aufzurufen? Weil Docker ist nicht installiert auf dem Build-Rechner, und ich kann da keine Software installieren: Katze beißt sich in den Schwanz...
Und in diesen pfaden sind entsprechende windows libraries. Das sollte normalerweise unter Windows mit einem installierten mingw auch vorhanden sein.
Ich habe gerade ein keines *.c compiliert, welches nur per printf ein float ausgibt, und wenn ich es mit wine lauffen lasse scheint es zu funktionieren:
1
wine ./a.exe
2
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
3
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
4
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
5
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
6
'024.33'
Ich habe jetzt hier kein windows um es gegen zu checken, aber ich wuerde davon ausgehen, dass es tut was es soll.
docker run -it -e LOCAL_UID=$(id -u) -e LOCAL_GID=$(id -g) -e
Kann man auch ein Executable erstellen anstatt docker aufzurufen? Weil
Docker ist nicht installiert auf dem Build-Rechner, und ich kann da
keine Software installieren: Katze beißt sich in den Schwanz...
Auf die Gefahr hin, dass es jetzt ausartet, weil ich eigentlich immer noch keine Ahnung habe was Du wirklich machen willst, und Angenommen Dein Build-Recher ist ein deb-basierte Linux-Kiste:
Hast Du auf dem Build-Rechner etwas Platz in deinem Home? Falls ja dann kannst Du auf einem anderen deb basierten Linux Rechner, auf dem Du SW nachinstallieren kannst:
Das erzeugt eine Liste aller Pakete die notwendig sind um den mingw-gcc lauffen zu lassen. Diese Pakete kannst Du herunterladen apt install --download-only (die landen dann irgendwo in /var/cache/apt) und diese auf den Buld-Recher verschieben.
Auf dem Zielrechner kannst Du sie mit dpkg -X packetName.deb $HOME/mingwOderSo entpacken.
Damit sollte ein mingw-gcc lokal in Deinem Home existieren. Evtl. musst Du noch mit LD_LIBRARY_PATH oder LD_PRELOAD herumspielen, damit alle libs gefunden werden. Der compiler wird auch seine system-includes/libs nicht finden, dh. mehrere -I und -L werden notwendig sein. Ich hoffe das Funktioniert, ich habe es nicht ausprobiert ;-)
Ansonsten, um einfach einen, zum Beispiel, avr-gcc fuer windows zu bauen, wuerde ich auch keinen Docker verwenden. So wie ich es allerdings verstehe, hast Du eine dedizierte Build-Kiste, oder sogar mehrere davon. In dem Fall wuerde ich mal mit dem Admin reden, das er Dir Docker installiert. IMHO, hat es den Vorteil, dass Du images auf der 'build-farm' verteilen kannst und die SW bauen wie Du willst.