diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-11 08:19:05 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-11 08:19:05 +0100 |
| commit | fdf9345d5de1c951603e5da3ee8454e9efe2dc28 (patch) | |
| tree | ee0dcf35de7d2800b20faf861cd70cb168d773f8 /cmake/DemoCodegen.cmake | |
| parent | 6d64674f7e3d00a9d18ec61eaf968ed37c8e849b (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.cmake | 117 |
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) |
