@@ -59,11 +59,82 @@ add_test(NAME NBL_NSC_DUMP_BUILD_INFO_TEST
59
59
60
60
if (NBL_ENABLE_DOCKER_INTEGRATION )
61
61
62
+ find_program (DOCKER_EXE NAMES docker REQUIRED )
62
63
set (BASE_IMAGE ghcr.io/devsh-graphics-programming/compiler-explorer-docker:nano-2022 )
64
+ set (CORE_IMAGE mcr.microsoft.com/windows/servercore:ltsc2022 )
63
65
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
+ )
66
125
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 )
67
138
find_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 )
68
139
69
140
set (ICU_GLOBALIZATION_DIR C:\\ Windows\\ Globalization\\ ICU )
@@ -144,6 +215,11 @@ ENTRYPOINT [ `
144
215
"copy", "C:\\mount\\Windows\\System32\\icu.dll", "C:\\Windows\\System32\\icu.dll", "&&", `
145
216
"node", "--no-warnings", "--no-deprecation", "--import=tsx", "./app.js", "--language", "hlsl" `
146
217
]
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
+
147
223
]=] INSTRUCTIONS @ONLY )
148
224
149
225
set (DOCKERFILE "${NBL_DOCKER_CTX_DIR} /Dockerfile" )
@@ -157,58 +233,6 @@ set(NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT "${NBL_DOCKER_CTX_DIR}/hlsl.local.prop
157
233
string (GENEX_STRIP "${NBL_PACKAGE_RUNTIME_EXE_DIR_PATH} " NBL_RELATIVE_ENTRY )
158
234
set (OUTPUT_CONFIG_FILE $< PATH:NORMAL_PATH,${NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT} > )
159
235
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 )
212
236
set (ICU_DIR C:\\ Windows\\ Globalization\\ ICU )
213
237
set (ICU_DLL C:\\ Windows\\ System32\\ icu.dll )
214
238
if (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
240
264
# to avoid "too long input" errors we proxy build instructions to CMake script and write it to build directory
241
265
string (CONFIGURE [=[
242
266
message(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
+ )
244
271
245
272
message(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
+ )
248
278
249
279
message(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
+ )
257
288
258
289
message(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
+ )
267
299
268
300
message(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
+ )
273
306
274
307
message(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
+ )
280
314
281
315
message(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
+ )
288
323
289
324
message(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
+ )
293
329
294
330
message(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
+ )
300
337
301
338
message(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
+ )
303
343
304
344
message(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 )
307
347
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} " )
309
350
310
351
add_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}
312
353
VERBATIM
313
354
COMMAND_EXPAND_LISTS
314
355
)
0 commit comments