diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-09 18:34:20 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-09 18:34:20 +0100 |
| commit | 26915d8c47260f90d67df8c6af1f16ba7607a3d5 (patch) | |
| tree | c01f1e6bfe0cb85a27f5fc94ed01dea7aa9b969e /CMakeLists.txt | |
| parent | 82fcfd2656a9f7085c54407d9c390a7d413c4b5a (diff) | |
feat: Implement Task #76 external library size measurement
- Use ma_backend_null for audio (100-200KB savings)
- Stub platform/gpu abstractions instead of external APIs
- Add DEMO_STRIP_EXTERNAL_LIBS build mode
- Create stub_types.h with minimal WebGPU opaque types
- Add scripts/measure_size.sh for automated measurement
Results: Demo=4.4MB, External=2.0MB (69% vs 31%)
handoff(Claude): Task #76 complete. Binary compiles but doesn't run (size measurement only).
Diffstat (limited to 'CMakeLists.txt')
| -rw-r--r-- | CMakeLists.txt | 176 |
1 files changed, 109 insertions, 67 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 1892775..acae668 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) option(DEMO_SIZE_OPT "Enable size optimization flags" OFF) option(DEMO_STRIP_ALL "Strip all unnecessary code for final build" OFF) option(DEMO_FINAL_STRIP "Strip ALL error checking for final-final build" OFF) +option(DEMO_STRIP_EXTERNAL_LIBS "Stub external libs for size measurement (binary won't run)" OFF) option(DEMO_BUILD_TESTS "Build tests" OFF) option(DEMO_BUILD_TOOLS "Build tools" OFF) option(DEMO_ENABLE_COVERAGE "Enable code coverage generation (macOS only)" OFF) @@ -35,6 +36,13 @@ if (DEMO_STRIP_ALL) set(DEMO_SIZE_OPT ON) endif() +if (DEMO_STRIP_EXTERNAL_LIBS) + add_definitions(-DSTRIP_EXTERNAL_LIBS) + # Audio: Use miniaudio null backend + add_definitions(-DMA_ENABLE_ONLY_SPECIFIC_BACKENDS -DMA_ENABLE_NULL) + message(STATUS "STRIP_EXTERNAL_LIBS enabled - binary will compile but NOT run (size measurement only)") +endif() + if (DEMO_ENABLE_COVERAGE AND APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage") @@ -95,44 +103,60 @@ endif() #-- - Source Groups -- - set(AUDIO_SOURCES src/audio/audio.cc src/audio/ring_buffer.cc src/audio/backend/miniaudio_backend.cc src/audio/backend/wav_dump_backend.cc src/audio/backend/silent_backend.cc src/audio/gen.cc src/audio/fdct.cc src/audio/idct.cc src/audio/fft.cc src/audio/window.cc src/audio/synth.cc src/audio/tracker.cc src/audio/spectrogram_resource_manager.cc src/audio/audio_engine.cc src/audio/spectral_brush.cc) set(PROCEDURAL_SOURCES src/procedural/generator.cc) -set(GPU_SOURCES - src/gpu/gpu.cc - src/gpu/effect.cc - src/gpu/effects/heptagon_effect.cc - src/gpu/effects/particles_effect.cc - src/gpu/effects/passthrough_effect.cc - src/gpu/effects/moving_ellipse_effect.cc - src/gpu/effects/particle_spray_effect.cc - src/gpu/effects/gaussian_blur_effect.cc - src/gpu/effects/solarize_effect.cc - src/gpu/effects/chroma_aberration_effect.cc - src/gpu/effects/vignette_effect.cc - src/gpu/effects/post_process_helper.cc - src/gpu/effects/shaders.cc - src/gpu/effects/hybrid_3d_effect.cc - src/gpu/effects/flash_cube_effect.cc - src/gpu/effects/theme_modulation_effect.cc - src/gpu/effects/fade_effect.cc - src/gpu/effects/flash_effect.cc - src/gpu/effects/shader_composer.cc - src/gpu/effects/circle_mask_effect.cc - src/gpu/effects/rotating_cube_effect.cc - src/gpu/texture_manager.cc -) -set(3D_SOURCES - src/3d/renderer.cc - src/3d/renderer_draw.cc - src/3d/renderer_pipelines.cc - src/3d/renderer_resources.cc - src/3d/visual_debug.cc - src/3d/bvh.cc - src/3d/physics.cc - src/3d/scene_loader.cc -) -set(PLATFORM_SOURCES src/platform/platform.cc third_party/glfw3webgpu/glfw3webgpu.c) +if (DEMO_STRIP_EXTERNAL_LIBS) + # Size measurement mode: Minimal GPU stubs only + set(GPU_SOURCES src/gpu/stub_gpu.cc) +else() + # Normal mode: Full GPU implementation + set(GPU_SOURCES + src/gpu/gpu.cc + src/gpu/effect.cc + src/gpu/effects/heptagon_effect.cc + src/gpu/effects/particles_effect.cc + src/gpu/effects/passthrough_effect.cc + src/gpu/effects/moving_ellipse_effect.cc + src/gpu/effects/particle_spray_effect.cc + src/gpu/effects/gaussian_blur_effect.cc + src/gpu/effects/solarize_effect.cc + src/gpu/effects/chroma_aberration_effect.cc + src/gpu/effects/vignette_effect.cc + src/gpu/effects/post_process_helper.cc + src/gpu/effects/shaders.cc + src/gpu/effects/hybrid_3d_effect.cc + src/gpu/effects/flash_cube_effect.cc + src/gpu/effects/theme_modulation_effect.cc + src/gpu/effects/fade_effect.cc + src/gpu/effects/flash_effect.cc + src/gpu/effects/shader_composer.cc + src/gpu/effects/circle_mask_effect.cc + src/gpu/effects/rotating_cube_effect.cc + src/gpu/texture_manager.cc + ) +endif() +if (DEMO_STRIP_EXTERNAL_LIBS) + # Size measurement mode: Stub 3D (it depends on WebGPU) + set(3D_SOURCES src/3d/bvh.cc src/3d/physics.cc src/3d/scene_loader.cc) +else() + # Normal mode: Full 3D implementation + set(3D_SOURCES + src/3d/renderer.cc + src/3d/renderer_draw.cc + src/3d/renderer_pipelines.cc + src/3d/renderer_resources.cc + src/3d/visual_debug.cc + src/3d/bvh.cc + src/3d/physics.cc + src/3d/scene_loader.cc + ) +endif() +if (DEMO_STRIP_EXTERNAL_LIBS) + set(PLATFORM_SOURCES src/platform/stub_platform.cc) +else() + set(PLATFORM_SOURCES src/platform/platform.cc third_party/glfw3webgpu/glfw3webgpu.c) +endif() set(UTIL_SOURCES src/util/asset_manager.cc src/util/file_watcher.cc) -#-- - Subsystem Libraries -- - +#-- - Subsystem Libraries -- - add_library(util STATIC ${UTIL_SOURCES}) add_dependencies(util generate_demo_assets generate_test_assets) add_library(procedural STATIC ${PROCEDURAL_SOURCES}) @@ -307,14 +331,30 @@ set_source_files_properties(${GENERATED_TIMELINE_CC} PROPERTIES GENERATED TRUE) set_source_files_properties(${GENERATED_MUSIC_DATA_CC} PROPERTIES GENERATED TRUE) #-- - Main Demo -- - -add_demo_executable(demo64k src/main.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${GENERATED_MUSIC_DATA_CC}) - -add_dependencies(demo64k generate_demo_assets generate_timeline generate_tracker_music)# Link order: Internal libs first, then external libs (DEMO_LIBS). +if (DEMO_STRIP_EXTERNAL_LIBS) + # Size measurement mode: Stub main, no timeline/music + add_demo_executable(demo64k src/stub_main.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC}) + add_dependencies(demo64k generate_demo_assets) +else() + # Normal mode: Full main with timeline and music + add_demo_executable(demo64k src/main.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${GENERATED_MUSIC_DATA_CC}) + add_dependencies(demo64k generate_demo_assets generate_timeline generate_tracker_music) +endif()# Link order: Internal libs first, then external libs (DEMO_LIBS). # gpu and 3d depend on WGPU (in DEMO_LIBS). -if (APPLE) - target_link_libraries(demo64k PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) +if (DEMO_STRIP_EXTERNAL_LIBS) + # Size measurement mode: No external libraries (only math/pthread) + if (APPLE) + target_link_libraries(demo64k PRIVATE 3d gpu audio procedural util) + else() + target_link_libraries(demo64k PRIVATE -Wl,--start-group 3d gpu audio procedural util -Wl,--end-group pthread m) + endif() else() - target_link_libraries(demo64k PRIVATE -Wl,--start-group 3d gpu audio procedural util -Wl,--end-group ${DEMO_LIBS}) + # Normal mode: Link external libraries + if (APPLE) + target_link_libraries(demo64k PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) + else() + target_link_libraries(demo64k PRIVATE -Wl,--start-group 3d gpu audio procedural util -Wl,--end-group ${DEMO_LIBS}) + endif() endif() #Size optimizations @@ -386,34 +426,36 @@ set_source_files_properties(${GENERATED_TEST_DEMO_TIMELINE_CC} PROPERTIES GENERA set_source_files_properties(${GENERATED_TEST_DEMO_MUSIC_CC} PROPERTIES GENERATED TRUE) # Build executable (uses main demo assets) -add_demo_executable( - test_demo - src/test_demo.cc - ${PLATFORM_SOURCES} - ${GEN_DEMO_CC} - ${GENERATED_TEST_DEMO_TIMELINE_CC} - ${GENERATED_TEST_DEMO_MUSIC_CC} -) +if (NOT DEMO_STRIP_EXTERNAL_LIBS) + add_demo_executable( + test_demo + src/test_demo.cc + ${PLATFORM_SOURCES} + ${GEN_DEMO_CC} + ${GENERATED_TEST_DEMO_TIMELINE_CC} + ${GENERATED_TEST_DEMO_MUSIC_CC} + ) -add_dependencies(test_demo generate_demo_assets generate_test_demo_timeline generate_test_demo_music) + add_dependencies(test_demo generate_demo_assets generate_test_demo_timeline generate_test_demo_music) -if (APPLE) - target_link_libraries(test_demo PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) -else() - target_link_libraries(test_demo PRIVATE -Wl,--start-group 3d gpu audio procedural util -Wl,--end-group ${DEMO_LIBS}) -endif() + if (APPLE) + target_link_libraries(test_demo PRIVATE 3d gpu audio procedural util ${DEMO_LIBS}) + else() + target_link_libraries(test_demo PRIVATE -Wl,--start-group 3d gpu audio procedural util -Wl,--end-group ${DEMO_LIBS}) + endif() -# Size optimizations -if (DEMO_SIZE_OPT) - if (MSVC) - target_compile_options(test_demo PRIVATE /Os /GS-) - target_link_options(test_demo PRIVATE /OPT:REF /OPT:ICF /INCREMENTAL:NO) - elseif (APPLE) - target_compile_options(test_demo PRIVATE -Os) - target_link_options(test_demo PRIVATE -Wl,-dead_strip) - else () - target_compile_options(test_demo PRIVATE -Os -ffunction-sections -fdata-sections) - target_link_options(test_demo PRIVATE -Wl,--gc-sections -s) + # Size optimizations + if (DEMO_SIZE_OPT) + if (MSVC) + target_compile_options(test_demo PRIVATE /Os /GS-) + target_link_options(test_demo PRIVATE /OPT:REF /OPT:ICF /INCREMENTAL:NO) + elseif (APPLE) + target_compile_options(test_demo PRIVATE -Os) + target_link_options(test_demo PRIVATE -Wl,-dead_strip) + else () + target_compile_options(test_demo PRIVATE -Os -ffunction-sections -fdata-sections) + target_link_options(test_demo PRIVATE -Wl,--gc-sections -s) + endif() endif() endif() |
