Skip to content

Commit e3848ce

Browse files
committed
Make docker in docker build, adjust tools/nsc/CMakeLists.txt, update build-nabla.yml to produce NSC image from builder container
1 parent 27c50d7 commit e3848ce

File tree

3 files changed

+96
-64
lines changed

3 files changed

+96
-64
lines changed

.github/workflows/build-nabla.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ jobs:
5454
5555
- name: Run Container
5656
run: |
57+
$ctx = docker context show
58+
$dockerHost = (docker context inspect $ctx | ConvertFrom-Json).Endpoints.docker.Host
59+
$pipeName = [regex]::Match($dockerHost, '/pipe/(?<n>.+)$').Groups['n'].Value
60+
$pipeHost = "\\.\pipe\$pipeName"
61+
5762
docker run `
5863
--entrypoint ${{ env.entry }} -di --isolation process `
5964
--env-file .\docker\ci-windows.env `
@@ -87,7 +92,7 @@ jobs:
8792
docker exec orphan `
8893
${{ env.entry }} ${{ env.cmd }} -Command cmake --build `
8994
--preset ci-build-dynamic-${{ matrix.vendor }} `
90-
-t nsc --config ${{ matrix.config }}
95+
-t run-compiler-explorer --config ${{ matrix.config }}
9196
9297
- name: Container – Install NSC
9398
run: |

CMakePresets.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,17 @@
9191
"inherits": "ci-configure-static-windows-base",
9292
"generator": "Ninja Multi-Config",
9393
"cacheVariables": {
94-
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/docker/msvc-winsdk/cmake/winsdk-msvc-toolchain.cmake"
94+
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/docker/msvc-winsdk/cmake/winsdk-msvc-toolchain.cmake",
95+
"NBL_ENABLE_DOCKER_INTEGRATION": "ON"
9596
}
9697
},
9798
{
9899
"name": "ci-configure-dynamic-msvc",
99100
"inherits": "ci-configure-dynamic-windows-base",
100101
"generator": "Ninja Multi-Config",
101102
"cacheVariables": {
102-
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/docker/msvc-winsdk/cmake/winsdk-msvc-toolchain.cmake"
103+
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/docker/msvc-winsdk/cmake/winsdk-msvc-toolchain.cmake",
104+
"NBL_ENABLE_DOCKER_INTEGRATION": "ON"
103105
}
104106
},
105107
{

tools/nsc/CMakeLists.txt

Lines changed: 86 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,23 @@ find_program(DOCKER_EXE NAMES docker REQUIRED)
6666

6767
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)
6868

69-
find_file(ICU_DLL NAMES icu.dll HINTS REQUIRED)
70-
set(ICU_GLOBALIZATION_DIR "C:/Windows/Globalization/ICU")
71-
find_file(ICUDTL_DAT NAMES icudtl.dat HINTS "${ICU_GLOBALIZATION_DIR}" REQUIRED)
72-
69+
set(ICU_GLOBALIZATION_DIR C:\\Windows\\Globalization\\ICU)
7370
find_file(UCRTBASED_DLL NAMES ucrtbased.dll HINTS ${UCRTBASED_DLL_DIR} REQUIRED)
7471

7572
find_program(SPIRV_DIS_EXE NAMES spirv-dis HINTS "${VULKAN_SDK}/Bin" REQUIRED)
7673
cmake_path(GET SPIRV_DIS_EXE PARENT_PATH SPIRV_DIS_DIR)
7774
cmake_path(NATIVE_PATH SPIRV_DIS_DIR NORMALIZE SPIRV_DIS_DIR)
7875

7976
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()
82+
message(FATAL_ERROR "Could not find MSVC_REDIST_DIR, define yourself!")
83+
endif()
84+
endif()
85+
8086
cmake_path(NATIVE_PATH MSVC_REDIST_DIR NORMALIZE TOOLSET_REDIST_PATH)
8187

8288
file(GLOB_RECURSE VC_MODULES LIST_DIRECTORIES false
@@ -92,11 +98,9 @@ make_directory("${NBL_DOCKER_CTX_DIR}/Runtimes")
9298
make_directory("${NBL_DOCKER_CTX_DIR}/Nabla")
9399
execute_process(
94100
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"
96101
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${UCRTBASED_DLL}" "${NBL_DOCKER_CTX_DIR}/Runtimes"
97102
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${SPIRV_DIS_EXE}" "${NBL_DOCKER_CTX_DIR}/Runtimes"
98103
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"
100104
)
101105

102106
set(CT_RUNTIMES C:/runtimes)
@@ -107,15 +111,17 @@ cmake_path(NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_SOURCE NORMALIZE NBL_DOCKER_CT_N
107111
cmake_path(NATIVE_PATH NBL_DOCKER_CT_NSC_VOLUME_TARGET NORMALIZE NBL_DOCKER_CT_NSC_VOLUME_TARGET)
108112
cmake_path(NATIVE_PATH NBL_NSC_PREINSTALL_DIRECTORY NORMALIZE NBL_NSC_PREINSTALL_DIRECTORY)
109113

114+
set(CORE_IMAGE mcr.microsoft.com/windows/servercore:ltsc2022)
110115
string(CONFIGURE [=[
111116
# syntax=docker/dockerfile:1
112117
# escape=`
113118
114119
# ---------------- COMPRESS STEP ----------------
115120
FROM @BASE_IMAGE@ as compress
116121
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/
117124
COPY --link Runtimes/ C:/pack/Windows/System32/
118-
COPY --link Globalization/ICU/ C:/pack/Windows/Globalization/ICU/
119125
COPY --link Nabla/ C:/pack/runtimes/Nabla/
120126
121127
ARG IMPL_COMPRESSION_OPTIONS=-T0
@@ -134,7 +140,8 @@ COPY --link --from=compress ["C:/pack/nabla-artifacts.tar.zst", "C:/pack/"]
134140
COPY hlsl.local.properties.cmake C:/Compiler-Explorer/etc/config/hlsl.local.properties
135141
136142
ENV NBL_INSTALL_DIRECTORY=@NBL_DOCKER_CT_NSC_VOLUME_TARGET@ `
137-
NBL_EXPLICIT_MODULE_LOAD_LOG=ON
143+
NBL_EXPLICIT_MODULE_LOAD_LOG=ON `
144+
ICU_DATA=C:\Windows\Globalization\ICU
138145
139146
WORKDIR C:/Compiler-Explorer
140147
ENTRYPOINT ["C:\\unpack.bat", "&&", "node", "--no-warnings", "--no-deprecation", "--import=tsx", "./app.js", "--language", "hlsl"]
@@ -147,27 +154,9 @@ if(NOT DEFINED NSC_IMAGE_NAME)
147154
set(NSC_IMAGE_NAME nano/godbolt/nsc)
148155
endif()
149156

150-
set(NBL_BUILD_INFO_POSTPROCESS_COMMAND
151-
"${CMAKE_COMMAND}"
152-
"-DNBL_EXECUTABLE_PATH=${NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH}"
153-
"-DNBL_BUILD_INFO=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
154-
"-DNBL_OUTPUT_FILE=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
155-
"-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}>"
156-
-P "${NBL_ROOT_PATH}/cmake/scripts/nbl/nablaBuildInfo.cmake"
157-
)
158-
159157
set(NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT "${NBL_DOCKER_CTX_DIR}/hlsl.local.properties.cmake")
160158
string(GENEX_STRIP "${NBL_PACKAGE_RUNTIME_EXE_DIR_PATH}" NBL_RELATIVE_ENTRY)
161159
set(OUTPUT_CONFIG_FILE $<PATH:NORMAL_PATH,${NBL_DOCKER_NSC_COMPILER_CONFIG_OUTPUT}>)
162-
set(NBL_CE_GENERATE_CONFIG_COMMAND
163-
"${CMAKE_COMMAND}"
164-
"-DSPIRV_DIS_EXE=spirv-dis.exe"
165-
"-DNSC_RELEASE_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
166-
"-DNSC_RELWITHDEBINFO_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/relwithdebinfo/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
167-
"-DNSC_DEBUG_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/debug/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
168-
"-DOUTPUT_CONFIG_FILE=${OUTPUT_CONFIG_FILE}"
169-
-P "${CMAKE_CURRENT_SOURCE_DIR}/ce-generate-config.cmake"
170-
)
171160

172161
function(PROMOTE_PROCESS_ISOLATION HOST_KERNEL BASE VAR)
173162
set(${VAR} True)
@@ -209,52 +198,88 @@ string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+" HOST_KERNEL "${PIPE}")
209198
PROMOTE_PROCESS_ISOLATION(${HOST_KERNEL} ${BASE_IMAGE} USE_PROCESS_ISOLATION)
210199

211200
if(USE_PROCESS_ISOLATION)
212-
set(ISOLATION --isolation process)
201+
set(ISOLATION "--isolation process")
213202
else()
214-
# TODO: we will need to use GET_RUNTIME_DEPENDENCIES which uses objdump
203+
# NOTE: we would need to use GET_RUNTIME_DEPENDENCIES which uses objdump
215204
# https://cmake.org/cmake/help/latest/command/file.html#get-runtime-dependencies
216-
# to collect *all* required deps and copy (FROM at least server core) to destination
205+
# to collect *all* missing deps and copy (FROM at least server core) to destination nano
217206
# image, it will fail currently if we fully isolate it with VM due to lack of certain DLLs
218-
message(FATAL_ERROR "HyperV is NOT supported! Update your OS!") # yet
207+
message(FATAL_ERROR "HyperV is NOT supported! Update your OS!")
219208
endif()
220209

221210
set(ORPHAN nsc-orphan)
222-
set(NBL_CE_URL http://localhost:80)
211+
set(NBL_CE_URL http://${ORPHAN}:10240)
223212
set(NBL_CE_HEALTHY_CHECK_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/ce_healthy_check.py")
224213
set(NBL_CE_ENDPOINT_PY "${NBL_ROOT_PATH}/docker/compiler-explorer/endpoint.py")
225214
set(NBL_NSC_BASIC_HLSL_JPAYLOAD "${CMAKE_CURRENT_SOURCE_DIR}/docker/godbolt/hlsl-basic-compile-payload.json")
226215

227-
add_custom_target(run-compiler-explorer ALL
228-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Killing remaining NSC orphans"
229-
COMMAND "${DOCKER_EXE}" rm -f ${ORPHAN} || "${CMAKE_COMMAND}" -E true
230-
231-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Executing CTests"
232-
COMMAND "${CTEST_EXE}" -C $<CONFIG> --stop-on-failure
233-
234-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Generating NSC build info"
235-
COMMAND ${NBL_BUILD_INFO_POSTPROCESS_COMMAND}
236-
237-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Generating NSC godbolt config"
238-
COMMAND ${NBL_CE_GENERATE_CONFIG_COMMAND}
239-
240-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Updating NSC package context"
241-
COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different "${NBL_NSC_PREINSTALL_DIRECTORY}" "${NBL_DOCKER_CTX_DIR}/Nabla"
242-
243-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Building NSC Godbolt image"
244-
COMMAND "${DOCKER_EXE}" build ${ISOLATION} -f "${DOCKERFILE}" -t ${NSC_IMAGE_NAME} "${NBL_DOCKER_CTX_DIR}"
245-
246-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Running new NSC orphan container"
247-
COMMAND "${DOCKER_EXE}" run -di -p 80:10240 ${ISOLATION} --name ${ORPHAN} ${NSC_IMAGE_NAME}
248-
COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_HEALTHY_CHECK_PY}" --url "${NBL_CE_URL}" --interval 5 --ticks 12
249-
COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --green "Compiler Explorer is running, type \"localhost\" in your browser!"
250-
251-
COMMAND "${CMAKE_COMMAND}" -E cmake_echo_color --blue "Post-Checking if NSC container is able to compile basic shader input..."
252-
COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_ENDPOINT_PY}" --url "${NBL_CE_URL}" --endpoint /api/compiler/nsc_$<LOWER_CASE:$<CONFIG>>_upstream/compile --method POST --json "${NBL_NSC_BASIC_HLSL_JPAYLOAD}"
253-
COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --green "OK! NSC container is healthy."
216+
# to avoid "too long input" errors we proxy build instructions to CMake script and write it to build directory
217+
string(CONFIGURE [=[
218+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Killing remaining NSC orphans")
219+
execute_process(COMMAND "${DOCKER_EXE}" rm -f "${ORPHAN}")
220+
221+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Executing CTests")
222+
execute_process(COMMAND "${CTEST_EXE}" -C "$<CONFIG>" --stop-on-failure WORKING_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@"
223+
COMMAND_ERROR_IS_FATAL ANY)
224+
225+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Generating NSC build info")
226+
execute_process(COMMAND "${CMAKE_COMMAND}"
227+
"-DNBL_EXECUTABLE_PATH=${NBL_NSC_PREINSTALL_TARGET_EXE_FILEPATH}"
228+
"-DNBL_BUILD_INFO=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
229+
"-DNBL_OUTPUT_FILE=${NBL_NSC_PREINSTALL_TARGET_BUILD_INFO}"
230+
"-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}>"
231+
-P "${NBL_ROOT_PATH}/cmake/scripts/nbl/nablaBuildInfo.cmake"
232+
COMMAND_ERROR_IS_FATAL ANY)
233+
234+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Generating NSC godbolt config")
235+
execute_process(COMMAND "${CMAKE_COMMAND}"
236+
"-DSPIRV_DIS_EXE=spirv-dis.exe"
237+
"-DNSC_RELEASE_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
238+
"-DNSC_RELWITHDEBINFO_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/relwithdebinfo/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
239+
"-DNSC_DEBUG_BUILD_INFO=$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}/debug/${NBL_RELATIVE_ENTRY}/${NBL_NSC_BUILD_INFO_FILENAME}>"
240+
"-DOUTPUT_CONFIG_FILE=${OUTPUT_CONFIG_FILE}"
241+
-P "${CMAKE_CURRENT_SOURCE_DIR}/ce-generate-config.cmake"
242+
COMMAND_ERROR_IS_FATAL ANY)
243+
244+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Updating NSC package context")
245+
execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different
246+
"$<PATH:NORMAL_PATH,${NBL_NSC_PREINSTALL_DIRECTORY}>"
247+
"${NBL_DOCKER_CTX_DIR}/Nabla"
248+
COMMAND_ERROR_IS_FATAL ANY)
249+
250+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Building NSC Godbolt image")
251+
execute_process(COMMAND "${DOCKER_EXE}" build ${ISOLATION}
252+
-f "${DOCKERFILE}"
253+
-t ${NSC_IMAGE_NAME}
254+
"${NBL_DOCKER_CTX_DIR}"
255+
COMMAND_ERROR_IS_FATAL ANY)
256+
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}
260+
COMMAND_ERROR_IS_FATAL ANY)
261+
262+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Health‐check")
263+
execute_process(COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_HEALTHY_CHECK_PY}"
264+
--url "${NBL_CE_URL}" --interval 5 --ticks 12
265+
COMMAND_ERROR_IS_FATAL ANY)
266+
267+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "Post‐Checking basic shader compile")
268+
execute_process(COMMAND "${_Python3_EXECUTABLE}" "${NBL_CE_ENDPOINT_PY}"
269+
--url "${NBL_CE_URL}"
270+
--endpoint /api/compiler/nsc_$<LOWER_CASE:$<CONFIG>>_upstream/compile
271+
--method POST --json "${NBL_NSC_BASIC_HLSL_JPAYLOAD}"
272+
COMMAND_ERROR_IS_FATAL ANY)
273+
274+
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "OK! NSC container is healthy.")
275+
]=] INSTRUCTIONS)
276+
277+
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/run-compiler-explorer-$<CONFIG>.cmake" CONTENT "${INSTRUCTIONS}")
254278

255-
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
256-
VERBATIM
257-
USES_TERMINAL
279+
add_custom_target(run-compiler-explorer ALL
280+
COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/run-compiler-explorer-$<CONFIG>.cmake"
281+
VERBATIM
282+
COMMAND_EXPAND_LISTS
258283
)
259284

260285
add_dependencies(run-compiler-explorer nsc)

0 commit comments

Comments
 (0)