@@ -109,8 +109,13 @@ function(moonlight_run_nxdk_command description nxdk_dir working_directory)
109109 _moonlight_shell_quote (_quoted_nxdk_dir "${_msys_nxdk_dir} " )
110110 _moonlight_shell_quote (_quoted_working_directory "${_msys_working_directory} " )
111111
112- set (_shell_script
113- "unset MAKEFLAGS MFLAGS GNUMAKEFLAGS MAKELEVEL; export NXDK_DIR=${_quoted_nxdk_dir} ; export PATH=\" $NXDK_DIR/bin:$PATH\" ; cd ${_quoted_working_directory} ; exec ${_shell_command} " )
112+ string (CONCAT _shell_script
113+ "unset MAKEFLAGS MFLAGS GNUMAKEFLAGS MAKELEVEL; "
114+ "export NXDK_DIR=${_quoted_nxdk_dir} ; "
115+ "export PATH=\" $NXDK_DIR/bin:$PATH\" ; "
116+ "cd ${_quoted_working_directory} ; "
117+ "exec ${_shell_command} "
118+ )
114119
115120 execute_process (
116121 COMMAND "${_msys2_shell} " -defterm -here -no-start -mingw64 -c "${_shell_script} "
@@ -134,128 +139,162 @@ function(moonlight_run_nxdk_command description nxdk_dir working_directory)
134139 endif ()
135140endfunction ()
136141
142+ # Run make inside the nxdk environment with the platform-appropriate make tool.
137143function (_moonlight_run_nxdk_make nxdk_dir description )
138144 if (WIN32 )
139- set (_make_program make)
145+ set (make_program make)
140146 else ()
141- _moonlight_get_xbox_make_program (_make_program )
147+ _moonlight_get_xbox_make_program (make_program )
148+ endif ()
149+
150+ moonlight_run_nxdk_command ("${description} " "${nxdk_dir} " "${nxdk_dir} " "${make_program} " ${ARGN} )
151+ endfunction ()
152+
153+ # Report whether any listed output path is missing.
154+ function (_moonlight_has_missing_output out_var )
155+ set (missing_output FALSE )
156+
157+ foreach (required_output IN LISTS ARGN)
158+ if (NOT EXISTS "${required_output} " )
159+ set (missing_output TRUE )
160+ break ()
161+ endif ()
162+ endforeach ()
163+
164+ set (${out_var} "${missing_output} " PARENT_SCOPE )
165+ endfunction ()
166+
167+ # Build the vendored cxbe tool when it is missing.
168+ function (_moonlight_prepare_cxbe nxdk_dir cxbe_path )
169+ if (EXISTS "${cxbe_path} " )
170+ return ()
171+ endif ()
172+
173+ message (STATUS "Preparing cxbe at ${nxdk_dir} " )
174+ if (WIN32 )
175+ moonlight_run_nxdk_command ("cxbe build" "${nxdk_dir} " "${nxdk_dir} /tools/cxbe" make )
176+ return ()
177+ endif ()
178+
179+ _moonlight_get_xbox_make_program (host_make_program )
180+ moonlight_run_nxdk_command ("cxbe build" "${nxdk_dir} " "${nxdk_dir} /tools/cxbe" "${host_make_program} " )
181+ endfunction ()
182+
183+ # Configure and build the vendored extract-xiso tool when it is missing.
184+ function (_moonlight_prepare_extract_xiso nxdk_dir source_dir build_dir output_path )
185+ if (EXISTS "${output_path} " )
186+ return ()
142187 endif ()
143188
144- moonlight_run_nxdk_command ("${description} " "${nxdk_dir} " "${nxdk_dir} " "${_make_program} " ${ARGN} )
189+ message (STATUS "Preparing extract-xiso at ${nxdk_dir} " )
190+ file (REMOVE_RECURSE "${build_dir} " )
191+ file (MAKE_DIRECTORY "${build_dir} " )
192+ moonlight_run_nxdk_command (
193+ "extract-xiso configure"
194+ "${nxdk_dir} "
195+ "${nxdk_dir} "
196+ "${CMAKE_COMMAND} "
197+ -S "${source_dir} "
198+ -B "${build_dir} "
199+ -G "Unix Makefiles"
200+ )
201+ moonlight_run_nxdk_command (
202+ "extract-xiso build"
203+ "${nxdk_dir} "
204+ "${nxdk_dir} "
205+ "${CMAKE_COMMAND} "
206+ --build "${build_dir} "
207+ )
208+ endfunction ()
209+
210+ # Build the vendored host-side nxdk tools required by the Moonlight Xbox build.
211+ function (_moonlight_prepare_nxdk_tools nxdk_dir cxbe_path source_dir build_dir output_path )
212+ _moonlight_prepare_cxbe ("${nxdk_dir} " "${cxbe_path} " )
213+ _moonlight_prepare_extract_xiso (
214+ "${nxdk_dir} "
215+ "${source_dir} "
216+ "${build_dir} "
217+ "${output_path} "
218+ )
145219endfunction ()
146220
221+ # Bootstrap the vendored nxdk outputs required by the host-first Moonlight build.
147222function (moonlight_prepare_nxdk nxdk_dir state_dir )
148223 file (MAKE_DIRECTORY "${state_dir} " )
149224
150- set (_signature_inputs
225+ set (signature_inputs
151226 "NXDK_DIR=${nxdk_dir} "
152227 "HOST_SYSTEM=${CMAKE_HOST_SYSTEM_NAME} "
153228 "NXDK_TOOLCHAIN=${nxdk_dir} /share/toolchain-nxdk.cmake"
154229 "NXDK_ENV_MODE=cmake-driver"
155230 )
156- list (JOIN _signature_inputs "\n " _signature_text )
157- string (SHA256 _signature "${_signature_text } " )
158-
159- set (_signature_file "${state_dir} /bootstrap.signature" )
160- set (_cxbe_path "${nxdk_dir} /tools/cxbe/cxbe" )
161- set (_extract_xiso_source_dir "${nxdk_dir} /tools/extract-xiso" )
162- set (_extract_xiso_build_dir "${_extract_xiso_source_dir } /build" )
163- set (_extract_xiso_path "${_extract_xiso_build_dir } /extract-xiso" )
164- set (_required_libraries
231+ list (JOIN signature_inputs "\n " signature_text )
232+ string (SHA256 signature "${signature_text } " )
233+
234+ set (signature_file "${state_dir} /bootstrap.signature" )
235+ set (cxbe_path "${nxdk_dir} /tools/cxbe/cxbe" )
236+ set (extract_xiso_source_dir "${nxdk_dir} /tools/extract-xiso" )
237+ set (extract_xiso_build_dir "${extract_xiso_source_dir } /build" )
238+ set (extract_xiso_path "${extract_xiso_build_dir } /extract-xiso" )
239+ set (required_libraries
165240 "${nxdk_dir} /lib/libnxdk.lib"
166241 "${nxdk_dir} /lib/libc++.lib"
167242 "${nxdk_dir} /lib/libSDL2.lib"
168243 "${nxdk_dir} /lib/libSDL2_image.lib"
169244 )
170- set (_required_tools
171- "${_cxbe_path } "
172- "${_extract_xiso_path } "
245+ set (required_tools
246+ "${cxbe_path } "
247+ "${extract_xiso_path } "
173248 )
174249
175250 if (MOONLIGHT_FORCE_NXDK_DISTCLEAN)
176- set (_need_distclean TRUE )
251+ set (need_distclean TRUE )
177252 else ()
178- set (_need_distclean FALSE )
253+ set (need_distclean FALSE )
179254 endif ()
180- set (_need_prepare_libraries FALSE )
181- set (_need_prepare_tools FALSE )
182255
183- if (NOT EXISTS "${_signature_file } " )
184- set (_need_distclean TRUE )
256+ if (NOT EXISTS "${signature_file } " )
257+ set (need_distclean TRUE )
185258 else ()
186- file (READ "${_signature_file } " _saved_signature )
187- string (STRIP "${_saved_signature } " _saved_signature )
188- if (NOT _saved_signature STREQUAL _signature )
189- set (_need_distclean TRUE )
259+ file (READ "${signature_file } " saved_signature )
260+ string (STRIP "${saved_signature } " saved_signature )
261+ if (NOT saved_signature STREQUAL signature )
262+ set (need_distclean TRUE )
190263 endif ()
191264 endif ()
192265
193- foreach (_required_output IN LISTS _required_libraries)
194- if (NOT EXISTS "${_required_output} " )
195- set (_need_prepare_libraries TRUE )
196- break ()
197- endif ()
198- endforeach ()
266+ _moonlight_has_missing_output (need_prepare_libraries ${required_libraries} )
267+ _moonlight_has_missing_output (need_prepare_tools ${required_tools} )
199268
200- foreach (_required_output IN LISTS _required_tools)
201- if (NOT EXISTS "${_required_output} " )
202- set (_need_prepare_tools TRUE )
203- break ()
204- endif ()
205- endforeach ()
206-
207- if (_need_distclean)
269+ if (need_distclean)
208270 message (STATUS "Cleaning nxdk build tree at ${nxdk_dir} " )
209271 _moonlight_run_nxdk_make ("${nxdk_dir} " "nxdk clean" clean )
210- set (_need_prepare_libraries TRUE )
272+ set (need_prepare_libraries TRUE )
211273 endif ()
212274
213- if (_need_prepare_libraries )
275+ if (need_prepare_libraries )
214276 message (STATUS "Preparing nxdk libraries at ${nxdk_dir} " )
215277 _moonlight_run_nxdk_make ("${nxdk_dir} " "nxdk bootstrap" NXDK_ONLY=y )
216278 else ()
217279 message (STATUS "Using existing nxdk library outputs from ${nxdk_dir} " )
218280 endif ()
219281
220- if (_need_prepare_tools)
221- if (NOT EXISTS "${_cxbe_path} " )
222- message (STATUS "Preparing cxbe at ${nxdk_dir} " )
223- if (WIN32 )
224- moonlight_run_nxdk_command ("cxbe build" "${nxdk_dir} " "${nxdk_dir} /tools/cxbe" make )
225- else ()
226- _moonlight_get_xbox_make_program (_host_make_program )
227- moonlight_run_nxdk_command ("cxbe build" "${nxdk_dir} " "${nxdk_dir} /tools/cxbe" "${_host_make_program} " )
228- endif ()
229- endif ()
230-
231- if (NOT EXISTS "${_extract_xiso_path} " )
232- message (STATUS "Preparing extract-xiso at ${nxdk_dir} " )
233- file (REMOVE_RECURSE "${_extract_xiso_build_dir} " )
234- file (MAKE_DIRECTORY "${_extract_xiso_build_dir} " )
235- moonlight_run_nxdk_command (
236- "extract-xiso configure"
237- "${nxdk_dir} "
238- "${nxdk_dir} "
239- "${CMAKE_COMMAND} "
240- -S "${_extract_xiso_source_dir} "
241- -B "${_extract_xiso_build_dir} "
242- -G "Unix Makefiles"
243- )
244- moonlight_run_nxdk_command (
245- "extract-xiso build"
246- "${nxdk_dir} "
247- "${nxdk_dir} "
248- "${CMAKE_COMMAND} "
249- --build "${_extract_xiso_build_dir} "
250- )
251- endif ()
282+ if (need_prepare_tools)
283+ _moonlight_prepare_nxdk_tools (
284+ "${nxdk_dir} "
285+ "${cxbe_path} "
286+ "${extract_xiso_source_dir} "
287+ "${extract_xiso_build_dir} "
288+ "${extract_xiso_path} "
289+ )
252290 else ()
253291 message (STATUS "Using existing nxdk tool outputs from ${nxdk_dir} " )
254292 endif ()
255293
256- file (WRITE "${_signature_file } " "${_signature } \n " )
294+ file (WRITE "${signature_file } " "${signature } \n " )
257295endfunction ()
258296
297+ # Configure the internal Xbox child build and expose it as the moonlight_xbox target.
259298function (moonlight_add_xbox_build )
260299 set (options)
261300 set (oneValueArgs BINARY_DIR NXDK_DIR)
@@ -269,11 +308,11 @@ function(moonlight_add_xbox_build)
269308 message (FATAL_ERROR "moonlight_add_xbox_build requires NXDK_DIR" )
270309 endif ()
271310
272- _moonlight_get_xbox_make_program (_xbox_make_program )
311+ _moonlight_get_xbox_make_program (xbox_make_program )
273312
274- set (_toolchain_file "${MOONLIGHT_XBOX_NXDK_DIR} /share/toolchain-nxdk.cmake" )
275- set (_driver_script "${CMAKE_SOURCE_DIR} /cmake/run-child-build.cmake" )
276- set (_configure_command
313+ set (toolchain_file "${MOONLIGHT_XBOX_NXDK_DIR} /share/toolchain-nxdk.cmake" )
314+ set (driver_script "${CMAKE_SOURCE_DIR} /cmake/run-child-build.cmake" )
315+ set (configure_command
277316 "${CMAKE_COMMAND} "
278317 -DMOONLIGHT_COMMAND_MODE:STRING =configure
279318 -DMOONLIGHT_CMAKE_COMMAND:FILEPATH =${CMAKE_COMMAND}
@@ -282,25 +321,25 @@ function(moonlight_add_xbox_build)
282321 -DMOONLIGHT_SOURCE_DIR :PATH =${CMAKE_SOURCE_DIR}
283322 -DMOONLIGHT_BINARY_DIR :PATH =${MOONLIGHT_XBOX_BINARY_DIR}
284323 -DMOONLIGHT_WORKING_DIRECTORY:PATH =${CMAKE_SOURCE_DIR}
285- -DMOONLIGHT_MAKE_PROGRAM:FILEPATH =${_xbox_make_program }
286- -DMOONLIGHT_TOOLCHAIN_FILE:FILEPATH =${_toolchain_file }
324+ -DMOONLIGHT_MAKE_PROGRAM:FILEPATH =${xbox_make_program }
325+ -DMOONLIGHT_TOOLCHAIN_FILE:FILEPATH =${toolchain_file }
287326 -DMOONLIGHT_BUILD_TYPE:STRING =${CMAKE_BUILD_TYPE}
288- -P "${_driver_script } "
327+ -P "${driver_script } "
289328 )
290- set (_build_command
329+ set (build_command
291330 "${CMAKE_COMMAND} "
292331 -DMOONLIGHT_COMMAND_MODE:STRING =build
293332 -DMOONLIGHT_CMAKE_COMMAND:FILEPATH =${CMAKE_COMMAND}
294333 -DMOONLIGHT_DESCRIPTION:STRING =Build Xbox child target
295334 -DMOONLIGHT_NXDK_DIR:PATH =${MOONLIGHT_XBOX_NXDK_DIR}
296335 -DMOONLIGHT_BINARY_DIR :PATH =${MOONLIGHT_XBOX_BINARY_DIR}
297336 -DMOONLIGHT_WORKING_DIRECTORY:PATH =${MOONLIGHT_XBOX_BINARY_DIR}
298- -P "${_driver_script } "
337+ -P "${driver_script } "
299338 )
300339
301340 add_custom_target (moonlight_xbox ALL
302- COMMAND ${_configure_command }
303- COMMAND ${_build_command }
341+ COMMAND ${configure_command }
342+ COMMAND ${build_command }
304343 BYPRODUCTS
305344 "${MOONLIGHT_XBOX_BINARY_DIR} /Moonlight.iso"
306345 "${MOONLIGHT_XBOX_BINARY_DIR} /xbe/default.xbe"
0 commit comments