Teilfehlschlag: Alte SDK in Docker

Obwohl ich Docker nicht wirklich gut leiden kann, bin ich immer offen dafür, künstlich geschaffene Probleme damit zu lösen … so lange sie “spannend” sind.

Vor einiger Zeit hatte ich doch das Quick-and-Dirty Setup für MSVC 2005 Builds ohne Installation geschildert. Daraus ergibt sich doch die Frage:

Kann man eine “ordentliche” MSVC 2005 Buildumgebung für Docker schaffen?


Antwort: Halb Ja, halb Nein, es kommt darauf an.

Ich, der ich von CMake abhängig bin, schaue leider durch die Finger, aber wer ohne CMake direkt mit NMAKE arbeitet, hat eventuell Glück.

Alte Platform-SDKs (zB. von Server 2003 oder Vista) haben den MSVC++ 2005 integriert und lassen sich tatsächlich in Docker installieren und wenn man das Environment-Script ausführt, springt tatsächlich der Compiler an.

Leider kann CMake damit nicht umgehen und sendet in seinen Test-Routinen Flags, die Runtime falsch einbinden. Damit kann CMake nicht feststellen, welcher Compiler benutzt wird und bricht alles Weitere ab.

Aber vielleicht hilft mein Experiment ja anderen weiter, die direkt mit NMAKE arbeiten. MSBUILD wird leider auch nicht unterstützt und somit kann man auch keine Studio Solutions (*.sln) kompilieren lassen.

Dockerfile für MSVC 2005

Wir starten mit einem Arbeitsordner, z.B.: c:\build2005 Man kopiert sich am besten den Inhalt des Setup Folders einer SDK wie z.B. vom Server 2003 SP1 in ein Unterverzeichnis namens sdk.
Dort sind dann alle MSI Pakete für die Installation drinnen.

Nun legt man eine Textdatei namens c:\build2005\Dockerfile an und fügt folgenden Inhalt ein:

 1FROM mcr.microsoft.com/windows/servercore:ltsc2019
 2
 3COPY ["sdk", "C:/Windows/TEMP/sdk"]
 4RUN msiexec.exe /i C:\Windows\TEMP\sdk\PSDK-amd64.msi /quiet /qn
 5
 6#COPY ["Git-2.31.1-64-bit.exe", "C:/Windows/TEMP/"]
 7#RUN C:\Windows\TEMP\Git-2.31.1-64-bit.exe /VERYSILENT /SUPPRESSMSGBOXES `
 8#      /NOCANCEL /NORESTART
 9#
10#COPY ["cmake-3.6.3-win64-x64.msi", "C:/Windows/TEMP/"]
11#RUN msiexec.exe /i C:\Windows\TEMP\cmake-3.6.3-win64-x64.msi /quiet /qn
12#RUN SETX PATH "%PATH%;C:\Program Files\cmake\bin"
13
14ENTRYPOINT  ["C:\\Windows\\System32\\cmd.exe","/K",  `
15"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\SETENV.CMD", `
16"/XP64","/RETAIL"]

Es installiert die PSDK für AMD64. Optional hatte ich noch eine GIT und die CMAKE Installation dabei.

Im ENTRYPOINT wird das Build-Environment auf WinXP für Releases (Retail) aktiviert.

Wenn wir docker build -t build2005:1.0 . im Verzeichnis c:\build2005 ausführen, sollte Docker ein neues Images mit dem SDK einrichten.

Wenn wir dieses dann mit docker run -it build2005:1.0 ausführen, können wir auf der Konsole bereits NMAKE und CL nutzen.

Wenn man aber CMAKE anwirft, erscheinen Fehlermeldungen wie:

1LINK : warning LNK4012: invalid value 'x64', must be 'AM33, AMD64, 
2       ARM, CEE, EBC, IA64, M32R, MIPS, MIPS16, MIPSFPU, MIPSFPU16, 
3       MIPSR41XX, SH4, SH5, THUMB, or X86'; option ignored
4testCCompiler.c.obj : error LNK2001: unresolved external symbol _RTC_Shutdown
5testCCompiler.c.obj : error LNK2001: unresolved external symbol _RTC_InitBase

Weitere Tests haben ergeben, dass das Kompilieren einer einfachen “Hello World” Test-EXE mit der Option /MD (dynamische CRT) ein funktionierendes Programm produzierte, während /MT (statische CRT) zu vielen Fehlern führte. Problem waren fehlende Security-Cookies und Runtime-Checks:

1main.obj : error LNK2001: unresolved external symbol _RTC_Shutdown
2main.obj : error LNK2001: unresolved external symbol _RTC_InitBase
3LIBCMT.lib(mbctype.obj) : error LNK2001: unresolved external symbol 
4                                         __security_check_cookie
5LIBCMT.lib(setlocal.obj) : error LNK2001: unresolved external symbol 
6                                          __security_check_cookie
7LIBCMT.lib(write.obj) : error LNK2001: unresolved external symbol 
8                                       __security_check_cookie

Fazit

Also entweder fehlt mir da noch eine essentielle Einstellung, oder die SDK Installation kann nicht ohne Weiteres alle Projektformen durchbauen. Gerade statische Bibliotheken sind im GATE Projekt wichtig und auch CMake brauchte sie für seine Tests.

Man muss auch hinzufügen, dass das SDK in Docker nur als 64-bit Setup läuft und dieses auch nur 64-bit Projekte bauen kann.
Es kann schon sein, dass der 64-bit Support damals noch unvollständig war, weil 32-bit den Standard darstellte.
Auch die VC 2005 Express Variante war nur auf 32-bit fixiert.

Naja … auch Misserfolge gehören zum Leben.
Und vielleicht finde ich die Lösung ja ein anderes Mal.