@@ -12,6 +12,8 @@ ARG WINDOWS_11_SDK_VERSION=22621
1212ARG WINDOWS_SDK_VERSION=10.0.${WINDOWS_11_SDK_VERSION}.0
1313ARG VC_VERSION=14.43.17.13
1414ARG VS_BOOTSTRAP_VERSION=17.13.6
15+ ARG VULKAN_SDK_VERSION=1.4.313.0
16+ ARG NINJATRACING_VERSION=0.0.2
1517
1618# note: it seems we cannot pass version within any workflow ID to installer, though as I look at VS package cache I see it being done in json payloads!
1719# henceforth we enforce fixed versions with nasty bootstrap URL, more details:
@@ -33,24 +35,68 @@ ARG IMPL_COMPRESSION_LEVEL=3
3335ARG IMPL_NANO_BASE=mcr.microsoft.com/powershell
3436ARG IMPL_NANO_TAG=lts-nanoserver-ltsc2022
3537
36- # ---------------- BUILD TOOLS ----------------
37- FROM mcr.microsoft.com/windows/servercore:ltsc2022 as buildtools
38+ # ---------------- REDIST ----------------
39+ FROM mcr.microsoft.com/windows/servercore:ltsc2022 as redist
3840
39- ARG WINDOWS_11_SDK_VERSION
40- ARG VC_VERSION
41- ARG MSVC_VERSION
4241ARG BUILD_TOOLS_URL
4342ARG IMPL_ARTIFACTS_DIR
4443
4544RUN mkdir C:\T emp && cd C:\T emp `
4645&& curl -SL --output vs_buildtools.exe %BUILD_TOOLS_URL% `
4746&& (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
47+ --add Microsoft.VisualStudio.Component.VC.Redist.14.Latest `
48+ --installPath %IMPL_ARTIFACTS_DIR% `
49+ || IF "%ERRORLEVEL%" =="3010" EXIT 0)
50+
51+ # ---------------- COMMON BUILD TOOLS ----------------
52+ FROM redist as bootstrap
53+
54+ ARG BUILD_TOOLS_URL
55+ ARG IMPL_ARTIFACTS_DIR
56+
57+ RUN (start /w C:\T emp\v s_buildtools.exe --quiet --wait --norestart --nocache `
58+ --add Microsoft.VisualCpp.DIA.SDK `
59+ --add Microsoft.VisualStudio.Component.VC.Llvm.Clang `
60+ --installPath %IMPL_ARTIFACTS_DIR% `
61+ || IF "%ERRORLEVEL%" =="3010" EXIT 0)
62+
63+ SHELL ["powershell" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-Command" ]
64+
65+ # version depends on channel (see BUILD_TOOLS_URL)
66+ ARG CLANGCL_VERSION
67+ RUN $version = "$env:CLANGCL_VERSION" ; `
68+ $clangcl = Join-Path $env:IMPL_ARTIFACTS_DIR "VC\T ools\L lvm\b in\c lang-cl.exe" ; `
69+ $pipe = & "$clangcl" -v 2>&1 ; `
70+ if ($pipe -match "$version" ) { exit 0 } else { `
71+ Write-Host "Validation failed due to requested version mismatch! Note: CLANGCL_VERSION = $version" ; `
72+ Write-Host "$pipe" ; `
73+ exit -1 `
74+ }
75+
76+ SHELL ["cmd" , "/S" , "/C" ]
77+
78+ # ---------------- WINDOWS SDK ----------------
79+ FROM bootstrap as winsdk
80+
81+ ARG WINDOWS_11_SDK_VERSION
82+ ARG IMPL_ARTIFACTS_DIR
83+
84+ RUN (start /w C:\T emp\v s_buildtools.exe --quiet --wait --norestart --nocache `
85+ --add Microsoft.VisualStudio.Component.Windows11SDK.%WINDOWS_11_SDK_VERSION% `
86+ --installPath %IMPL_ARTIFACTS_DIR% `
87+ || IF "%ERRORLEVEL%" =="3010" EXIT 0)
88+
89+ # ---------------- VC BUILD TOOLS ----------------
90+ FROM bootstrap as buildtools
91+
92+ ARG VC_VERSION
93+ ARG MSVC_VERSION
94+ ARG IMPL_ARTIFACTS_DIR
95+
96+ RUN (start /w C:\T emp\v s_buildtools.exe --quiet --wait --norestart --nocache `
4897--add Microsoft.VisualStudio.Component.VC.%VC_VERSION%.x86.x64 `
4998--add Microsoft.VisualStudio.Component.VC.%VC_VERSION%.ATL `
5099--add Microsoft.VisualStudio.Component.VC.%VC_VERSION%.MFC `
51- --add Microsoft.VisualStudio.Component.Windows11SDK.%WINDOWS_11_SDK_VERSION% `
52- --add Microsoft.VisualCpp.DIA.SDK `
53- --add Microsoft.VisualStudio.Component.VC.Llvm.Clang `
54100--installPath %IMPL_ARTIFACTS_DIR% `
55101|| IF "%ERRORLEVEL%" =="3010" EXIT 0) && dir %IMPL_ARTIFACTS_DIR%\V C\T ools\M SVC `
56102&& if exist %IMPL_ARTIFACTS_DIR%\V C\T ools\M SVC\% MSVC_VERSION% ( `
@@ -59,7 +105,7 @@ for /d %i in (%IMPL_ARTIFACTS_DIR%\VC\Tools\MSVC\*) do if /I not "%i"=="%IMPL_AR
59105echo "Error: Expected MSVC version directory %MSVC_VERSION% does not exist!" && exit /b 1 `
60106)
61107
62- SHELL ["powershell" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-Command" ]
108+ # SHELL ["powershell", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
63109# important note: msc ships compiler which minor version doesn't match the toolset directory name
64110# eg. dir name: 14.43.34808 (MSVC_VERSION) but version reported by cl.exe: 19.43.34810
65111# more over, all package cache payloads (by default at C:\ProgramData\Microsoft\VisualStudio)
@@ -76,16 +122,19 @@ SHELL ["powershell", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Co
76122# exit -1 `
77123# }
78124
79- # on the other hand here version depends on channel (see BUILD_TOOLS_URL)
80- ARG CLANGCL_VERSION
81- RUN $version = "$env:CLANGCL_VERSION" ; `
82- $clangcl = Join-Path $env:IMPL_ARTIFACTS_DIR "VC\T ools\L lvm\b in\c lang-cl.exe" ; `
83- $pipe = & "$clangcl" -v 2>&1 ; `
84- if ($pipe -match "$version" ) { exit 0 } else { `
85- Write-Host "Validation failed due to requested version mismatch! Note: CLANGCL_VERSION = $version" ; `
86- Write-Host "$pipe" ; `
87- exit -1 `
88- }
125+ # ---------------- VULKAN SDK ----------------
126+ FROM redist as vulkan
127+
128+ ARG VULKAN_SDK_VERSION
129+ ARG IMPL_ARTIFACTS_DIR
130+ SHELL ["powershell" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-Command" ]
131+
132+ RUN Write-Host "Installing Vulkan SDK $env:VULKAN_SDK_VERSION" ; `
133+ Remove-Item -Recurse -Force $env:IMPL_ARTIFACTS_DIR -ErrorAction SilentlyContinue ; `
134+ New-Item -ItemType Directory -Force -Path C:\T emp, $env:IMPL_ARTIFACTS_DIR ; `
135+ Invoke-WebRequest -Uri "https://sdk.lunarg.com/sdk/download/$env:VULKAN_SDK_VERSION/windows/vulkansdk-windows-X64-$env:VULKAN_SDK_VERSION.exe" -OutFile C:\T emp\v ulkan-sdk.exe ; `
136+ & C:\T emp\v ulkan-sdk.exe install --root "$env:IMPL_ARTIFACTS_DIR" --default-answer --accept-licenses --confirm-command ; `
137+ Remove-Item C:\T emp\v ulkan-sdk.exe
89138
90139# ---------------- CMAKE ----------------
91140FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as cmake
@@ -134,6 +183,19 @@ Invoke-WebRequest -Uri "https://github.com/ninja-build/ninja/releases/download/v
134183tar -xf C:\T emp\n inja.zip -C $env:IMPL_ARTIFACTS_DIR ; `
135184Remove-Item C:\T emp\n inja.zip
136185
186+ # ---------------- NINJA ----------------
187+ FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as ninjatracing
188+ SHELL ["pwsh" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-Command" ]
189+
190+ ARG NINJATRACING_VERSION
191+ ARG IMPL_ARTIFACTS_DIR
192+
193+ RUN Write-Host "Installing Ninja-Tracing $env:NINJATRACING_VERSION" ; `
194+ New-Item -ItemType Directory -Force -Path C:\T emp, $env:IMPL_ARTIFACTS_DIR ; `
195+ Invoke-WebRequest -Uri "https://github.com/Devsh-Graphics-Programming/ninjatracing/archive/refs/tags/$env:NINJATRACING_VERSION.zip" -OutFile C:\T emp\n injatracing.zip ; `
196+ tar -xf C:\T emp\n injatracing.zip -C $env:IMPL_ARTIFACTS_DIR ; `
197+ Remove-Item C:\T emp\n injatracing.zip
198+
137199# ---------------- NASM ----------------
138200FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as nasm
139201SHELL ["pwsh" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-Command" ]
@@ -178,11 +240,13 @@ FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as compress
178240SHELL ["pwsh" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-Command" ]
179241
180242ARG IMPL_ARTIFACTS_DIR
181- COPY --link --from=buildtools ["C:/Program Files (x86)/Windows Kits/10" , "C:/pack/WindowsKits10SDK" ]
243+ COPY --link --from=winsdk ["C:/Program Files (x86)/Windows Kits/10" , "C:/pack/WindowsKits10SDK" ]
182244COPY --link --from=buildtools ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/BuildTools" ]
245+ COPY --link --from=vulkan ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/vulkan-sdk" ]
183246COPY --link --from=cmake ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/CMake" ]
184247COPY --link --from=python ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/Python" ]
185248COPY --link --from=ninja ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/Ninja" ]
249+ COPY --link --from=ninjatracing ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/NinjaTracing" ]
186250COPY --link --from=nasm ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/Nasm" ]
187251COPY --link --from=git ["${IMPL_ARTIFACTS_DIR}" , "C:/pack/Git" ]
188252COPY --link --from=zstd ["${IMPL_ARTIFACTS_DIR}" , "C:/compress" ]
@@ -192,10 +256,17 @@ ARG IMPL_COMPRESSION_OPTIONS
192256ARG IMPL_COMPRESSION_LEVEL
193257
194258WORKDIR C:\p ack
195- RUN $dirs = Get-ChildItem -Directory | ForEach-Object { $_.Name }; $dirs; `
196- tar -cf artifacts.tar @dirs; dir artifacts.tar; $compressionOpts = $env:IMPL_COMPRESSION_OPTIONS -split ' ' ; `
197- & "C:\c ompress\z std-v$env:ZSTD_VERSION-win64\z std.exe" @compressionOpts artifacts.tar "-$env:IMPL_COMPRESSION_LEVEL" ; dir artifacts.tar.zst; `
198- rm artifacts.tar
259+ RUN $dirs=Get-ChildItem -Directory|Select-Object -Expand Name; `
260+ New-Item -ItemType Directory -Force -Path "zst" ; `
261+ foreach($d in $dirs){ `
262+ Write-Host "=== Compressing $d ===" ; `
263+ tar -cf "${d}-artifacts.tar" "$d" ; `
264+ & "C:\c ompress\z std-v$env:ZSTD_VERSION-win64\z std.exe" `
265+ $env:IMPL_COMPRESSION_OPTIONS.Split(' ' ) `
266+ "${d}-artifacts.tar" "-$env:IMPL_COMPRESSION_LEVEL" `
267+ "-o" "zst/${d}-artifacts.tar.zst" ; `
268+ Remove-Item "${d}-artifacts.tar" ; `
269+ }
199270
200271# ---------------- FINAL IMAGE ----------------
201272FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG}
@@ -208,7 +279,7 @@ LABEL org.opencontainers.image.description="Build MSVC/ClangCL + WinSDK projects
208279LABEL org.opencontainers.image.licenses=Apache-2.0
209280
210281ARG IMPL_ARTIFACTS_DIR
211- COPY --link --from=compress ["C:/pack/artifacts.tar. zst" , "C:/artifacts.tar.zst " ]
282+ COPY --link --from=compress ["C:/pack/zst" , "C:/pack " ]
212283COPY --link --from=zstd ["${IMPL_ARTIFACTS_DIR}" , "C:/compress" ]
213284
214285ARG CMAKE_VERSION
@@ -223,6 +294,8 @@ ARG MSVC_VERSION
223294ARG CLANGCL_VERSION
224295ARG BUILD_TOOLS_URL
225296ARG VS_BOOTSTRAP_VERSION
297+ ARG VULKAN_SDK_VERSION
298+ ARG NINJATRACING_VERSION
226299ARG ZSTD_VERSION
227300
228301ENV CMAKE_WINDOWS_KITS_10_DIR="C:\W indowsKits10SDK" `
@@ -239,11 +312,14 @@ MSVC_VERSION=${MSVC_VERSION} `
239312CLANGCL_VERSION=${CLANGCL_VERSION} `
240313BUILD_TOOLS_URL=${BUILD_TOOLS_URL} `
241314VS_BOOTSTRAP_VERSION=${VS_BOOTSTRAP_VERSION} `
315+ VULKAN_SDK_VERSION=${VULKAN_SDK_VERSION} `
316+ NINJATRACING_VERSION=${NINJATRACING_VERSION} `
242317MSVC_TOOLSET_DIR=C:\B uildTools\V C\T ools\M SVC\$ {MSVC_VERSION} `
243318LLVM_TOOLSET_DIR=C:\B uildTools\V C\T ools\L lvm `
244- PATH="C:\W indows\s ystem32;C:\W indows;C:\P rogram Files\P owerShell;C:\G it\c md;C:\G it\b in;C:\G it\u sr\b in;C:\G it\m ingw64\b in;C:\C Make\c make-${CMAKE_VERSION}-windows-x86_64\b in;C:\P ython;C:\N asm;C:\N asm\n asm-${NASM_VERSION};C:\N inja;C:\c ompress\z std-v${ZSTD_VERSION}-win64;"
319+ PATH="C:\W indows\s ystem32;C:\W indows;C:\P rogram Files\P owerShell;C:\G it\c md;C:\G it\b in;C:\G it\u sr\b in;C:\G it\m ingw64\b in;C:\C Make\c make-${CMAKE_VERSION}-windows-x86_64\b in;C:\P ython;C:\N asm;C:\N asm\n asm-${NASM_VERSION};C:\N inja;C:\c ompress\z std-v${ZSTD_VERSION}-win64;C: \v ulkan-sdk \B in;C: \N injaTracing \n injatracing-${NINJATRACING_VERSION} "
245320
246321COPY . sample/
247322COPY unpack.ps1 .
248323WORKDIR C:\s ample\t ests
324+ ENTRYPOINT ["pwsh.exe" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" , "-NoExit" , "-File" , "C:/unpack.ps1" ]
249325CMD ["pwsh.exe" , "-NoLogo" , "-NoProfile" , "-ExecutionPolicy" , "Bypass" ]
0 commit comments