From fdf9345d5de1c951603e5da3ee8454e9efe2dc28 Mon Sep 17 00:00:00 2001 From: skal Date: Wed, 11 Feb 2026 08:19:05 +0100 Subject: refactor: Modularize CMake build system into 10 specialized modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor monolithic 866-line CMakeLists.txt into 54-line orchestrator + 10 modules: - DemoOptions.cmake - Build option declarations - DemoConfig.cmake - Option implications and platform detection - DemoCommon.cmake - Shared macros (conditional sources, size opts, linking) - DemoDependencies.cmake - External library discovery (WGPU, GLFW) - DemoSourceLists.cmake - Conditional source file lists - DemoLibraries.cmake - Subsystem library targets - DemoTools.cmake - Build tools (asset_packer, compilers) - DemoCodegen.cmake - Code generation (assets, timeline, music) - DemoExecutables.cmake - Main binaries (demo64k, test_demo) - DemoTests.cmake - Test infrastructure (36 tests) - Validation.cmake - Uniform buffer validation Benefits: - 94% reduction in main file size (866 → 54 lines) - Conditional module inclusion (tests only parsed if DEMO_BUILD_TESTS=ON) - Shared macros eliminate 200+ lines of repetition - Clear separation of concerns All 36 tests passing. All build modes verified. Documentation: Created doc/CMAKE_MODULES.md with module architecture. Co-Authored-By: Claude Sonnet 4.5 --- cmake/DemoTests.cmake | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 cmake/DemoTests.cmake (limited to 'cmake/DemoTests.cmake') diff --git a/cmake/DemoTests.cmake b/cmake/DemoTests.cmake new file mode 100644 index 0000000..69ba5f6 --- /dev/null +++ b/cmake/DemoTests.cmake @@ -0,0 +1,270 @@ +# Tests Configuration +# Extracted from main CMakeLists.txt + +add_demo_test(test_window HammingWindowTest audio src/tests/audio/test_window.cc ${GEN_DEMO_CC}) +target_link_libraries(test_window PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_window generate_demo_assets) + +add_demo_test(test_maths MathUtilsTest util src/tests/util/test_maths.cc) + +add_demo_test(test_file_watcher FileWatcherTest util src/tests/util/test_file_watcher.cc) +target_link_libraries(test_file_watcher PRIVATE util ${DEMO_LIBS}) + +add_demo_test(test_synth SynthEngineTest audio src/tests/audio/test_synth.cc ${GEN_DEMO_CC}) +target_link_libraries(test_synth PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_synth generate_demo_assets) + +add_demo_test(test_dct DctTest audio src/tests/audio/test_dct.cc ${GEN_DEMO_CC}) +target_link_libraries(test_dct PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_dct generate_demo_assets) + +add_demo_test(test_fft FftTest audio src/tests/audio/test_fft.cc ${GEN_DEMO_CC}) +target_link_libraries(test_fft PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_fft generate_demo_assets) + +add_demo_test(test_spectral_brush SpectralBrushTest audio src/tests/audio/test_spectral_brush.cc ${GEN_DEMO_CC}) +target_link_libraries(test_spectral_brush PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_spectral_brush generate_demo_assets) + +add_demo_test(test_audio_gen AudioGenTest audio src/tests/audio/test_audio_gen.cc ${GEN_DEMO_CC}) +target_link_libraries(test_audio_gen PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_audio_gen generate_demo_assets) + +add_demo_test(test_audio_backend AudioBackendTest audio src/tests/audio/test_audio_backend.cc ${GEN_DEMO_CC}) +target_link_libraries(test_audio_backend PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_audio_backend generate_demo_assets) + +add_demo_test(test_silent_backend SilentBackendTest audio src/tests/audio/test_silent_backend.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_silent_backend PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_silent_backend generate_demo_assets generate_tracker_music) + +add_demo_test(test_mock_backend MockAudioBackendTest audio src/tests/audio/test_mock_backend.cc src/audio/backend/mock_audio_backend.cc ${GEN_DEMO_CC}) +target_link_libraries(test_mock_backend PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_mock_backend generate_demo_assets) + +add_demo_test(test_wav_dump WavDumpBackendTest audio src/tests/audio/test_wav_dump.cc src/audio/backend/wav_dump_backend.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_wav_dump PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_wav_dump generate_demo_assets generate_tracker_music) + +add_demo_test(test_jittered_audio JitteredAudioBackendTest audio src/tests/audio/test_jittered_audio.cc src/audio/backend/jittered_audio_backend.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_jittered_audio PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_jittered_audio generate_demo_assets generate_tracker_music) + +add_demo_test(test_tracker_timing TrackerTimingTest audio src/tests/audio/test_tracker_timing.cc src/audio/backend/mock_audio_backend.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_tracker_timing PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_tracker_timing generate_demo_assets generate_tracker_music) + +add_demo_test(test_variable_tempo VariableTempoTest audio src/tests/audio/test_variable_tempo.cc src/audio/backend/mock_audio_backend.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_variable_tempo PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_variable_tempo generate_demo_assets generate_tracker_music) + +add_demo_test(test_tracker TrackerSystemTest audio src/tests/audio/test_tracker.cc ${GEN_DEMO_CC} ${GENERATED_TEST_DEMO_MUSIC_CC}) +target_link_libraries(test_tracker PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_tracker generate_demo_assets generate_test_demo_music) + +add_demo_test(test_audio_engine AudioEngineTest audio src/tests/audio/test_audio_engine.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_audio_engine PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_audio_engine generate_demo_assets generate_tracker_music) + +add_demo_test(test_shader_assets ShaderAssetValidation gpu src/tests/gpu/test_shader_assets.cc ${GEN_DEMO_CC}) +target_link_libraries(test_shader_assets PRIVATE util procedural ${DEMO_LIBS}) +add_dependencies(test_shader_assets generate_demo_assets) + +add_demo_test(test_shader_compilation ShaderCompilationTest gpu src/tests/gpu/test_shader_compilation.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC}) +target_link_libraries(test_shader_compilation PRIVATE gpu util procedural ${DEMO_LIBS}) +add_dependencies(test_shader_compilation generate_demo_assets) + +add_demo_test(test_noise_functions NoiseFunctionsTest gpu src/tests/gpu/test_noise_functions.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC}) +target_link_libraries(test_noise_functions PRIVATE gpu util procedural ${DEMO_LIBS}) +add_dependencies(test_noise_functions generate_demo_assets) + +add_demo_test(test_uniform_helper UniformHelperTest gpu src/tests/gpu/test_uniform_helper.cc) +target_link_libraries(test_uniform_helper PRIVATE gpu util ${DEMO_LIBS}) + +add_demo_executable(test_spectool src/tests/gpu/test_spectool.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_compile_definitions(test_spectool PRIVATE DEMO_BUILD_TOOLS) +target_link_libraries(test_spectool PRIVATE audio util procedural ${DEMO_LIBS}) +add_dependencies(test_spectool generate_tracker_music generate_demo_assets) + +add_demo_test(test_assets AssetManagerTest assets src/tests/assets/test_assets.cc ${GEN_TEST_CC}) +target_include_directories(test_assets PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src/generated_test) +target_compile_definitions(test_assets PRIVATE USE_TEST_ASSETS) +target_link_libraries(test_assets PRIVATE util procedural ${DEMO_LIBS}) +add_dependencies(test_assets generate_test_assets) +set_source_files_properties(src/tests/assets/test_assets.cc PROPERTIES COMPILE_DEFINITIONS "USE_TEST_ASSETS") + +add_demo_test(test_sequence SequenceSystemTest assets src/tests/assets/test_sequence.cc ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${PLATFORM_SOURCES}) +target_link_libraries(test_sequence PRIVATE 3d gpu util procedural ${DEMO_LIBS}) +add_dependencies(test_sequence generate_timeline generate_demo_assets) + +add_demo_test(test_procedural ProceduralGenTest util src/tests/util/test_procedural.cc) +target_link_libraries(test_procedural PRIVATE procedural ${DEMO_LIBS}) + +add_demo_test(test_physics PhysicsTest 3d src/tests/3d/test_physics.cc) +target_link_libraries(test_physics PRIVATE 3d util procedural ${DEMO_LIBS}) + +add_demo_test(test_3d ThreeDSystemTest 3d src/tests/3d/test_3d.cc) + +add_demo_test(test_shader_composer ShaderComposerTest gpu src/tests/gpu/test_shader_composer.cc ${GEN_TEST_CC}) +target_compile_definitions(test_shader_composer PRIVATE USE_TEST_ASSETS) +target_include_directories(test_shader_composer PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src/generated_test ${CORE_INCLUDES}) +target_link_libraries(test_shader_composer PRIVATE gpu util procedural ${DEMO_LIBS}) +add_dependencies(test_shader_composer generate_test_assets) + + +add_demo_executable(test_3d_render src/tests/3d/test_3d_render.cc ${PLATFORM_SOURCES} ${GENERATED_TIMELINE_CC} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_3d_render PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_3d_render generate_timeline generate_demo_assets generate_tracker_music) + +add_demo_executable(test_3d_physics src/tests/3d/test_3d_physics.cc ${PLATFORM_SOURCES} ${GENERATED_TIMELINE_CC} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_3d_physics PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_3d_physics generate_timeline generate_demo_assets generate_tracker_music) + +add_demo_executable(test_mesh src/tests/3d/test_mesh.cc ${PLATFORM_SOURCES} ${GENERATED_TIMELINE_CC} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_mesh PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_mesh generate_timeline generate_demo_assets generate_tracker_music) + +add_demo_executable(test_platform src/tests/test_platform.cc ${PLATFORM_SOURCES}) +target_link_libraries(test_platform PRIVATE util ${DEMO_LIBS}) + +add_demo_executable(test_scene_loader src/tests/3d/test_scene_loader.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC}) +target_link_libraries(test_scene_loader PRIVATE 3d util procedural ${DEMO_LIBS}) +add_dependencies(test_scene_loader generate_demo_assets) +add_test(NAME SceneLoaderTest COMMAND test_scene_loader) +set_tests_properties(SceneLoaderTest PROPERTIES LABELS "3d") + +# GPU Effects Test Infrastructure (Phase 1: Foundation) +add_demo_test(test_effect_base EffectBaseTest gpu + src/tests/gpu/test_effect_base.cc + src/tests/common/webgpu_test_fixture.cc + src/tests/common/offscreen_render_target.cc + src/tests/common/effect_test_helpers.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC} + ${GENERATED_TIMELINE_CC} + ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_effect_base PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_effect_base generate_timeline generate_demo_assets generate_tracker_music) + +# GPU Effects Test Infrastructure (Phase 2.1: Effect Classes) +add_demo_test(test_demo_effects DemoEffectsTest gpu + src/tests/gpu/test_demo_effects.cc + src/tests/common/webgpu_test_fixture.cc + src/tests/common/offscreen_render_target.cc + src/tests/common/effect_test_helpers.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC} + ${GENERATED_TIMELINE_CC} + ${GENERATED_MUSIC_DATA_CC}) +target_link_libraries(test_demo_effects PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_demo_effects generate_timeline generate_demo_assets generate_tracker_music) + +# GPU Effects Test Infrastructure (Phase 2.2: Post-Process Utilities) +add_demo_test(test_post_process_helper PostProcessHelperTest gpu + src/tests/gpu/test_post_process_helper.cc + src/tests/common/webgpu_test_fixture.cc + src/tests/common/offscreen_render_target.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC}) +target_link_libraries(test_post_process_helper PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_post_process_helper generate_demo_assets) + +# TextureManager tests +add_demo_test(test_texture_manager TextureManagerTest gpu + src/tests/gpu/test_texture_manager.cc + src/tests/common/webgpu_test_fixture.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC}) +target_link_libraries(test_texture_manager PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_texture_manager generate_demo_assets) + +# GPU Procedural Texture Test +add_demo_test(test_gpu_procedural GpuProceduralTest gpu + src/tests/gpu/test_gpu_procedural.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC}) +target_link_libraries(test_gpu_procedural PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_gpu_procedural generate_demo_assets) + +# CNN shader testing tool +add_executable(cnn_test + tools/cnn_test.cc + src/tests/common/webgpu_test_fixture.cc + src/tests/common/offscreen_render_target.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC}) + +target_include_directories(cnn_test PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/third_party + ${CMAKE_CURRENT_BINARY_DIR}/src/generated + ${CORE_INCLUDES}) + +target_link_libraries(cnn_test PRIVATE + gpu util procedural ${DEMO_LIBS}) + +add_dependencies(cnn_test generate_demo_assets) + +# Define STB_IMAGE macros +target_compile_definitions(cnn_test PRIVATE + STB_IMAGE_IMPLEMENTATION + STB_IMAGE_WRITE_IMPLEMENTATION) + +# GPU Composite Texture Test (Phase 4) +add_demo_test(test_gpu_composite GpuCompositeTest gpu + src/tests/gpu/test_gpu_composite.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC}) +target_link_libraries(test_gpu_composite PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +add_dependencies(test_gpu_composite generate_demo_assets) + +# Gantt chart output test (bash script) +add_test( + NAME GanttOutputTest + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/test_gantt_output.sh + $ + ${CMAKE_CURRENT_SOURCE_DIR}/assets/test_gantt.seq + ${CMAKE_CURRENT_BINARY_DIR}/test_gantt_output.txt +) +set_tests_properties(GanttOutputTest PROPERTIES LABELS "scripts") + +# HTML Gantt chart output test +add_test( + NAME GanttHtmlOutputTest + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/test_gantt_html.sh + $ + ${CMAKE_CURRENT_SOURCE_DIR}/assets/test_gantt.seq + ${CMAKE_CURRENT_BINARY_DIR}/test_gantt_output.html +) +set_tests_properties(GanttHtmlOutputTest PROPERTIES LABELS "scripts") + +# Subsystem test targets +add_custom_target(run_audio_tests + COMMAND ${CMAKE_CTEST_COMMAND} -L audio --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running audio subsystem tests...") + +add_custom_target(run_gpu_tests + COMMAND ${CMAKE_CTEST_COMMAND} -L gpu --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running GPU subsystem tests...") + +add_custom_target(run_3d_tests + COMMAND ${CMAKE_CTEST_COMMAND} -L 3d --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running 3D subsystem tests...") + +add_custom_target(run_assets_tests + COMMAND ${CMAKE_CTEST_COMMAND} -L assets --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running asset system tests...") + +add_custom_target(run_util_tests + COMMAND ${CMAKE_CTEST_COMMAND} -L util --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running utility tests...") + +add_custom_target(run_all_tests + COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running all tests...") -- cgit v1.2.3