summaryrefslogtreecommitdiff
path: root/cmake/DemoExecutables.cmake
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-11 08:19:05 +0100
committerskal <pascal.massimino@gmail.com>2026-02-11 08:19:05 +0100
commitfdf9345d5de1c951603e5da3ee8454e9efe2dc28 (patch)
treeee0dcf35de7d2800b20faf861cd70cb168d773f8 /cmake/DemoExecutables.cmake
parent6d64674f7e3d00a9d18ec61eaf968ed37c8e849b (diff)
refactor: Modularize CMake build system into 10 specialized modules
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 <noreply@anthropic.com>
Diffstat (limited to 'cmake/DemoExecutables.cmake')
-rw-r--r--cmake/DemoExecutables.cmake96
1 files changed, 96 insertions, 0 deletions
diff --git a/cmake/DemoExecutables.cmake b/cmake/DemoExecutables.cmake
new file mode 100644
index 0000000..86b63da
--- /dev/null
+++ b/cmake/DemoExecutables.cmake
@@ -0,0 +1,96 @@
+# Main Executables
+# Defines demo64k and test_demo binary targets
+
+# =============================================================================
+# demo64k - Main Demo Executable
+# =============================================================================
+
+if(DEMO_STRIP_EXTERNAL_LIBS)
+ # Size measurement mode: Stub main, no timeline/music
+ add_demo_executable(demo64k src/stub_main.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC})
+ add_dependencies(demo64k generate_demo_assets)
+else()
+ # Normal mode: Full main with timeline and music
+ add_demo_executable(demo64k src/main.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${GENERATED_MUSIC_DATA_CC})
+ add_dependencies(demo64k generate_demo_assets generate_timeline generate_tracker_music)
+endif()
+
+# Link libraries (use shared macro)
+demo_link_libraries_ordered(demo64k)
+
+# Size optimizations (use shared macro)
+demo_apply_size_optimizations(demo64k)
+
+# ==============================================================================
+# Final Build Target (make final)
+# ==============================================================================
+# Convenience target for final production build with all stripping enabled
+# Usage: make final
+# This reconfigures CMake with FINAL_STRIP and rebuilds demo64k
+# Note: Only create this target if we're NOT already in FINAL_STRIP mode
+
+if(NOT DEMO_FINAL_STRIP)
+ add_custom_target(final
+ COMMAND ${CMAKE_COMMAND} -E echo "Building FINAL production binary..."
+ COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR} -DDEMO_FINAL_STRIP=ON -DDEMO_SIZE_OPT=ON
+ COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target demo64k -j8
+ COMMAND ${CMAKE_COMMAND} -E echo ""
+ COMMAND ${CMAKE_COMMAND} -E echo "Final build complete!"
+ COMMAND ${CMAKE_COMMAND} -E echo "Binary: ${CMAKE_BINARY_DIR}/demo64k"
+ COMMAND ls -lh ${CMAKE_BINARY_DIR}/demo64k
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ COMMENT "Building final production binary with FINAL_STRIP"
+ )
+endif()
+
+# =============================================================================
+# test_demo - Audio/Visual Sync Tool
+# =============================================================================
+
+# Timeline generation
+set(TEST_DEMO_SEQ_PATH ${CMAKE_CURRENT_SOURCE_DIR}/assets/test_demo.seq)
+set(GENERATED_TEST_DEMO_TIMELINE_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/test_demo_timeline.cc)
+add_custom_command(
+ OUTPUT ${GENERATED_TEST_DEMO_TIMELINE_CC}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/generated
+ COMMAND ${SEQ_COMPILER_CMD} ${TEST_DEMO_SEQ_PATH} ${GENERATED_TEST_DEMO_TIMELINE_CC}
+ DEPENDS ${SEQ_COMPILER_DEPENDS} ${TEST_DEMO_SEQ_PATH} src/gpu/demo_effects.h
+ COMMENT "Compiling test_demo sequence..."
+)
+add_custom_target(generate_test_demo_timeline ALL DEPENDS ${GENERATED_TEST_DEMO_TIMELINE_CC})
+
+# Music generation
+set(TEST_DEMO_TRACK_PATH ${CMAKE_CURRENT_SOURCE_DIR}/assets/test_demo.track)
+set(GENERATED_TEST_DEMO_MUSIC_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/test_demo_music.cc)
+add_custom_command(
+ OUTPUT ${GENERATED_TEST_DEMO_MUSIC_CC}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/generated
+ COMMAND ${TRACKER_COMPILER_FINAL_CMD} ${TEST_DEMO_TRACK_PATH} ${GENERATED_TEST_DEMO_MUSIC_CC}
+ DEPENDS ${TRACKER_COMPILER_FINAL_DEPENDS} ${TEST_DEMO_TRACK_PATH} tracker_compiler_host
+ COMMENT "Compiling test_demo music..."
+)
+add_custom_target(generate_test_demo_music ALL DEPENDS ${GENERATED_TEST_DEMO_MUSIC_CC})
+
+# Mark test_demo generated files as GENERATED
+set_source_files_properties(${GENERATED_TEST_DEMO_TIMELINE_CC} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${GENERATED_TEST_DEMO_MUSIC_CC} PROPERTIES GENERATED TRUE)
+
+# Build executable (uses main demo assets)
+if(NOT DEMO_STRIP_EXTERNAL_LIBS)
+ add_demo_executable(
+ test_demo
+ src/test_demo.cc
+ ${PLATFORM_SOURCES}
+ ${GEN_DEMO_CC}
+ ${GENERATED_TEST_DEMO_TIMELINE_CC}
+ ${GENERATED_TEST_DEMO_MUSIC_CC}
+ )
+
+ add_dependencies(test_demo generate_demo_assets generate_test_demo_timeline generate_test_demo_music)
+
+ # Link libraries (use shared macro)
+ demo_link_libraries_ordered(test_demo)
+
+ # Size optimizations (use shared macro)
+ demo_apply_size_optimizations(test_demo)
+endif()