Windows CE Builds im Docker Container

Bisher waren für meine Windows CE Experimente immer eine Windows-XP VM mit Visual Studio 2005 notwendig, wo ich per Build-Script einen elend langen Build-Prozess anstarten musste.

Doch neulich fand ich eine GCC Variante, die WinCE-Binaries bauen konnte, und zwar im Linux Docker Container.


Im Github Account enlyze befindet sich still und heimlich die Lösung all meiner Windows-CE Probleme.
Nämlich ein Linux Docker Image mit einer speziellen GCC Variante, die Windows-CE Binaries bauen kann.

Ich habe mir hierfür das Image angepasst und als neues Build-Tag in mein OpenGATE Repository aufgenommen:
hub.docker.com/r/opendockergate/gate-build-env/tags deb.12.cegcc.arm.9.3.1

Dem Image wurde nur git, cmake, nodejs und ein paar Zusatztools hinzugefügt, die zum Bauen unter Forgejo notwendig sind.

Für CMake wurde dem GATE Projekt eine neue Toolchain-Datei hinzugefügt:

 1set(CMAKE_SYSTEM_NAME "WindowsCE")
 2set(CMAKE_SYSTEM_PROCESSOR "arm")
 3set(TOOLCHAIN_PREFIX "arm-mingw32ce")
 4
 5set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}-gcc")
 6set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}-g++")
 7
 8set(CMAKE_CROSSCOMPILING TRUE)
 9
10set(MINGW TRUE)
11set(CMAKE_FIND_ROOT_PATH "/opt/cegcc-arm" "/opt/cegcc-arm/arm-mingw32ce")
12set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
13set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
14set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Beim Bauen werden so die richtigen Compiler Tools im Docker Container gefunden.

Unterschiede zum MSVC

Tatsächlich brauchte es jede Menge Tests und Anpassungen am Sourcecode und am Buildsystem, bis die ersten Binaries erfolgreich gebaut werden konnten.

Unter MSVC fehlen große Bestandteile der C-Standard-Bibliothek, welche durch meine eigene Implementierung ersetzt wurden. Doch im GCC sind einige dieser Funktionen oder Makros vorhanden, und so musste ich diese Spezialfälle in meiner stdcpatches Bibliothek anpassen.

Früher war ein if(WINCE) gleichbedeutend mit einem if(MSVC), doch nun gibt es die feine Unterscheidung:

1if(WINCE)
2  if(MSVC)
3    # VS2005 patches
4  else()
5    # GCC-WinCE patches
6  endif()
7endif()

Fazit

Am Ende gelang das Experiment und ab sofort erzeugt jeder Commit ins Codeberg GATE Repository auch einen GCC Windows CE Build.

Tatsächlich existier auch ein i386 Output, den ich aber nie testen konnte. Den handelsüblichen ARM Output habe ich jedoch auf meinen WinCE-Laptop erfolgreich ausgeführt.

An dieser Stelle kann ich wieder nur betonen:

Es ist unglaublich, was wir heute mit Linux und dem GCC erreichen können.
Niemand hätte sich im Jahr 2000 vorstellen können, dass einmal sämtliche Windows Build von Linux-Maschinen kommen würden.
… am wenigsten Steve Ballmer.