1+ ARG PLATFORMSDK_DIR=/opt/platformsdk
2+ ARG PLATFORMSDK_WIN32=${PLATFORMSDK_DIR}/Win32
3+ ARG WINDOWS_SDK_VERSION=10.0.28000.0
4+ ARG WINDOWS_MSVC_VERSION=14.51.36231
5+ ARG WINDOWS_SDK_DIR=${PLATFORMSDK_WIN32}/WindowsKits/10
6+ ARG WINDOWS_MSVC_DIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026/VC/Tools/MSVC/${WINDOWS_MSVC_VERSION}"
7+
8+ FROM europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-build-env:1.0.0 AS build
9+
10+ ARG PLATFORMSDK_WIN32
11+ ARG WINDOWS_SDK_VERSION
12+ ARG WINDOWS_MSVC_VERSION
13+ ARG WINDOWS_SDK_DIR
14+ ARG WINDOWS_MSVC_DIR
15+
16+ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
17+
18+ RUN \
19+ apt-get update && \
20+ apt-get install -y --no-install-recommends python3 python-is-python3
21+
22+ RUN --mount=type=secret,id=DM_PACKAGES_URL,required=true \
23+ mkdir -p "${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026" && \
24+ wget -q -O - "$(cat /run/secrets/DM_PACKAGES_URL)/Microsoft-Visual-Studio-2026-${WINDOWS_MSVC_VERSION}.tar.gz" | tar xz -C "${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026" && \
25+ mkdir -p "${PLATFORMSDK_WIN32}/WindowsKits" && \
26+ wget -q -O - "$(cat /run/secrets/DM_PACKAGES_URL)/WindowsKits-${WINDOWS_SDK_VERSION}.tar.gz" | tar xz -C "${PLATFORMSDK_WIN32}/WindowsKits"
27+
28+ COPY winsdk_rename_files.py ${PLATFORMSDK_WIN32}
29+
30+ # Due to Windows' case insensitive file system, the sources reference lib files with wrong cases
31+ # so we solve the bulk by making the suffixes lowercase. (e.g. MyLib.Lib -> MyLib.lib)
32+ RUN find $PLATFORMSDK_WIN32 -iname '*.Lib' -type f -exec sh -c 'a=$(echo "$0" | sed -r "s/([^.]*)\$/\L\1/"); [ "$a" != "$0" ] && [ ! -f "$a" ] && ln -s "$0" "$a" ' {} \; && \
33+ python ${PLATFORMSDK_WIN32}/winsdk_rename_files.py > ${PLATFORMSDK_WIN32}/rename.txt && \
34+ # Make a copy of all the headers too, in lower case (e.g. Windows.h -> windows.h etc)
35+ find $PLATFORMSDK_WIN32 -iname '*.h' -type f -exec sh -c 'd=$(dirname "$0"); a=$(basename "$0" | tr [:upper:] [:lower:]); [ "$a" != $(basename "$0") ] && [ ! -f "$d/$a" ] && ln -s "$0" "$d/$a" ' {} \; && \
36+ # Make lower case links of libraries as well
37+ find ${WINDOWS_SDK_DIR}/Lib -iname '*.lib' -type f -exec sh -c 'd=$(dirname "$0"); a=$(basename "$0" | tr [:upper:] [:lower:]); [ "$a" != $(basename "$0") ] && [ ! -f "$d/$a" ] && ln -s "$0" "$d/$a" ' {} \;
38+
39+ # and the rest are manually copied (or made lower case)
40+ WORKDIR "${WINDOWS_MSVC_DIR}/lib/x64"
41+ RUN \
42+ cp oldnames.lib OLDNAMES.lib && \
43+ cp libcmt.lib LIBCMT.lib && \
44+ cp delayimp.lib Delayimp.lib
45+
46+ WORKDIR "${WINDOWS_MSVC_DIR}/lib/x86"
47+ RUN \
48+ cp oldnames.lib OLDNAMES.lib && \
49+ cp libcmt.lib LIBCMT.lib && \
50+ cp delayimp.lib Delayimp.lib
51+
52+ # Some headers are named by the wrong name in the windows sdk's...
53+ # We need to make certain names lowercase because some users
54+ # have put "pragma lib" comments in some libraries :(
55+ # and/or misspelled header files
56+ WORKDIR "${WINDOWS_SDK_DIR}/Include/${WINDOWS_SDK_VERSION}/shared"
57+ RUN \
58+ cp driverspecs.h DriverSpecs.h && \
59+ cp specstrings.h SpecStrings.h && \
60+ cp concurrencysal.h ConcurrencySal.h && \
61+ cp wlantypes.h WlanTypes.h
62+
63+ WORKDIR "${WINDOWS_SDK_DIR}/Lib/${WINDOWS_SDK_VERSION}/um/x64"
64+ RUN cp psapi.lib Psapi.lib
65+
66+ WORKDIR "${WINDOWS_SDK_DIR}/Lib/${WINDOWS_SDK_VERSION}/um/x86"
67+ RUN cp psapi.lib Psapi.lib
68+
69+ # Also, the OpenGL headers in the windows SDK is in a folder with lower case letters, which doesn't match the includes
70+ WORKDIR "${WINDOWS_SDK_DIR}/Include/${WINDOWS_SDK_VERSION}/um"
71+ RUN \
72+ mkdir ./GL && \
73+ cp -v ./gl/*.* ./GL/
74+
75+ WORKDIR /
76+
77+ FROM europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-wine-env:1.7.1
78+
79+ ARG PLATFORMSDK_WIN32
80+ ARG WINDOWS_SDK_VERSION
81+ ARG WINDOWS_MSVC_VERSION
82+ ARG WINDOWS_SDK_DIR
83+ ARG WINDOWS_MSVC_DIR
84+
85+
86+ ENV PLATFORMSDK_WIN32=${PLATFORMSDK_WIN32}
87+ ENV \
88+ WINDOWS_SDK_DIR=${WINDOWS_SDK_DIR} \
89+ WINDOWS_SDK_VERSION=${WINDOWS_SDK_VERSION} \
90+ WINDOWS_MSVC_VERSION=$WINDOWS_MSVC_VERSION} \
91+ VCINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026/VC" \
92+ VSINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026" \
93+ WINDOWS_MSVC_DIR=${WINDOWS_MSVC_DIR} \
94+ WINDOWS_VCINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026/VC/Tools/MSVC/${WINDOWS_MSVC_VERSION}" \
95+ WINDOWS_VSINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2026"
96+
97+ COPY --from=build ${PLATFORMSDK_WIN32} ${PLATFORMSDK_WIN32}
98+
99+ # windres: Allows for generating .res files that can be used during linking
100+ # hadolint ignore=SC2016
101+ RUN \
102+ apt-get update && \
103+ apt-get install -y --no-install-recommends binutils-mingw-w64-x86-64 gcc && \
104+ ls -la /usr/bin/x86_64-w64-mingw32-windres && \
105+ ln -s /usr/bin/x86_64-w64-mingw32-windres /usr/local/bin/windres && \
106+ CLANG_EXEC="$(which clang)" && \
107+ LLVM_AR="$(which llvm-ar)" &&\
108+ ln -s "${CLANG_EXEC}" "$(dirname "${CLANG_EXEC}")/x86_64-pc-win32-clang" && \
109+ ln -s "${LLVM_AR}" "$(dirname "${LLVM_AR}")/x86_64-pc-win32-clang-ar" && \
110+ # Since dotnet cannot really cross compile, we need to create a "lib" shim for "wine lib.exe"
111+ # As long as it's in the path, it will be picked up
112+ echo '#!/usr/bin/env bash' > /usr/bin/lib && \
113+ echo 'wine ${WINDOWS_VCINSTALLDIR}/bin/Hostx64/x64/lib.exe $*' >> /usr/bin/lib && \
114+ chmod +x /usr/bin/lib && \
115+ apt-get autoremove -y && \
116+ apt-get clean && \
117+ rm -rf /var/lib/apt/lists/*
0 commit comments