Wie bestimmte GCC Version nutzen? Docker?

OP Persönliche Seite #7897843
Lesenswert?

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...

Build-Rechner: Debian 6.12.32-1 (2025-06-07) x86_64 GNU/Linux amd64

Mein lokaler Rechner ist ein x86_64 GNU/Linux mit Docker v27.5.1.

Mein Ziel ist es, auf Build (effektiv) Kommandos wie mingw-w64-i686-g++, mingw-w64-i686-ld etc. ausführen zu können.

#7897869
Lesenswert?

Hallo Johann,

mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite

https://packages.debian.org/search?keywords=mingw-w64

https://packages.debian.org/sid/mingw-w64 This metapackage provides the MinGW-w64 development environment, including C and C++ compilers.

https://packages.debian.org/sid/gcc-mingw-w64 This metapackage provides the C compiler, supporting cross-compiling to 32- and 64-bit MinGW-w64 targets.

oder hilft das nur hier für

Johann L. schrieb:

Den benötigten Build → Target Compiler kann ich selbst generieren.

OP Persönliche Seite #7897908
Lesenswert?

Alexander S. schrieb:

mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite

https://packages.debian.org/search?keywords=mingw-w64

https://packages.debian.org/sid/mingw-w64 This metapackage provides the MinGW-w64 development environment, including C and C++ compilers.

https://packages.debian.org/sid/gcc-mingw-w64 This metapackage provides the C compiler, supporting cross-compiling to 32- and 64-bit MinGW-w64 targets.

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...

oder hilft das nur hier für

Johann L. schrieb:

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.

#7897967
Lesenswert?

Johann L. schrieb:

Alexander S. schrieb:

mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite

https://packages.debian.org/search?keywords=mingw-w64

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.

1
aptitude install mingw-w64-common mingw-w64-tools gcc-mingw-w64

Und wenn ich nach i686-mingw oder i386-mingw suche wird auf der Seite nix gefunden...

Das waer mingw.*i686 oder so:

1
aptitude search mingw.*i686|grep "win32.*i386"
2
p  g++-mingw-w64-i686-win32:i386 - GNU C++ compiler for MinGW-w64, Win32/Win32
3
p  gcc-mingw-w64-i686-win32:i386 - GNU C compiler for MinGW-w64, Win32/Win32
4
p  gcc-mingw-w64-i686-win32-runtime:i386 - GNU Compiler Collection for MinGW-w64, i686/Win32
5
p  gfortran-mingw-w64-i686-win32:i386 - GNU Fortran compiler for MinGW-w64, Win32/Win32
6
p  gnat-mingw-w64-i686-win32:i386 - GNU Ada compiler for MinGW-w64, Win32/Win32
7
p  gobjc++-mingw-w64-i686-win32:i386 - GNU Objective-C++ compiler for MinGW-w64, Win32/Win32
8
p  gobjc-mingw-w64-i686-win32:i386 - GNU Objective-C compiler for MinGW-w64, Win32/Win32

Falls Du es im Docker haben willst, dann Dockerfile:

1
# Use a base image
2
FROM debian:testing-slim
3

4
# Install necessary tools
5
RUN apt-get update && apt-get install -y --no-install-recommends \
6
    mingw-w64-common mingw-w64-tools gcc-mingw-w64 \
7
    passwd sudo && \
8
    rm -rf /var/lib/apt/lists/*
9

10
# Copy an entrypoint script
11
COPY entrypoint.sh /entrypoint.sh
12
RUN chmod +x /entrypoint.sh
13

14
# Set the entrypoint
15
ENTRYPOINT ["/entrypoint.sh"]
16

17
# Default command
18
CMD ["bash"]

Und das dazugehoerige entrypoint.sh muss direkt neben dem Dockerfile liegen:

1
#!/bin/bash
2
# Create a user with the same UID and GID as the host user
3
USER_ID=${LOCAL_UID:-9001}
4
GROUP_ID=${LOCAL_GID:-9001}
5
USER_NAME=${LOCAL_USER_NAME:-"anonuser"}
6
GROUP_NAME=${LOCAL_GROUP_NAME:-"anongrouppie"}
7

8
USER_HOME="/home/${USER_NAME}"
9

10
groupadd -g $GROUP_ID "${GROUP_NAME}"
11
useradd -u $USER_ID -g $GROUP_ID -m "${USER_NAME}"
12

13
# allow sudo without a password for $USER_NAME
14
# echo "${USER_NAME} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${USER_NAME}
15

16
# login as $USER_NAME
17
cd "${USER_HOME}"
18
exec sudo -u ${USER_NAME} -i "$@"

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:

1
docker build -t myimage .
2
docker run -it -e LOCAL_UID=$(id -u) -e LOCAL_GID=$(id -g) -e LOCAL_USER_NAME=$(id -un) -e LOCAL_GROUP_NAME=$(id -gn) myimage

-foka

Update: typo behoben.

#7898082
Lesenswert?

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?

OP Persönliche Seite #7898127
Lesenswert?

Foka M. schrieb:

Johann L. schrieb:

Alexander S. schrieb:

mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite

https://packages.debian.org/search?keywords=mingw-w64

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:

1
$ i686-w64-mingw32-gcc main.c -v
2
...
3
/usr/bin/i686-w64-mingw32-ld ... -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 ... -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 ...

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...

#7898194
Lesenswert?

Johann L. schrieb:

Also wenn ich eine main.c mit i686-w64-mingw32-gcc übersetze:

1
> $ i686-w64-mingw32-gcc main.c -v
2
> ...
3
> /usr/bin/i686-w64-mingw32-ld ... -plugin-opt=-pass-through=-lmsvcrt 
4
> -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 
5
> -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 
6
> -plugin-opt=-pass-through=-lmingw32 ... -lmsvcrt -ladvapi32 -lshell32 
7
> -luser32 -lkernel32 ...
8
>

Sieht für mich so aus also würde gegen die Host-Libs gelinkt.

Sieht nur so aus:

1
/usr/bin/i686-w64-mingw32-gcc-win32 --verbose wattauchimmer.c
2
...
3
LIBRARY_PATH=/usr/lib/gcc/i686-w64-mingw32/12-win32/:/usr/lib/gcc/i686-w64-mingw32/12-win32/../../../../i686-w64-mingw32/lib/../lib/:/usr/lib/gcc/i686-w64-mingw32/12-win32/../../../../i686-w64-mingw32/lib/
4
...

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:

1
apt install apt-rdepends
2
apt-rdepends gcc-mingw-w64 | grep Depends| sort | uniq

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.

-foka

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren