summaryrefslogtreecommitdiff
path: root/cmake/DemoCodegen.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/DemoCodegen.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/DemoCodegen.cmake')
-rw-r--r--cmake/DemoCodegen.cmake117
1 files changed, 117 insertions, 0 deletions
diff --git a/cmake/DemoCodegen.cmake b/cmake/DemoCodegen.cmake
new file mode 100644
index 0000000..6c56cbd
--- /dev/null
+++ b/cmake/DemoCodegen.cmake
@@ -0,0 +1,117 @@
+# Code Generation Module
+# Asset packing, timeline compilation, and music compilation
+
+# =============================================================================
+# Helper Functions
+# =============================================================================
+
+# Helper to parse asset list and extract individual file paths
+function(parse_asset_list INPUT_TXT OUT_FILE_LIST)
+ set(ASSET_FILES "")
+ if(EXISTS ${INPUT_TXT})
+ # Get directory of INPUT_TXT for relative path resolution
+ get_filename_component(INPUT_DIR ${INPUT_TXT} DIRECTORY)
+
+ file(STRINGS ${INPUT_TXT} LINES)
+ foreach(LINE ${LINES})
+ # Skip comments and empty lines
+ string(STRIP "${LINE}" LINE)
+ if(NOT LINE MATCHES "^#" AND NOT LINE STREQUAL "")
+ # Extract filename (third field: ASSET_NAME, COMPRESSION, FILENAME, DESC)
+ string(REGEX REPLACE "^[^,]+,[^,]+,[ ]*([^,]+).*" "\\1" FILENAME "${LINE}")
+ string(STRIP "${FILENAME}" FILENAME)
+
+ # Try workspace-relative path first
+ set(FULL_PATH "${INPUT_DIR}/${FILENAME}")
+ if(NOT EXISTS ${FULL_PATH})
+ # Fall back to legacy path for compatibility
+ set(FULL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/assets/final/${FILENAME}")
+ endif()
+
+ if(EXISTS ${FULL_PATH})
+ list(APPEND ASSET_FILES ${FULL_PATH})
+ endif()
+ endif()
+ endforeach()
+ endif()
+ set(${OUT_FILE_LIST} ${ASSET_FILES} PARENT_SCOPE)
+endfunction()
+
+# Pack assets for demo (output to src/generated/)
+function(pack_assets NAME INPUT_TXT HEADER_VAR DATA_CC_VAR TARGET_NAME)
+ set(OUT_H ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/${NAME}.h)
+ set(OUT_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/${NAME}_data.cc)
+
+ # Parse asset list to get individual file dependencies
+ parse_asset_list(${INPUT_TXT} ASSET_FILE_DEPS)
+
+ add_custom_command(
+ OUTPUT ${OUT_H} ${OUT_CC}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/generated
+ COMMAND ${ASSET_PACKER_CMD} ${INPUT_TXT} ${OUT_H} ${OUT_CC}
+ DEPENDS ${ASSET_PACKER_DEPENDS} ${INPUT_TXT} ${ASSET_FILE_DEPS}
+ COMMENT "Generating assets for ${NAME}..."
+ )
+ set(${HEADER_VAR} ${OUT_H} PARENT_SCOPE)
+ set(${DATA_CC_VAR} ${OUT_CC} PARENT_SCOPE)
+ add_custom_target(${TARGET_NAME} DEPENDS ${OUT_H} ${OUT_CC})
+endfunction()
+
+# Pack test assets (output to build/src/generated_test/)
+function(pack_test_assets NAME INPUT_TXT HEADER_VAR DATA_CC_VAR TARGET_NAME)
+ set(OUT_H ${CMAKE_CURRENT_BINARY_DIR}/src/generated_test/${NAME}.h)
+ set(OUT_CC ${CMAKE_CURRENT_BINARY_DIR}/src/generated_test/${NAME}_data.cc)
+
+ # Parse asset list to get individual file dependencies
+ parse_asset_list(${INPUT_TXT} ASSET_FILE_DEPS)
+
+ add_custom_command(
+ OUTPUT ${OUT_H} ${OUT_CC}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/generated_test
+ COMMAND ${ASSET_PACKER_CMD} ${INPUT_TXT} ${OUT_H} ${OUT_CC}
+ DEPENDS ${ASSET_PACKER_DEPENDS} ${INPUT_TXT} ${ASSET_FILE_DEPS}
+ COMMENT "Generating assets for test ${NAME}..."
+ )
+ set(${HEADER_VAR} ${OUT_H} PARENT_SCOPE)
+ set(${DATA_CC_VAR} ${OUT_CC} PARENT_SCOPE)
+ add_custom_target(${TARGET_NAME} DEPENDS ${OUT_H} ${OUT_CC})
+endfunction()
+
+# =============================================================================
+# Generation Targets
+# =============================================================================
+
+# Timeline compilation
+set(DEMO_SEQ_PATH ${WORKSPACE_TIMELINE})
+set(GENERATED_TIMELINE_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/timeline.cc)
+add_custom_command(
+ OUTPUT ${GENERATED_TIMELINE_CC}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/generated
+ COMMAND ${SEQ_COMPILER_CMD} ${DEMO_SEQ_PATH} ${GENERATED_TIMELINE_CC}
+ DEPENDS ${SEQ_COMPILER_DEPENDS} ${DEMO_SEQ_PATH}
+ src/gpu/demo_effects.h
+ COMMENT "Compiling demo sequence from workspace ${DEMO_WORKSPACE}..."
+)
+add_custom_target(generate_timeline ALL DEPENDS ${GENERATED_TIMELINE_CC})
+
+# Music compilation
+set(TRACKER_MUSIC_PATH ${WORKSPACE_MUSIC})
+set(GENERATED_MUSIC_DATA_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/music_data.cc)
+add_custom_command(
+ OUTPUT ${GENERATED_MUSIC_DATA_CC}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/generated
+ COMMAND ${TRACKER_COMPILER_FINAL_CMD} ${TRACKER_MUSIC_PATH} ${GENERATED_MUSIC_DATA_CC}
+ DEPENDS ${TRACKER_COMPILER_FINAL_DEPENDS} ${TRACKER_MUSIC_PATH} tracker_compiler_host
+ COMMENT "Compiling tracker music from workspace ${DEMO_WORKSPACE}..."
+)
+add_custom_target(generate_tracker_music ALL DEPENDS ${GENERATED_MUSIC_DATA_CC})
+
+# Asset packing
+pack_assets(assets ${WORKSPACE_ASSETS} GEN_DEMO_H GEN_DEMO_CC generate_demo_assets)
+pack_test_assets(test_assets ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/test_assets_list.txt GEN_TEST_H GEN_TEST_CC generate_test_assets)
+
+# Mark generated files so CMake always checks if they need rebuilding
+set_source_files_properties(${GEN_DEMO_H} ${GEN_DEMO_CC} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${GEN_TEST_H} ${GEN_TEST_CC} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${GENERATED_TIMELINE_CC} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${GENERATED_MUSIC_DATA_CC} PROPERTIES GENERATED TRUE)