# 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)