Skip to content

Commit add176b

Browse files
committed
update NSC image creation to not violate Microsoft EULA, update .github/workflows/build-nabla.yml
1 parent e3848ce commit add176b

File tree

2 files changed

+51
-30
lines changed

2 files changed

+51
-30
lines changed

.github/workflows/build-nabla.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ jobs:
2020
strategy:
2121
fail-fast: false
2222
matrix:
23-
vendor: [msvc, clangcl]
23+
# vendor: [msvc, clangcl]
24+
# TODO: Yas please fix ClangCL, we have a few new compile errors
25+
# if we build MSVC then build "run-compiler-explorer" target, for ClangCL build just "nsc"
26+
vendor: [msvc]
2427
config: [Release, Debug, RelWithDebInfo]
2528
tag: ['17.13.6']
2629

tools/nsc/CMakeLists.txt

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,11 @@ find_program(SPIRV_DIS_EXE NAMES spirv-dis HINTS "${VULKAN_SDK}/Bin" REQUIRED)
7373
cmake_path(GET SPIRV_DIS_EXE PARENT_PATH SPIRV_DIS_DIR)
7474
cmake_path(NATIVE_PATH SPIRV_DIS_DIR NORMALIZE SPIRV_DIS_DIR)
7575

76-
include(InstallRequiredSystemLibraries)
77-
78-
if(NOT MSVC_REDIST_DIR)
79-
if(MSVC_REDIST_BASE) # fallback to our CI toolset
80-
set(MSVC_REDIST_DIR "${MSVC_REDIST_BASE}")
81-
else()
76+
if(MSVC_REDIST_BASE) # fallback to our toolset
77+
set(MSVC_REDIST_DIR "${MSVC_REDIST_BASE}")
78+
else()
79+
include(InstallRequiredSystemLibraries)
80+
if(NOT MSVC_REDIST_DIR)
8281
message(FATAL_ERROR "Could not find MSVC_REDIST_DIR, define yourself!")
8382
endif()
8483
endif()
@@ -111,16 +110,13 @@ cmake_path(NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_SOURCE NORMALIZE NBL_DOCKER_CT_N
111110
cmake_path(NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_TARGET NORMALIZE NBL_DOCKER_CT_NSC_VOLUME_TARGET)
112111
cmake_path(NATIVE_PATH NBL_NSC_PREINSTALL_DIRECTORY NORMALIZE NBL_NSC_PREINSTALL_DIRECTORY)
113112

114-
set(CORE_IMAGE mcr.microsoft.com/windows/servercore:ltsc2022)
115113
string(CONFIGURE [=[
116114
# syntax=docker/dockerfile:1
117115
# escape=`
118116
119117
# ---------------- COMPRESS STEP ----------------
120118
FROM @BASE_IMAGE@ as compress
121119
122-
COPY --link --from=@CORE_IMAGE@ C:/Windows/System32/icu.dll C:/pack/Windows/System32/
123-
COPY --link --from=@CORE_IMAGE@ C:/Windows/Globalization/ICU/ C:/pack/Windows/Globalization/ICU/
124120
COPY --link Runtimes/ C:/pack/Windows/System32/
125121
COPY --link Nabla/ C:/pack/runtimes/Nabla/
126122
@@ -140,11 +136,14 @@ COPY --link --from=compress ["C:/pack/nabla-artifacts.tar.zst", "C:/pack/"]
140136
COPY hlsl.local.properties.cmake C:/Compiler-Explorer/etc/config/hlsl.local.properties
141137
142138
ENV NBL_INSTALL_DIRECTORY=@NBL_DOCKER_CT_NSC_VOLUME_TARGET@ `
143-
NBL_EXPLICIT_MODULE_LOAD_LOG=ON `
144-
ICU_DATA=C:\Windows\Globalization\ICU
139+
NBL_EXPLICIT_MODULE_LOAD_LOG=ON
145140
146141
WORKDIR C:/Compiler-Explorer
147-
ENTRYPOINT ["C:\\unpack.bat", "&&", "node", "--no-warnings", "--no-deprecation", "--import=tsx", "./app.js", "--language", "hlsl"]
142+
ENTRYPOINT [ `
143+
"C:\\unpack.bat", "&&", `
144+
"copy", "C:\\mount\\Windows\\System32\\icu.dll", "C:\\Windows\\System32\\icu.dll", "&&", `
145+
"node", "--no-warnings", "--no-deprecation", "--import=tsx", "./app.js", "--language", "hlsl" `
146+
]
148147
]=] INSTRUCTIONS @ONLY)
149148

150149
set(DOCKERFILE "${NBL_DOCKER_CTX_DIR}/Dockerfile")
@@ -197,16 +196,28 @@ execute_process(COMMAND cmd /C ver OUTPUT_VARIABLE PIPE OUTPUT_STRIP_TRAILING_WH
197196
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+" HOST_KERNEL "${PIPE}")
198197
PROMOTE_PROCESS_ISOLATION(${HOST_KERNEL} ${BASE_IMAGE} USE_PROCESS_ISOLATION)
199198

200-
if(USE_PROCESS_ISOLATION)
201-
set(ISOLATION "--isolation process")
202-
else()
199+
if(NOT USE_PROCESS_ISOLATION)
203200
# NOTE: we would need to use GET_RUNTIME_DEPENDENCIES which uses objdump
204201
# https://cmake.org/cmake/help/latest/command/file.html#get-runtime-dependencies
205202
# to collect *all* missing deps and copy (FROM at least server core) to destination nano
206203
# image, it will fail currently if we fully isolate it with VM due to lack of certain DLLs
204+
# BUT it means violating EULA, hence we are not going to support it, also (**)
207205
message(FATAL_ERROR "HyperV is NOT supported! Update your OS!")
208206
endif()
209207

208+
set(CORE_IMAGE mcr.microsoft.com/windows/servercore:ltsc2022)
209+
set(ICU_DIR C:\\Windows\\Globalization\\ICU)
210+
set(ICU_DLL C:\\Windows\\System32\\icu.dll)
211+
if(NOT EXISTS ${ICU_DIR} OR NOT EXISTS ${ICU_DLL})
212+
# fallback for CI purposes, NOTE: we do NOT distribute those in final image as we have host runner requirements (**)
213+
message(STATUS "\"${ICU_DIR}\" or \"${ICU_DLL}\ not found, fallback: copying them to the runner from \"${CORE_IMAGE}\"")
214+
execute_process(COMMAND "${DOCKER_EXE}" rm -f nano-orphan RESULT_VARIABLE res)
215+
execute_process(COMMAND "${DOCKER_EXE}" run -di --isolation process --name nano-orphan --entrypoint cmd ${CORE_IMAGE} COMMAND_ERROR_IS_FATAL ANY)
216+
execute_process(COMMAND "${DOCKER_EXE}" cp nano-orphan:${ICU_DIR} ${ICU_DIR} COMMAND_ERROR_IS_FATAL ANY)
217+
execute_process(COMMAND "${DOCKER_EXE}" cp nano-orphan:${ICU_DLL} ${ICU_DLL} COMMAND_ERROR_IS_FATAL ANY)
218+
message(STATUS "Fallback completed, runner patched!")
219+
endif()
220+
210221
set(ORPHAN nsc-orphan)
211222
set(NBL_CE_URL http://${ORPHAN}:10240)
212223
set(NBL_CE_HEALTHY_CHECK_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/ce_healthy_check.py")
@@ -215,14 +226,14 @@ set(NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/hlsl
215226

216227
# to avoid "too long input" errors we proxy build instructions to CMake script and write it to build directory
217228
string(CONFIGURE [=[
218-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Killing remaining NSC orphans")
219-
execute_process(COMMAND "${DOCKER_EXE}" rm -f "${ORPHAN}")
229+
message(STATUS "Killing remaining NSC orphans")
230+
execute_process(COMMAND "${DOCKER_EXE}" rm -f "${ORPHAN}" RESULT_VARIABLE res)
220231
221-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Executing CTests")
232+
message(STATUS "Executing CTests")
222233
execute_process(COMMAND "${CTEST_EXE}" -C "$<CONFIG>" --stop-on-failure WORKING_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@"
223234
COMMAND_ERROR_IS_FATAL ANY)
224235
225-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Generating NSC build info")
236+
message(STATUS "Generating NSC build info")
226237
execute_process(COMMAND "${CMAKE_COMMAND}"
227238
"-DNBL_EXECUTABLE_PATH=${NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH}"
228239
"-DNBL_BUILD_INFO=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
@@ -231,7 +242,7 @@ execute_process(COMMAND "${CMAKE_COMMAND}"
231242
-P "${NBL_ROOT_PATH}/cmake/scripts/nbl/nablaBuildInfo.cmake"
232243
COMMAND_ERROR_IS_FATAL ANY)
233244
234-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Generating NSC godbolt config")
245+
message(STATUS "Generating NSC godbolt config")
235246
execute_process(COMMAND "${CMAKE_COMMAND}"
236247
"-DSPIRV_DIS_EXE=spirv-dis.exe"
237248
"-DNSC_RELEASE_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
@@ -241,37 +252,44 @@ execute_process(COMMAND "${CMAKE_COMMAND}"
241252
-P "${CMAKE_CURRENT_SOURCE_DIR}/ce-generate-config.cmake"
242253
COMMAND_ERROR_IS_FATAL ANY)
243254
244-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Updating NSC package context")
255+
message(STATUS "Updating NSC package context")
245256
execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different
246257
"$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}>"
247258
"${NBL_DOCKER_CTX_DIR}/Nabla"
248259
COMMAND_ERROR_IS_FATAL ANY)
249260
250-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Building NSC Godbolt image")
251-
execute_process(COMMAND "${DOCKER_EXE}" build ${ISOLATION}
261+
message(STATUS "Building NSC Godbolt image")
262+
execute_process(COMMAND "${DOCKER_EXE}" build --isolation process
252263
-f "${DOCKERFILE}"
253264
-t ${NSC_IMAGE_NAME}
254265
"${NBL_DOCKER_CTX_DIR}"
255266
COMMAND_ERROR_IS_FATAL ANY)
256267
257-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Running new NSC orphan container")
258-
execute_process(COMMAND "${DOCKER_EXE}" run -di -p 80:10240 ${ISOLATION}
259-
--name "${ORPHAN}" ${NSC_IMAGE_NAME}
268+
message(STATUS "Running new NSC orphan container")
269+
execute_process(COMMAND "${DOCKER_EXE}" run -di -p 80:10240 --isolation process
270+
--name "${ORPHAN}"
271+
-v $<PATH:NORMAL_PATH,${ICU_DIR}:${ICU_DIR}:ro>
272+
-v $<PATH:NORMAL_PATH,C:/Windows/System32:C:/mount/Windows/System32:ro>
273+
${NSC_IMAGE_NAME}
260274
COMMAND_ERROR_IS_FATAL ANY)
261275
262-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Health‐check")
276+
message(STATUS "Healthy check")
263277
execute_process(COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_HEALTHY_CHECK_PY}"
264278
--url "${NBL_CE_URL}" --interval 5 --ticks 12
265279
COMMAND_ERROR_IS_FATAL ANY)
266280
267-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Post‐Checking basic shader compile")
281+
message(STATUS "Post Basic NSC shader compile check")
268282
execute_process(COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_ENDPOINT_PY}"
269283
--url "${NBL_CE_URL}"
270284
--endpoint /api/compiler/nsc_$<LOWER_CASE:$<CONFIG>>_upstream/compile
271285
--method POST --json "${NBL_NSC_BASIC_HLSL_JPAYLOAD}"
272286
COMMAND_ERROR_IS_FATAL ANY)
273287
274-
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "OK! NSC container is healthy.")
288+
message(STATUS "Printing NSC container logs")
289+
execute_process(COMMAND "${DOCKER_EXE}" logs "${ORPHAN}" COMMAND_ERROR_IS_FATAL ANY)
290+
291+
message(STATUS "OK! NSC container is healthy.")
292+
message(STATUS "Type \"localhost\" in your browser to use NSC with Godbolt!")
275293
]=] INSTRUCTIONS)
276294

277295
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/run-compiler-explorer-$<CONFIG>.cmake" CONTENT "${INSTRUCTIONS}")

0 commit comments

Comments
 (0)