Skip to content

Commit 7917918

Browse files
committed
finalize NSC image production from CMake, leave a few comments regarding HyperV runner
1 parent 862d92f commit 7917918

File tree

1 file changed

+70
-62
lines changed

1 file changed

+70
-62
lines changed

tools/nsc/CMakeLists.txt

Lines changed: 70 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ set(NBL_NSC_PREINSTALL_DIRECTORY "${GODBOLT_BINARY_PRETEST_DIRECTORY}/.preinstal
99
make_directory("${NBL_NSC_PREINSTALL_DIRECTORY}")
1010

1111
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}")
1214

1315
set(NBL_DOCKER_INSTALL_BAT_FILENAME install-production.bat)
1416
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
5759

5860
if(NBL_ENABLE_DOCKER_INTEGRATION)
5961

62+
set(BASE_IMAGE ghcr.io/devsh-graphics-programming/compiler-explorer-docker:nano-2022)
63+
6064
find_program(CTEST_EXE NAMES ctest REQUIRED)
6165
find_program(DOCKER_EXE NAMES docker REQUIRED)
6266

6367
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)
6668

6769
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)
7070
set(ICU_GLOBALIZATION_DIR "C:/Windows/Globalization/ICU")
7171
find_file(ICUDTL_DAT NAMES icudtl.dat HINTS "${ICU_GLOBALIZATION_DIR}" REQUIRED)
7272

7373
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)
7674

7775
find_program(SPIRV_DIS_EXE NAMES spirv-dis HINTS "${VULKAN_SDK}/Bin" REQUIRED)
7876
cmake_path(GET SPIRV_DIS_EXE PARENT_PATH SPIRV_DIS_DIR)
7977
cmake_path(NATIVE_PATH SPIRV_DIS_DIR NORMALIZE SPIRV_DIS_DIR)
8078

79+
include(InstallRequiredSystemLibraries)
8180
cmake_path(NATIVE_PATH MSVC_REDIST_DIR NORMALIZE TOOLSET_REDIST_PATH)
8281

8382
file(GLOB_RECURSE VC_MODULES LIST_DIRECTORIES false
8483
"${TOOLSET_REDIST_PATH}/x64/*.CRT/*.dll"
8584
"${TOOLSET_REDIST_PATH}/debug_nonredist/x64/*.DebugCRT/*.dll"
8685
)
8786

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)
9588
message(FATAL_ERROR "Failed to GLOB for VC Redist modules!")
9689
endif()
9790

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+
98102
set(CT_RUNTIMES C:/pack/runtimes)
99103
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)
102104

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
107115
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/
110118
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()
113135

114-
set(NBL_DOCKER_CT_NSC_VOLUME_TARGET "${CT_RUNTIMES}/Nabla")
115136
set(NBL_BUILD_INFO_POSTPROCESS_COMMAND
116137
"${CMAKE_COMMAND}"
117138
"-DNBL_EXECUTABLE_PATH=${NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH}"
@@ -120,13 +141,8 @@ set(NBL_BUILD_INFO_POSTPROCESS_COMMAND
120141
"-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}>"
121142
-P "${NBL_ROOT_PATH}/cmake/scripts/nbl/nablaBuildInfo.cmake"
122143
)
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")
128144

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")
130146
string(GENEX_STRIP "${NBL_PACKAGE_RUNTIME_EXE_DIR_PATH}" NBL_RELATIVE_ENTRY)
131147
set(OUTPUT_CONFIG_FILE $<PATH:NORMAL_PATH,${NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT}>)
132148
set(NBL_CE_GENERATE_CONFIG_COMMAND
@@ -139,25 +155,6 @@ set(NBL_CE_GENERATE_CONFIG_COMMAND
139155
-P "${CMAKE_CURRENT_SOURCE_DIR}/ce-generate-config.cmake"
140156
)
141157

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-
161158
function(PROMOTE_PROCESS_ISOLATION HOST_KERNEL BASE VAR)
162159
set(${VAR} True)
163160

@@ -172,9 +169,9 @@ function(PROMOTE_PROCESS_ISOLATION HOST_KERNEL BASE VAR)
172169
macro(TO_PROCESS IMAGE TARGET_KERNEL)
173170
if(${HOST_KERNEL} VERSION_LESS ${TARGET_KERNEL})
174171
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.")
176173
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")
178175
endif()
179176
endmacro()
180177

@@ -195,12 +192,16 @@ endfunction()
195192

196193
execute_process(COMMAND cmd /C ver OUTPUT_VARIABLE PIPE OUTPUT_STRIP_TRAILING_WHITESPACE)
197194
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)
200195
PROMOTE_PROCESS_ISOLATION(${HOST_KERNEL} ${BASE_IMAGE} USE_PROCESS_ISOLATION)
201196

202197
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
204205
endif()
205206

206207
set(ORPHAN nsc-orphan)
@@ -210,20 +211,27 @@ set(NBL_CE_ENDPOINT_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/endpoint.py")
210211
set(NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/hlsl-basic-compile-payload.json")
211212

212213
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"
214215
COMMAND "${DOCKER_EXE}" rm -f ${ORPHAN} || "${CMAKE_COMMAND}" -E true
215216

216-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Executing CTests.."
217+
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Executing CTests"
217218
COMMAND "${CTEST_EXE}" -C $<CONFIG> --stop-on-failure
219+
220+
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Generating NSC build info"
218221
COMMAND ${NBL_BUILD_INFO_POSTPROCESS_COMMAND}
222+
223+
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Generating NSC godbolt config"
219224
COMMAND ${NBL_CE_GENERATE_CONFIG_COMMAND}
220225

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
227235
COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --green "Compiler Explorer is running, type \"localhost\" in your browser!"
228236

229237
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Post-Checking if NSC container is able to compile basic shader input..."

0 commit comments

Comments
 (0)