summaryrefslogtreecommitdiff
path: root/cmake/DemoCodegen.cmake
blob: 6c56cbd38f38a4c3fc33e4acd99b94c54c21d495 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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)