@@ -59,11 +59,82 @@ add_test(NAME NBL_NSC_DUMP_BUILD_INFO_TEST
5959
6060if (NBL_ENABLE_DOCKER_INTEGRATION)
6161
62+ find_program (DOCKER_EXE NAMES docker REQUIRED)
6263set (BASE_IMAGE ghcr.io/devsh-graphics-programming/compiler-explorer-docker:nano-2022)
64+ set (CORE_IMAGE mcr.microsoft.com/windows/servercore:ltsc2022)
6365
64- find_program (CTEST_EXE NAMES ctest REQUIRED)
65- find_program (DOCKER_EXE NAMES docker REQUIRED)
66+ function (PROMOTE_PROCESS_ISOLATION BASE VAR)
67+ set (${VAR} True )
68+
69+ macro (INSPECT IMAGE)
70+ execute_process (COMMAND "${DOCKER_EXE} " inspect --format={{.OsVersion}} ${IMAGE}
71+ RESULT_VARIABLE INSPECTION_OK
72+ OUTPUT_VARIABLE TARGET_KERNEL
73+ OUTPUT_STRIP_TRAILING_WHITESPACE
74+ )
75+ endmacro ()
76+
77+ macro (TO_PROCESS IMAGE TARGET_KERNEL)
78+ execute_process (COMMAND "${DOCKER_EXE} " run --rm --isolation process --entrypoint cmd ${BASE} /K
79+ RESULT_VARIABLE PROCESS_ISOLATION_OK
80+ OUTPUT_QUIET ERROR_QUIET
81+ )
82+
83+ if (${PROCESS_ISOLATION_OK} EQUAL 0)
84+ message (STATUS "Promoting \" ${IMAGE} \" [${TARGET_KERNEL} ] to process isolation" )
85+ else ()
86+ set (${VAR} False )
87+ message (STATUS "Cannot promote \" ${IMAGE} \" [${TARGET_KERNEL} ] to process isolation, requires falling back to HyperV. Please update your docker host OS." )
88+ endif ()
89+ endmacro ()
90+
91+ INSPECT(${BASE} )
92+
93+ if (${INSPECTION_OK} EQUAL 0)
94+ TO_PROCESS(${BASE} ${TARGET_KERNEL} )
95+ else ()
96+ message (STATUS "\" ${BASE} \" not found in local registry, pulling..." )
97+ execute_process (COMMAND "${DOCKER_EXE} " pull ${BASE} )
98+
99+ INSPECT(${BASE} )
100+ TO_PROCESS(${BASE} ${TARGET_KERNEL} )
101+ endif ()
102+
103+ set (${VAR} ${${VAR} } PARENT_SCOPE)
104+ endfunction ()
105+
106+ PROMOTE_PROCESS_ISOLATION(${BASE_IMAGE} USE_PROCESS_ISOLATION)
107+
108+ if (NOT USE_PROCESS_ISOLATION)
109+ # NOTE: we would need to use GET_RUNTIME_DEPENDENCIES which uses objdump
110+ # https://cmake.org/cmake/help/latest/command/file.html#get-runtime-dependencies
111+ # to collect *all* missing deps and copy (FROM at least server core) to destination nano
112+ # image, it will fail currently if we fully isolate it with VM due to lack of certain DLLs
113+ # BUT it means violating EULA, hence we are not going to support it, also (**)
114+ message (FATAL_ERROR "HyperV is NOT supported! Update your OS!" )
115+ endif ()
116+
117+ function (GET_LABEL BASE_IMAGE LABEL VAR)
118+ set (FORMAT "{{ index .Config.Labels \" ${LABEL} \" }}" )
119+ execute_process (COMMAND ${DOCKER_EXE} inspect --format=${FORMAT} ${BASE_IMAGE}
120+ OUTPUT_VARIABLE OUT
121+ OUTPUT_STRIP_TRAILING_WHITESPACE
122+ ERROR_VARIABLE ERR
123+ RESULT_VARIABLE RES
124+ )
66125
126+ if (NOT RES EQUAL 0)
127+ message (WARNING "Could not get \" ${LABEL} \" label from \" ${BASE_IMAGE} \" image, it doesn't exist!" )
128+ endif ()
129+
130+ set (${VAR} "${OUT} " PARENT_SCOPE)
131+ endfunction ()
132+
133+ GET_LABEL(${BASE_IMAGE} org.opencontainers.image.title ORG_LABEL_TITLE)
134+ GET_LABEL(${BASE_IMAGE} org.opencontainers.image.source ORG_LABEL_SOURCE)
135+ GET_LABEL(${BASE_IMAGE} org.opencontainers.image.description ORG_LABEL_DESCRIPTION)
136+
137+ find_program (CTEST_EXE NAMES ctest REQUIRED)
67138find_file (DXIL_DLL NAMES dxil.dll HINTS "$ENV{CMAKE_WINDOWS_KITS_10_DIR} /Redist/D3D/x64" "C:/Program Files (x86)/Windows Kits/10/Redist/D3D/x64" REQUIRED)
68139
69140set (ICU_GLOBALIZATION_DIR C:\\Windows\\Globalization\\ICU)
@@ -144,6 +215,11 @@ ENTRYPOINT [ `
144215 "copy", "C:\\mount\\Windows\\System32\\icu.dll", "C:\\Windows\\System32\\icu.dll", "&&", `
145216 "node", "--no-warnings", "--no-deprecation", "--import=tsx", "./app.js", "--language", "hlsl" `
146217]
218+
219+ LABEL org.opencontainers.image.title="[Nabla Shader Compiler (NSC)]: @ORG_LABEL_TITLE@"
220+ LABEL org.opencontainers.image.source=https://github.com/Devsh-Graphics-Programming/Nabla
221+ LABEL org.opencontainers.image.description="[Nabla Shader Compiler (NSC)]: @ORG_LABEL_DESCRIPTION@"
222+
147223]=] INSTRUCTIONS @ONLY)
148224
149225set (DOCKERFILE "${NBL_DOCKER_CTX_DIR} /Dockerfile" )
@@ -157,58 +233,6 @@ set(NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT "${NBL_DOCKER_CTX_DIR}/hlsl.local.prop
157233string (GENEX_STRIP "${NBL_PACKAGE_RUNTIME_EXE_DIR_PATH} " NBL_RELATIVE_ENTRY)
158234set (OUTPUT_CONFIG_FILE $<PATH :NORMAL_PATH,${NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT} >)
159235
160- function (PROMOTE_PROCESS_ISOLATION BASE VAR)
161- set (${VAR} True )
162-
163- macro (INSPECT IMAGE)
164- execute_process (COMMAND "${DOCKER_EXE} " inspect --format={{.OsVersion}} ${IMAGE}
165- RESULT_VARIABLE INSPECTION_OK
166- OUTPUT_VARIABLE TARGET_KERNEL
167- OUTPUT_STRIP_TRAILING_WHITESPACE
168- )
169- endmacro ()
170-
171- macro (TO_PROCESS IMAGE TARGET_KERNEL)
172- execute_process (COMMAND "${DOCKER_EXE} " run --rm --isolation process --entrypoint cmd ${BASE} /K
173- RESULT_VARIABLE PROCESS_ISOLATION_OK
174- OUTPUT_QUIET ERROR_QUIET
175- )
176-
177- if (${PROCESS_ISOLATION_OK} EQUAL 0)
178- message (STATUS "Promoting \" ${IMAGE} \" [${TARGET_KERNEL} ] to process isolation" )
179- else ()
180- set (${VAR} False )
181- message (STATUS "Cannot promote \" ${IMAGE} \" [${TARGET_KERNEL} ] to process isolation, requires falling back to HyperV. Please update your docker host OS." )
182- endif ()
183- endmacro ()
184-
185- INSPECT(${BASE} )
186-
187- if (${INSPECTION_OK} EQUAL 0)
188- TO_PROCESS(${BASE} ${TARGET_KERNEL} )
189- else ()
190- message (STATUS "\" ${BASE} \" not found in local registry, pulling..." )
191- execute_process (COMMAND "${DOCKER_EXE} " pull ${BASE} )
192-
193- INSPECT(${BASE} )
194- TO_PROCESS(${BASE} ${TARGET_KERNEL} )
195- endif ()
196-
197- set (${VAR} ${${VAR} } PARENT_SCOPE)
198- endfunction ()
199-
200- PROMOTE_PROCESS_ISOLATION(${BASE_IMAGE} USE_PROCESS_ISOLATION)
201-
202- if (NOT USE_PROCESS_ISOLATION)
203- # NOTE: we would need to use GET_RUNTIME_DEPENDENCIES which uses objdump
204- # https://cmake.org/cmake/help/latest/command/file.html#get-runtime-dependencies
205- # to collect *all* missing deps and copy (FROM at least server core) to destination nano
206- # image, it will fail currently if we fully isolate it with VM due to lack of certain DLLs
207- # BUT it means violating EULA, hence we are not going to support it, also (**)
208- message (FATAL_ERROR "HyperV is NOT supported! Update your OS!" )
209- endif ()
210-
211- set (CORE_IMAGE mcr.microsoft.com/windows/servercore:ltsc2022)
212236set (ICU_DIR C:\\Windows\\Globalization\\ICU)
213237set (ICU_DLL C:\\Windows\\System32\\icu.dll)
214238if (NOT EXISTS ${ICU_DIR} OR NOT EXISTS ${ICU_DLL} )
@@ -240,75 +264,92 @@ set(NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/hlsl
240264# to avoid "too long input" errors we proxy build instructions to CMake script and write it to build directory
241265string (CONFIGURE [=[
242266message(STATUS "Killing remaining NSC orphans")
243- execute_process(COMMAND "${DOCKER_EXE}" rm -f "${ORPHAN}" RESULT_VARIABLE res)
267+ execute_process(COMMAND "@DOCKER_EXE@"
268+ rm -f "@ORPHAN@"
269+ RESULT_VARIABLE res
270+ )
244271
245272message(STATUS "Executing CTests")
246- execute_process(COMMAND "${CTEST_EXE}" -C "$<CONFIG>" --stop-on-failure WORKING_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@"
247- COMMAND_ERROR_IS_FATAL ANY)
273+ execute_process(COMMAND "@CTEST_EXE@"
274+ -C "$<CONFIG>" --stop-on-failure
275+ WORKING_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@"
276+ COMMAND_ERROR_IS_FATAL ANY
277+ )
248278
249279message(STATUS "Generating NSC build info")
250- execute_process(COMMAND "${CMAKE_COMMAND}"
251- "-DNBL_EXECUTABLE_PATH=${NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH}"
252- "-DNBL_BUILD_INFO=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
253- "-DNBL_OUTPUT_FILE=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
254- "-DNBL_OUTPUT_EXE_OVERRIDE=$<PATH:NORMAL_PATH,${NBL_DOCKER_CT_NSC_VOLUME_TARGET}/${NBL_PACKAGE_RUNTIME_EXE_DIR_PATH}/${NBL_NSC_PREINSTALL_TARGET_EXE_FILENAME}>"
255- -P "${NBL_ROOT_PATH}/cmake/scripts/nbl/nablaBuildInfo.cmake"
256- COMMAND_ERROR_IS_FATAL ANY)
280+ execute_process(COMMAND "@CMAKE_COMMAND@"
281+ "-DNBL_EXECUTABLE_PATH=@NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH@"
282+ "-DNBL_BUILD_INFO=@NBL_NSC_PREINSTALL_TARGET_BUILD_INFO@"
283+ "-DNBL_OUTPUT_FILE=@NBL_NSC_PREINSTALL_TARGET_BUILD_INFO@"
284+ "-DNBL_OUTPUT_EXE_OVERRIDE=$<PATH:NORMAL_PATH,@NBL_DOCKER_CT_NSC_VOLUME_TARGET@/@NBL_PACKAGE_RUNTIME_EXE_DIR_PATH@/@NBL_NSC_PREINSTALL_TARGET_EXE_FILENAME@>"
285+ -P "@NBL_ROOT_PATH@/cmake/scripts/nbl/nablaBuildInfo.cmake"
286+ COMMAND_ERROR_IS_FATAL ANY
287+ )
257288
258289message(STATUS "Generating NSC godbolt config")
259- execute_process(COMMAND "${CMAKE_COMMAND}"
260- "-DSPIRV_DIS_EXE=spirv-dis.exe"
261- "-DNSC_RELEASE_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
262- "-DNSC_RELWITHDEBINFO_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/relwithdebinfo/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
263- "-DNSC_DEBUG_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/debug/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
264- "-DOUTPUT_CONFIG_FILE=${OUTPUT_CONFIG_FILE}"
265- -P "${CMAKE_CURRENT_SOURCE_DIR}/ce-generate-config.cmake"
266- COMMAND_ERROR_IS_FATAL ANY)
290+ execute_process(COMMAND "@CMAKE_COMMAND@"
291+ "-DSPIRV_DIS_EXE=spirv-dis.exe"
292+ "-DNSC_RELEASE_BUILD_INFO=$<PATH:NORMAL_PATH,@NBL_NSC_PREINSTALL_DIRECTORY@/@NBL_RELATIVE_ENTRY@/@NBL_NSC_BUILD_INFO_FILENAME@>"
293+ "-DNSC_RELWITHDEBINFO_BUILD_INFO=$<PATH:NORMAL_PATH,@NBL_NSC_PREINSTALL_DIRECTORY@/relwithdebinfo/@NBL_RELATIVE_ENTRY@/@NBL_NSC_BUILD_INFO_FILENAME@>"
294+ "-DNSC_DEBUG_BUILD_INFO=$<PATH:NORMAL_PATH,@NBL_NSC_PREINSTALL_DIRECTORY@/debug/@NBL_RELATIVE_ENTRY@/@NBL_NSC_BUILD_INFO_FILENAME@>"
295+ "-DOUTPUT_CONFIG_FILE=@OUTPUT_CONFIG_FILE@"
296+ -P "@CMAKE_CURRENT_SOURCE_DIR@/ce-generate-config.cmake"
297+ COMMAND_ERROR_IS_FATAL ANY
298+ )
267299
268300message(STATUS "Updating NSC package context")
269- execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different
270- "$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}>"
271- "${NBL_DOCKER_CTX_DIR}/Nabla"
272- COMMAND_ERROR_IS_FATAL ANY)
301+ execute_process(COMMAND "@CMAKE_COMMAND@" -E copy_directory_if_different
302+ "$<PATH:NORMAL_PATH,@NBL_NSC_PREINSTALL_DIRECTORY@>"
303+ "@NBL_DOCKER_CTX_DIR@/Nabla"
304+ COMMAND_ERROR_IS_FATAL ANY
305+ )
273306
274307message(STATUS "Building NSC Godbolt image")
275- execute_process(COMMAND "${DOCKER_EXE}" build --isolation process
276- -f "${DOCKERFILE}"
277- -t ${NSC_IMAGE_NAME}
278- "${NBL_DOCKER_CTX_DIR}"
279- COMMAND_ERROR_IS_FATAL ANY)
308+ string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%dT%H:%M:%SZ" UTC)
309+ execute_process(COMMAND "@DOCKER_EXE@" build --isolation process
310+ --label=org.opencontainers.image.created="${BUILD_TIMESTAMP}"
311+ -f "@DOCKERFILE@" -t @NSC_IMAGE_NAME@ "@NBL_DOCKER_CTX_DIR@"
312+ COMMAND_ERROR_IS_FATAL ANY
313+ )
280314
281315message(STATUS "Running new NSC orphan container")
282- execute_process(COMMAND "${DOCKER_EXE}" run -di -p ${NBL_CE_PUBLISH_PORT}:10240 --isolation process
283- --name "${ORPHAN}" --network docker_default
284- -v $<PATH:NORMAL_PATH,${ICU_DIR}:${ICU_DIR}:ro>
285- -v $<PATH:NORMAL_PATH,C:/Windows/System32:C:/mount/Windows/System32:ro>
286- ${NSC_IMAGE_NAME}
287- COMMAND_ERROR_IS_FATAL ANY)
316+ execute_process(COMMAND "@DOCKER_EXE@" run -di -p @NBL_CE_PUBLISH_PORT@:10240 --isolation process
317+ --name "@ORPHAN@" --network docker_default
318+ -v $<PATH:NORMAL_PATH,@ICU_DIR@:@ICU_DIR@:ro>
319+ -v $<PATH:NORMAL_PATH,C:/Windows/System32:C:/mount/Windows/System32:ro>
320+ @NSC_IMAGE_NAME@
321+ COMMAND_ERROR_IS_FATAL ANY
322+ )
288323
289324message(STATUS "Healthy check")
290- execute_process(COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_HEALTHY_CHECK_PY}"
291- --url "${NBL_CE_URL}" --interval 5 --ticks 12
292- COMMAND_ERROR_IS_FATAL ANY)
325+ execute_process(COMMAND "@_Python3_EXECUTABLE@" "@NBL_CE_HEALTHY_CHECK_PY@"
326+ --url "@NBL_CE_URL@" --interval 5 --ticks 12
327+ COMMAND_ERROR_IS_FATAL ANY
328+ )
293329
294330message(STATUS "Post Basic NSC shader compile check")
295- execute_process(COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_ENDPOINT_PY}"
296- --url "${NBL_CE_URL}"
297- --endpoint /api/compiler/nsc_$<LOWER_CASE:$<CONFIG>>_upstream/compile
298- --method POST --json "${NBL_NSC_BASIC_HLSL_JPAYLOAD}"
299- COMMAND_ERROR_IS_FATAL ANY)
331+ execute_process(COMMAND "@_Python3_EXECUTABLE@" "@NBL_CE_ENDPOINT_PY@"
332+ --url "@NBL_CE_URL@"
333+ --endpoint /api/compiler/nsc_$<LOWER_CASE:$<CONFIG>>_upstream/compile
334+ --method POST --json "@NBL_NSC_BASIC_HLSL_JPAYLOAD@"
335+ COMMAND_ERROR_IS_FATAL ANY
336+ )
300337
301338message(STATUS "Printing NSC container logs")
302- execute_process(COMMAND "${DOCKER_EXE}" logs "${ORPHAN}" COMMAND_ERROR_IS_FATAL ANY)
339+ execute_process(COMMAND "@DOCKER_EXE@"
340+ logs "@ORPHAN@"
341+ COMMAND_ERROR_IS_FATAL ANY
342+ )
303343
304344message(STATUS "OK! NSC container is healthy.")
305- message(STATUS "Type \"${ NBL_CE_URL} \" in your browser to use NSC with Godbolt!")
306- ]=] INSTRUCTIONS)
345+ message(STATUS "Type \"@ NBL_CE_URL@ \" in your browser to use NSC with Godbolt!")
346+ ]=] INSTRUCTIONS @ONLY )
307347
308- file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR} /run-compiler-explorer-$<CONFIG>.cmake" CONTENT "${INSTRUCTIONS} " )
348+ set (SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR} /run-compiler-explorer-$<CONFIG>.cmake" )
349+ file (GENERATE OUTPUT ${SCRIPT_FILE} CONTENT "${INSTRUCTIONS} " )
309350
310351add_custom_target (run-compiler-explorer ALL
311- COMMAND "${CMAKE_COMMAND} " -P " ${CMAKE_CURRENT_BINARY_DIR} /run-compiler-explorer-$<CONFIG>.cmake"
352+ COMMAND "${CMAKE_COMMAND} " -P ${SCRIPT_FILE}
312353 VERBATIM
313354 COMMAND_EXPAND_LISTS
314355)
0 commit comments