summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-17 11:32:05 +0100
committerskal <pascal.massimino@gmail.com>2026-02-17 11:32:05 +0100
commit95dd0ff4c000f3752c5c9112d79de3a4bdaa7b25 (patch)
treeec6ff52b0bd8de357068f3bb7521ddf0b004c5e2
parentbd26bc743933dcd5241fc87d160a893f83644dfb (diff)
fix(build): Resolve clean build failure from generated timeline header
When starting from a clean tree (where `src/generated/` does not exist), the build would fail with a "file not found" error for `generated/timeline.h`. This was due to an incorrect dependency graph where `gpu.cc` was compiled before its required header was generated. This commit fixes the issue by making the dependency explicit: - Modified `tools/seq_compiler.py` to explicitly generate `timeline.h` alongside `timeline.cc`. - Updated `cmake/DemoCodegen.cmake` to declare both files as `OUTPUT`s of the timeline compilation step. - Added a direct dependency from the `gpu` library target to the `generate_timeline` custom target in `cmake/DemoLibraries.cmake`. - Refactored the generated file paths in `DemoCodegen.cmake` into a single `GENERATED_CODE` variable for improved clarity and future-proofing.
-rw-r--r--cmake/DemoCodegen.cmake8
-rw-r--r--cmake/DemoLibraries.cmake4
-rwxr-xr-xtools/seq_compiler.py24
3 files changed, 29 insertions, 7 deletions
diff --git a/cmake/DemoCodegen.cmake b/cmake/DemoCodegen.cmake
index 1e0badf..aa20a92 100644
--- a/cmake/DemoCodegen.cmake
+++ b/cmake/DemoCodegen.cmake
@@ -122,15 +122,17 @@ endfunction()
# Timeline compilation
set(DEMO_SEQ_PATH ${WORKSPACE_TIMELINE})
set(GENERATED_TIMELINE_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/timeline.cc)
+set(GENERATED_TIMELINE_H ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/timeline.h)
+set(GENERATED_CODE ${GENERATED_TIMELINE_CC} ${GENERATED_TIMELINE_H})
add_custom_command(
- OUTPUT ${GENERATED_TIMELINE_CC}
+ OUTPUT ${GENERATED_CODE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/generated
COMMAND ${SEQ_COMPILER_CMD} ${DEMO_SEQ_PATH} --output ${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})
+add_custom_target(generate_timeline ALL DEPENDS ${GENERATED_CODE})
# Music compilation
set(TRACKER_MUSIC_PATH ${WORKSPACE_MUSIC})
@@ -255,5 +257,5 @@ pack_test_assets(test_assets ${CMAKE_CURRENT_SOURCE_DIR}/workspaces/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_CODE} PROPERTIES GENERATED TRUE)
set_source_files_properties(${GENERATED_MUSIC_DATA_CC} PROPERTIES GENERATED TRUE)
diff --git a/cmake/DemoLibraries.cmake b/cmake/DemoLibraries.cmake
index f1891fb..39cd3f4 100644
--- a/cmake/DemoLibraries.cmake
+++ b/cmake/DemoLibraries.cmake
@@ -21,9 +21,9 @@ target_include_directories(3d PUBLIC ${CORE_INCLUDES})
add_dependencies(3d generate_demo_assets)
# GPU effects library
-add_library(gpu STATIC ${GPU_SOURCES})
+add_library(gpu STATIC ${GPU_SOURCES} ${GENERATED_TIMELINE_CC})
target_include_directories(gpu PUBLIC ${CORE_INCLUDES})
-add_dependencies(gpu generate_demo_assets)
+add_dependencies(gpu generate_demo_assets generate_timeline)
# Note: Static libraries do not strictly need to link dependencies,
# but if they did, PRIVATE would propagate to the executable.
diff --git a/tools/seq_compiler.py b/tools/seq_compiler.py
index dec3ab1..18d5a1f 100755
--- a/tools/seq_compiler.py
+++ b/tools/seq_compiler.py
@@ -710,11 +710,31 @@ void RenderTimeline(WGPUSurface surface, float time, int width, int height,
}
'''
- # Write output
+ # Write C++ output
with open(args.output, 'w') as f:
f.write(all_cpp)
- print(f"Generated {len(sequences)} sequence(s) -> {args.output}")
+ # Write C++ header
+ header_path = os.path.splitext(args.output)[0] + ".h"
+ header_content = f'''// Generated by seq_compiler.py
+// DO NOT EDIT
+#pragma once
+
+#include "gpu/gpu.h"
+#include "gpu/sequence.h"
+
+void InitializeSequences(const GpuContext& ctx, int width, int height);
+Sequence* GetActiveSequence(float time);
+void RenderTimeline(WGPUCommandEncoder encoder, float time, int width, int height,
+ float beat_time, float audio_intensity);
+void RenderTimeline(WGPUSurface surface, float time, int width, int height,
+ float beat_time, float audio_intensity);
+float GetDemoDuration();
+'''
+ with open(header_path, 'w') as f:
+ f.write(header_content)
+
+ print(f"Generated {len(sequences)} sequence(s) -> {args.output} and {header_path}")
if __name__ == '__main__':
main()