@@ -9,6 +9,8 @@ set(NBL_NSC_PREINSTALL_DIRECTORY "${GODBOLT_BINARY_PRETEST_DIRECTORY}/.preinstal
9
9
make_directory ("${NBL_NSC_PREINSTALL_DIRECTORY} " )
10
10
11
11
set (NBL_DOCKER_CT_NSC_VOLUME_SOURCE "${GODBOLT_BINARY_DIRECTORY} /install" )
12
+ set (NBL_DOCKER_CTX_DIR "${GODBOLT_BINARY_DIRECTORY} /.ctx" )
13
+ make_directory ("${NBL_DOCKER_CTX_DIR} " )
12
14
13
15
set (NBL_DOCKER_INSTALL_BAT_FILENAME install -production.bat )
14
16
set (NBL_DOCKER_CT_NSC_INSTALL_BAT "${NBL_DOCKER_CT_NSC_VOLUME_SOURCE} /${NBL_DOCKER_INSTALL_BAT_FILENAME} " )
@@ -57,61 +59,80 @@ add_test(NAME NBL_NSC_DUMP_BUILD_INFO_TEST
57
59
58
60
if (NBL_ENABLE_DOCKER_INTEGRATION )
59
61
62
+ set (BASE_IMAGE ghcr.io/devsh-graphics-programming/compiler-explorer-docker:nano-2022 )
63
+
60
64
find_program (CTEST_EXE NAMES ctest REQUIRED )
61
65
find_program (DOCKER_EXE NAMES docker REQUIRED )
62
66
63
67
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 )
64
- cmake_path (GET DXIL_DLL PARENT_PATH DXIL_DIR )
65
- cmake_path (NATIVE_PATH DXIL_DIR NORMALIZE DXIL_DIR )
66
68
67
69
find_file (ICU_DLL NAMES icu.dll HINTS REQUIRED )
68
- cmake_path (GET ICU_DLL PARENT_PATH ICU_DIR )
69
- cmake_path (NATIVE_PATH ICU_DIR NORMALIZE ICU_DIR )
70
70
set (ICU_GLOBALIZATION_DIR "C:/Windows/Globalization/ICU" )
71
71
find_file (ICUDTL_DAT NAMES icudtl.dat HINTS "${ICU_GLOBALIZATION_DIR} " REQUIRED )
72
72
73
73
find_file (UCRTBASED_DLL NAMES ucrtbased.dll HINTS ${UCRTBASED_DLL_DIR} REQUIRED )
74
- cmake_path (GET UCRTBASED_DLL PARENT_PATH UCRTBASED_DIR )
75
- cmake_path (NATIVE_PATH UCRTBASED_DIR NORMALIZE UCRTBASED_DIR )
76
74
77
75
find_program (SPIRV_DIS_EXE NAMES spirv-dis HINTS "${VULKAN_SDK} /Bin" REQUIRED )
78
76
cmake_path (GET SPIRV_DIS_EXE PARENT_PATH SPIRV_DIS_DIR )
79
77
cmake_path (NATIVE_PATH SPIRV_DIS_DIR NORMALIZE SPIRV_DIS_DIR )
80
78
79
+ include (InstallRequiredSystemLibraries )
81
80
cmake_path (NATIVE_PATH MSVC_REDIST_DIR NORMALIZE TOOLSET_REDIST_PATH )
82
81
83
82
file (GLOB_RECURSE VC_MODULES LIST_DIRECTORIES false
84
83
"${TOOLSET_REDIST_PATH} /x64/*.CRT/*.dll"
85
84
"${TOOLSET_REDIST_PATH} /debug_nonredist/x64/*.DebugCRT/*.dll"
86
85
)
87
86
88
- foreach (MODULE ${VC_MODULES} )
89
- get_filename_component (DIR ${MODULE} DIRECTORY )
90
- cmake_path (NATIVE_PATH DIR NORMALIZE DIR )
91
- list (APPEND VC_MODULE_DIRS ${DIR} )
92
- endforeach ()
93
-
94
- if (NOT VC_MODULE_DIRS )
87
+ if (NOT VC_MODULES )
95
88
message (FATAL_ERROR "Failed to GLOB for VC Redist modules!" )
96
89
endif ()
97
90
91
+ make_directory ("${NBL_DOCKER_CTX_DIR} /Runtimes" )
92
+ make_directory ("${NBL_DOCKER_CTX_DIR} /Nabla" )
93
+ execute_process (
94
+ COMMAND "${CMAKE_COMMAND} " -E copy_if_different "${DXIL_DLL} " "${NBL_DOCKER_CTX_DIR} /Runtimes"
95
+ COMMAND "${CMAKE_COMMAND} " -E copy_if_different "${ICU_DLL} " "${NBL_DOCKER_CTX_DIR} /Runtimes"
96
+ COMMAND "${CMAKE_COMMAND} " -E copy_if_different "${UCRTBASED_DLL} " "${NBL_DOCKER_CTX_DIR} /Runtimes"
97
+ COMMAND "${CMAKE_COMMAND} " -E copy_if_different "${SPIRV_DIS_EXE} " "${NBL_DOCKER_CTX_DIR} /Runtimes"
98
+ COMMAND "${CMAKE_COMMAND} " -E copy_if_different ${VC_MODULES} "${NBL_DOCKER_CTX_DIR} /Runtimes"
99
+ COMMAND "${CMAKE_COMMAND} " -E copy_directory_if_different ${ICU_GLOBALIZATION_DIR} "${NBL_DOCKER_CTX_DIR} /Globalization/ICU"
100
+ )
101
+
98
102
set (CT_RUNTIMES C:/pack/runtimes )
99
103
cmake_path (NATIVE_PATH CT_RUNTIMES NORMALIZE CT_RUNTIMES )
100
- set (HOST_MOUNT_DIRS ${VC_MODULE_DIRS} ${SPIRV_DIS_DIR} ${UCRTBASED_DIR} ${DXIL_DIR} ${ICU_DIR} )
101
- list (REMOVE_DUPLICATES HOST_MOUNT_DIRS )
102
104
103
- set (ix 0 )
104
- foreach (DIR ${HOST_MOUNT_DIRS} )
105
- set (TARGET_MOUNT_DIR "${CT_RUNTIMES} /system/${ix} " )
106
- cmake_path (NATIVE_PATH TARGET_MOUNT_DIR NORMALIZE TARGET_MOUNT_DIR )
105
+ set (NBL_DOCKER_CT_NSC_VOLUME_TARGET "${CT_RUNTIMES} /Nabla" )
106
+ cmake_path (NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_SOURCE NORMALIZE NBL_DOCKER_CT_NSC_VOLUME_SOURCE )
107
+ cmake_path (NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_TARGET NORMALIZE NBL_DOCKER_CT_NSC_VOLUME_TARGET )
108
+ cmake_path (NATIVE_PATH NBL_NSC_PREINSTALL_DIRECTORY NORMALIZE NBL_NSC_PREINSTALL_DIRECTORY )
109
+
110
+ string (CONFIGURE [=[
111
+ # syntax=docker/dockerfile:1
112
+ # escape=`
113
+ FROM @BASE_IMAGE@
114
+ USER ContainerAdministrator
107
115
108
- list ( APPEND DOCKER_CLI_ARGS -v " ${DIR} : ${TARGET_MOUNT_DIR} :ro" )
109
- list ( APPEND CT_MOUNT_DIRS " ${TARGET_MOUNT_DIR} " )
116
+ COPY Runtimes/ C:/Windows/System32/
117
+ COPY Globalization/ICU/ C:/Windows/Globalization/ICU/
110
118
111
- math (EXPR ix "${ix} + 1" OUTPUT_FORMAT DECIMAL )
112
- endforeach ()
119
+ COPY Nabla/ @NBL_DOCKER_CT_NSC_VOLUME_TARGET@
120
+ COPY hlsl.local.properties.cmake C:/Compiler-Explorer/etc/config/hlsl.local.properties
121
+
122
+ ENV NBL_INSTALL_DIRECTORY=@NBL_DOCKER_CT_NSC_VOLUME_TARGET@ `
123
+ NBL_EXPLICIT_MODULE_LOAD_LOG=ON
124
+
125
+ WORKDIR C:/Compiler-Explorer
126
+ ENTRYPOINT ["node", "--no-warnings", "--no-deprecation", "--import=tsx", "./app.js", "--language", "hlsl"]
127
+ ]=] INSTRUCTIONS @ONLY )
128
+
129
+ set (DOCKERFILE "${NBL_DOCKER_CTX_DIR} /Dockerfile" )
130
+ file (WRITE "${DOCKERFILE} " "${INSTRUCTIONS} " )
131
+
132
+ if (NOT DEFINED NSC_IMAGE_NAME )
133
+ set (NSC_IMAGE_NAME nano/godbolt/nsc )
134
+ endif ()
113
135
114
- set (NBL_DOCKER_CT_NSC_VOLUME_TARGET "${CT_RUNTIMES} /Nabla" )
115
136
set (NBL_BUILD_INFO_POSTPROCESS_COMMAND
116
137
"${CMAKE_COMMAND} "
117
138
"-DNBL_EXECUTABLE_PATH=${NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH} "
@@ -120,13 +141,8 @@ set(NBL_BUILD_INFO_POSTPROCESS_COMMAND
120
141
"-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} >"
121
142
-P "${NBL_ROOT_PATH} /cmake/scripts/nbl/nablaBuildInfo.cmake"
122
143
)
123
- cmake_path (NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_SOURCE NORMALIZE NBL_DOCKER_CT_NSC_VOLUME_SOURCE )
124
- cmake_path (NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_TARGET NORMALIZE NBL_DOCKER_CT_NSC_VOLUME_TARGET )
125
- cmake_path (NATIVE_PATH NBL_NSC_PREINSTALL_DIRECTORY NORMALIZE NBL_NSC_PREINSTALL_DIRECTORY )
126
- list (APPEND DOCKER_CLI_ARGS -v "${NBL_NSC_PREINSTALL_DIRECTORY} :${NBL_DOCKER_CT_NSC_VOLUME_TARGET} " )
127
- #list(APPEND DOCKER_CLI_ARGS -v "${ICU_GLOBALIZATION_DIR}:${ICU_GLOBALIZATION_DIR}:ro")
128
144
129
- set (NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT "${NBL_DOCKER_CT_NSC_VOLUME_SOURCE } /hlsl.local.properties.cmake" )
145
+ set (NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT "${NBL_DOCKER_CTX_DIR } /hlsl.local.properties.cmake" )
130
146
string (GENEX_STRIP "${NBL_PACKAGE_RUNTIME_EXE_DIR_PATH} " NBL_RELATIVE_ENTRY )
131
147
set (OUTPUT_CONFIG_FILE $< PATH:NORMAL_PATH,${NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT} > )
132
148
set (NBL_CE_GENERATE_CONFIG_COMMAND
@@ -139,25 +155,6 @@ set(NBL_CE_GENERATE_CONFIG_COMMAND
139
155
-P "${CMAKE_CURRENT_SOURCE_DIR} /ce-generate-config.cmake"
140
156
)
141
157
142
- set (CT_ENV_FILE "${CMAKE_CURRENT_BINARY_DIR} /.env" )
143
- string (CONFIGURE [=[
144
- CT_MOUNT_DIRS=@CT_MOUNT_DIRS@
145
- NBL_INSTALL_DIRECTORY=@NBL_DOCKER_CT_NSC_VOLUME_TARGET@
146
- NBL_EXPLICIT_MODULE_LOAD_LOG=ON
147
- ]=] ENV_CONTENT @ONLY )
148
- file (WRITE "${CT_ENV_FILE} " "${ENV_CONTENT} " )
149
- list (APPEND DOCKER_CLI_ARGS --env-file "${CT_ENV_FILE} " )
150
-
151
- set (CT_SETUP_FILE "${CMAKE_CURRENT_BINARY_DIR} /setup.bat" )
152
- string (CONFIGURE [=[
153
- @echo off
154
- set "PATH=%PATH%;%CT_MOUNT_DIRS%"
155
- setx PATH "%PATH%" /M
156
- node --no-warnings --no-deprecation --import=tsx ./app.js --language hlsl
157
- ]=] SETUP_CONTENT @ONLY )
158
- file (WRITE "${CT_SETUP_FILE} " "${SETUP_CONTENT} " )
159
- list (APPEND DOCKER_CLI_ARGS )
160
-
161
158
function (PROMOTE_PROCESS_ISOLATION HOST_KERNEL BASE VAR )
162
159
set (${VAR} True )
163
160
@@ -172,9 +169,9 @@ function(PROMOTE_PROCESS_ISOLATION HOST_KERNEL BASE VAR)
172
169
macro (TO_PROCESS IMAGE TARGET_KERNEL )
173
170
if (${HOST_KERNEL} VERSION_LESS ${TARGET_KERNEL} )
174
171
set (${VAR} False )
175
- message (STATUS "Host kernel \" ${HOST_KERNEL} \" version too low to promote process isolation for \" ${IMAGE} \" [${TARGET_KERNEL} ] and requires falling back to HyperV. Please update your host OS." )
172
+ message (STATUS "Host kernel \" ${HOST_KERNEL} \" version too low to promote process isolation with \" ${IMAGE} \" [${TARGET_KERNEL} ] and requires falling back to HyperV. Please update your host OS." )
176
173
else ()
177
- message (STATUS "Promoting \" ${IMAGE} \" [${TARGET_KERNEL} ] to process isolation with host kernel [${HOST_KERNEL} ] version" )
174
+ message (STATUS "\" ${IMAGE} \" [${TARGET_KERNEL} ] can be promoted to process isolation with host kernel [${HOST_KERNEL} ] version" )
178
175
endif ()
179
176
endmacro ()
180
177
@@ -195,12 +192,16 @@ endfunction()
195
192
196
193
execute_process (COMMAND cmd /C ver OUTPUT_VARIABLE PIPE OUTPUT_STRIP_TRAILING_WHITESPACE )
197
194
string (REGEX MATCH "[0-9]+\\ .[0-9]+\\ .[0-9]+\\ .[0-9]+" HOST_KERNEL "${PIPE} " )
198
-
199
- set (BASE_IMAGE ghcr.io/devsh-graphics-programming/compiler-explorer-docker:nano-2022 )
200
195
PROMOTE_PROCESS_ISOLATION (${HOST_KERNEL} ${BASE_IMAGE} USE_PROCESS_ISOLATION )
201
196
202
197
if (USE_PROCESS_ISOLATION )
203
- list (APPEND DOCKER_CLI_ARGS --isolation process )
198
+ set (ISOLATION --isolation process )
199
+ else ()
200
+ # TODO: we will need to use GET_RUNTIME_DEPENDENCIES which uses objdump
201
+ # https://cmake.org/cmake/help/latest/command/file.html#get-runtime-dependencies
202
+ # to collect *all* required deps and copy (FROM at least server core) to destination
203
+ # image, it will fail currently if we fully isolate it with VM due to lack of certain DLLs
204
+ message (FATAL_ERROR "HyperV is NOT supported! Update your OS!" ) # yet
204
205
endif ()
205
206
206
207
set (ORPHAN nsc-orphan )
@@ -210,20 +211,27 @@ set(NBL_CE_ENDPOINT_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/endpoint.py")
210
211
set (NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR} /docker/godbolt/hlsl-basic-compile-payload.json" )
211
212
212
213
add_custom_target (run-compiler-explorer ALL
213
- COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Clearing NSC orphans.. "
214
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Killing remaining NSC orphans"
214
215
COMMAND "${DOCKER_EXE} " rm -f ${ORPHAN} || "${CMAKE_COMMAND} " -E true
215
216
216
- COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Executing CTests.. "
217
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Executing CTests"
217
218
COMMAND "${CTEST_EXE} " -C $< CONFIG> --stop-on-failure
219
+
220
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Generating NSC build info"
218
221
COMMAND ${NBL_BUILD_INFO_POSTPROCESS_COMMAND}
222
+
223
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Generating NSC godbolt config"
219
224
COMMAND ${NBL_CE_GENERATE_CONFIG_COMMAND}
220
225
221
- COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Running new NSC orphan container.."
222
- COMMAND "${DOCKER_EXE} " run -di -p 80:10240 --name ${ORPHAN} --entrypoint cmd ${DOCKER_CLI_ARGS} ${BASE_IMAGE}
223
- COMMAND "${DOCKER_EXE} " cp "${OUTPUT_CONFIG_FILE} " ${ORPHAN} :C:\\ Compiler-Explorer\\ etc\\ config\\ hlsl.local.properties
224
- COMMAND "${DOCKER_EXE} " cp "${CT_SETUP_FILE} " ${ORPHAN} :C:\\ setup.cmd
225
- COMMAND "${DOCKER_EXE} " exec -d ${ORPHAN} C:\\ setup.cmd
226
- COMMAND "${_Python3_EXECUTABLE} " "${NBL_CE_HEALTHY_CHECK_PY} " --url "${NBL_CE_URL} " --interval 5 --ticks 25
226
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Updating NSC package context"
227
+ COMMAND "${CMAKE_COMMAND} " -E copy_directory_if_different "${NBL_NSC_PREINSTALL_DIRECTORY} " "${NBL_DOCKER_CTX_DIR} /Nabla"
228
+
229
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Building NSC Godbolt image"
230
+ COMMAND "${DOCKER_EXE} " build ${ISOLATION} -f "${DOCKERFILE} " -t ${NSC_IMAGE_NAME} "${NBL_DOCKER_CTX_DIR} "
231
+
232
+ COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Running new NSC orphan container"
233
+ COMMAND "${DOCKER_EXE} " run -di -p 80:10240 ${ISOLATION} --name ${ORPHAN} ${NSC_IMAGE_NAME}
234
+ COMMAND "${_Python3_EXECUTABLE} " "${NBL_CE_HEALTHY_CHECK_PY} " --url "${NBL_CE_URL} " --interval 5 --ticks 12
227
235
COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --green "Compiler Explorer is running, type \" localhost\" in your browser!"
228
236
229
237
COMMAND "${CMAKE_COMMAND} " -E cmake_echo_color --blue "Post-Checking if NSC container is able to compile basic shader input..."
0 commit comments