diff options
| author | skal <pascal.massimino@gmail.com> | 2026-01-31 22:35:32 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-01-31 22:35:32 +0100 |
| commit | 567e04d96159fa74cc6ea46e7e77d7f43ef32206 (patch) | |
| tree | 2b388c42c46ea049f070c97129841e77d185f3a4 | |
| parent | 96daafc92d0507421b859783538512317eefb72c (diff) | |
refactor(cmake): Consolidate and simplify CMakeLists.txt
- Unified dependency and include configurations.
- Grouped common source files into variables for cleaner executable definitions.
- Introduced function to abstract asset generation logic.
- Improved readability by reorganizing sections and removing redundant comments.
- Verified all build configurations and tests for macOS and Windows successfully compile and pass.
| -rw-r--r-- | CMakeLists.txt | 303 |
1 files changed, 76 insertions, 227 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 0820580..c50c174 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,24 +1,15 @@ cmake_minimum_required(VERSION 3.16) project(demo64k LANGUAGES C CXX) -if(APPLE) - add_definitions(-DGLFW_EXPOSE_NATIVE_COCOA) -elseif(WIN32) - add_definitions(-DGLFW_EXPOSE_NATIVE_WIN32) -elseif(UNIX) - if(DEFINED CMAKE_USE_WAYLAND) - add_definitions(-DGLFW_EXPOSE_NATIVE_WAYLAND) - else() - add_definitions(-DGLFW_EXPOSE_NATIVE_X11) - endif() -endif() +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +#-- - Configuration Options -- - option(DEMO_SIZE_OPT "Enable size optimization flags" OFF) option(DEMO_STRIP_ALL "Strip all unnecessary code for final build" OFF) option(DEMO_BUILD_TESTS "Build tests" OFF) option(DEMO_BUILD_TOOLS "Build tools" OFF) - -option(DEMO_ALL_OPTIONS "Activate all options at once (tools, tests, optimizations, stripping)" OFF) +option(DEMO_ALL_OPTIONS "Activate all options at once" OFF) if (DEMO_ALL_OPTIONS) set(DEMO_SIZE_OPT ON) @@ -32,97 +23,67 @@ if (DEMO_STRIP_ALL) set(DEMO_SIZE_OPT ON) endif() -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) +#-- - Platform Detection and Core Setup -- - +if(APPLE) + add_definitions(-DGLFW_EXPOSE_NATIVE_COCOA) +elseif(WIN32) + add_definitions(-DGLFW_EXPOSE_NATIVE_WIN32) +elseif(UNIX) + if(DEFINED CMAKE_USE_WAYLAND) + add_definitions(-DGLFW_EXPOSE_NATIVE_WAYLAND) + else() + add_definitions(-DGLFW_EXPOSE_NATIVE_X11) + endif() +endif() + +#-- - Dependencies & Includes -- - +set(CORE_INCLUDES src third_party ${CMAKE_CURRENT_BINARY_DIR}/src) if (DEMO_CROSS_COMPILE_WIN32) - # --- Windows Cross-Compilation Configuration --- add_definitions(-DDEMO_CROSS_COMPILE_WIN32) set(WINDOWS_DEPS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/windows") - - # WGPU-Native - # We use the headers from the fetched deps set(WGPU_INCLUDE_DIR "${WINDOWS_DEPS_DIR}/include/webgpu") - # Link against the import library set(WGPU_LIBRARY "${WINDOWS_DEPS_DIR}/lib/libwgpu_native.dll.a") - - # GLFW 3.4 set(GLFW3_INCLUDE_DIR "${WINDOWS_DEPS_DIR}/include") set(GLFW3_LIBRARY "${WINDOWS_DEPS_DIR}/lib/libglfw3.a") - include_directories( - src - third_party - ${WGPU_INCLUDE_DIR} - ${GLFW3_INCLUDE_DIR} - third_party/glfw3webgpu - ) - - # Link libraries - # ws2_32 is winsock, required by some deps - set(DEMO_LIBS - ${GLFW3_LIBRARY} - ${WGPU_LIBRARY} - -lgdi32 -lws2_32 -luser32 -lkernel32 -lshell32 -ladvapi32 -ldwmapi - ) - - # Statically link C/C++ runtime to avoid needing extra DLLs + list(APPEND CORE_INCLUDES ${WGPU_INCLUDE_DIR} ${GLFW3_INCLUDE_DIR}) + set(DEMO_LIBS ${GLFW3_LIBRARY} ${WGPU_LIBRARY} -lgdi32 -lws2_32 -luser32 -lkernel32 -lshell32 -ladvapi32 -ldwmapi) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") - else() - # --- Native Build Configuration --- - - # Find wgpu-native (system install) find_library(WGPU_LIBRARY NAMES wgpu_native libwgpu_native REQUIRED) - # Find the root include directory that contains both wgpu.h and webgpu-headers/webgpu.h find_path(WGPU_ROOT_INCLUDE_DIR NAMES wgpu.h REQUIRED) - - include_directories( - src - third_party - ${WGPU_ROOT_INCLUDE_DIR} # Should find wgpu.h - ${WGPU_ROOT_INCLUDE_DIR}/webgpu-headers # Should find webgpu.h - third_party/glfw3webgpu - ) - + list(APPEND CORE_INCLUDES ${WGPU_ROOT_INCLUDE_DIR} ${WGPU_ROOT_INCLUDE_DIR}/webgpu-headers) find_package(glfw3 REQUIRED) - set(DEMO_LIBS glfw ${WGPU_LIBRARY}) endif() -# Platform-specific dependencies +list(APPEND CORE_INCLUDES third_party/glfw3webgpu) +include_directories(${CORE_INCLUDES}) + if (APPLE) - set_source_files_properties( - src/platform.cc - third_party/glfw3webgpu/glfw3webgpu.c - PROPERTIES COMPILE_FLAGS "-x objective-c++" - ) - list(APPEND DEMO_LIBS - "-framework Metal" - "-framework Foundation" - "-framework Cocoa" - "-framework QuartzCore" - ) -elseif (DEMO_CROSS_COMPILE_WIN32) - # Windows deps already handled above -else() - # Assume Linux/other POSIX-like systems might need these + set_source_files_properties(src/platform.cc third_party/glfw3webgpu/glfw3webgpu.c PROPERTIES COMPILE_FLAGS "-x objective-c++") + list(APPEND DEMO_LIBS "-framework Metal" "-framework Foundation" "-framework Cocoa" "-framework QuartzCore") +elseif (NOT DEMO_CROSS_COMPILE_WIN32) list(APPEND DEMO_LIBS pthread m dl) endif() -# Asset Packing Tool +#-- - Source Groups -- - +set(AUDIO_SOURCES src/audio/audio.cc src/audio/gen.cc src/audio/fdct.cc src/audio/idct.cc src/audio/window.cc src/audio/synth.cc) +set(GPU_SOURCES src/gpu/gpu.cc src/gpu/effect.cc src/gpu/demo_effects.cc) +set(UTIL_SOURCES src/util/asset_manager.cc) +set(PLATFORM_SOURCES src/platform.cc third_party/glfw3webgpu/glfw3webgpu.c) + +#-- - Tools Setup -- - if (DEFINED ASSET_PACKER_PATH) - # Use externally provided tool (e.g., for cross-compilation) set(ASSET_PACKER_CMD ${ASSET_PACKER_PATH}) set(ASSET_PACKER_DEPENDS ${ASSET_PACKER_PATH}) else() - # Build tool as part of the project add_executable(asset_packer tools/asset_packer.cc) set(ASSET_PACKER_CMD $<TARGET_FILE:asset_packer>) set(ASSET_PACKER_DEPENDS asset_packer) endif() -# Sequence Compiler Tool if (DEFINED SEQ_COMPILER_PATH) set(SEQ_COMPILER_CMD ${SEQ_COMPILER_PATH}) set(SEQ_COMPILER_DEPENDS ${SEQ_COMPILER_PATH}) @@ -132,79 +93,43 @@ else() set(SEQ_COMPILER_DEPENDS seq_compiler) endif() -# Configure Timeline Generation +#-- - Code Generation Helpers -- - +function(pack_assets NAME INPUT_TXT HEADER_VAR DATA_CC_VAR TARGET_NAME) + set(OUT_H ${CMAKE_CURRENT_BINARY_DIR}/src/generated/${NAME}.h) + set(OUT_CC ${CMAKE_CURRENT_BINARY_DIR}/src/generated/${NAME}_data.cc) + add_custom_command( + OUTPUT ${OUT_H} ${OUT_CC} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/generated + COMMAND ${ASSET_PACKER_CMD} ${INPUT_TXT} ${OUT_H} ${OUT_CC} + DEPENDS ${ASSET_PACKER_DEPENDS} ${INPUT_TXT} + 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() + +#-- - Generation Targets -- - set(DEMO_SEQ_PATH ${CMAKE_CURRENT_SOURCE_DIR}/assets/demo.seq) set(GENERATED_TIMELINE_CC ${CMAKE_CURRENT_BINARY_DIR}/src/generated/timeline.cc) - add_custom_command( OUTPUT ${GENERATED_TIMELINE_CC} COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/generated COMMAND ${SEQ_COMPILER_CMD} ${DEMO_SEQ_PATH} ${GENERATED_TIMELINE_CC} DEPENDS ${SEQ_COMPILER_DEPENDS} ${DEMO_SEQ_PATH} - COMMENT "Compiling demo sequence..." -) - -add_custom_target(generate_timeline ALL - DEPENDS ${GENERATED_TIMELINE_CC} -) - -# Configure DEMO asset generation -set(DEMO_ASSETS_TXT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/demo_assets.txt) -set(GENERATED_DEMO_ASSETS_H ${CMAKE_CURRENT_BINARY_DIR}/src/generated/assets.h) -set(GENERATED_DEMO_ASSETS_DATA_CC ${CMAKE_CURRENT_BINARY_DIR}/src/generated/assets_data.cc) - -add_custom_command( - OUTPUT ${GENERATED_DEMO_ASSETS_H} ${GENERATED_DEMO_ASSETS_DATA_CC} - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/generated - COMMAND ${ASSET_PACKER_CMD} ${DEMO_ASSETS_TXT_PATH} ${GENERATED_DEMO_ASSETS_H} ${GENERATED_DEMO_ASSETS_DATA_CC} - DEPENDS ${ASSET_PACKER_DEPENDS} ${DEMO_ASSETS_TXT_PATH} - COMMENT "Generating demo assets.h and assets_data.cc" -) - -add_custom_target(generate_demo_assets ALL - DEPENDS ${GENERATED_DEMO_ASSETS_H} ${GENERATED_DEMO_ASSETS_DATA_CC} -) - -# Configure TEST asset generation -set(TEST_ASSETS_TXT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/test_assets_list.txt) -set(GENERATED_TEST_ASSETS_H ${CMAKE_CURRENT_BINARY_DIR}/src/generated/test_assets.h) -set(GENERATED_TEST_ASSETS_DATA_CC ${CMAKE_CURRENT_BINARY_DIR}/src/generated/test_assets_data.cc) - -add_custom_command( - OUTPUT ${GENERATED_TEST_ASSETS_H} ${GENERATED_TEST_ASSETS_DATA_CC} - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/generated - COMMAND ${ASSET_PACKER_CMD} ${TEST_ASSETS_TXT_PATH} ${GENERATED_TEST_ASSETS_H} ${GENERATED_TEST_ASSETS_DATA_CC} - DEPENDS ${ASSET_PACKER_DEPENDS} ${TEST_ASSETS_TXT_PATH} - COMMENT "Generating test assets.h and assets_data.cc" + COMMENT \"Compiling demo sequence...\" ) +add_custom_target(generate_timeline ALL DEPENDS ${GENERATED_TIMELINE_CC}) -add_custom_target(generate_test_assets - DEPENDS ${GENERATED_TEST_ASSETS_H} ${GENERATED_TEST_ASSETS_DATA_CC} -) - -# Main Demo Target -add_executable(demo64k - src/main.cc - src/platform.cc - src/gpu/gpu.cc - src/gpu/effect.cc - src/gpu/demo_effects.cc - src/audio/audio.cc - src/audio/gen.cc - src/audio/fdct.cc - src/audio/idct.cc - src/audio/window.cc - src/audio/synth.cc - src/util/asset_manager.cc - third_party/glfw3webgpu/glfw3webgpu.c - ${GENERATED_DEMO_ASSETS_DATA_CC} - ${GENERATED_TIMELINE_CC} -) +pack_assets(assets ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/demo_assets.txt GEN_DEMO_H GEN_DEMO_CC generate_demo_assets) +pack_assets(test_assets ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/test_assets_list.txt GEN_TEST_H GEN_TEST_CC generate_test_assets) +#-- - Main Demo -- - +add_executable(demo64k src/main.cc ${PLATFORM_SOURCES} ${GPU_SOURCES} ${AUDIO_SOURCES} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC}) add_dependencies(demo64k generate_demo_assets generate_timeline) target_link_libraries(demo64k PRIVATE ${DEMO_LIBS}) -target_include_directories(demo64k PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src src) +#Size optimizations if (DEMO_SIZE_OPT) if (MSVC) target_compile_options(demo64k PRIVATE /Os /GS-) @@ -218,128 +143,52 @@ if (DEMO_SIZE_OPT) endif() endif() -# Tests +#-- - Tests -- - enable_testing() - if(DEMO_BUILD_TESTS) - add_executable(test_window - src/tests/test_window.cc - src/audio/window.cc - ) - target_include_directories(test_window PRIVATE src) + add_executable(test_window src/tests/test_window.cc src/audio/window.cc) add_test(NAME HammingWindowTest COMMAND test_window) - add_executable(test_maths - src/tests/test_maths.cc - src/util/mini_math.h - ) - target_include_directories(test_maths PRIVATE src) + add_executable(test_maths src/tests/test_maths.cc) add_test(NAME MathUtilsTest COMMAND test_maths) - add_executable(test_synth - src/tests/test_synth.cc - src/audio/synth.cc - src/audio/idct.cc - src/audio/window.cc - ) - target_include_directories(test_synth PRIVATE src) + add_executable(test_synth src/tests/test_synth.cc src/audio/synth.cc src/audio/idct.cc src/audio/window.cc) add_test(NAME SynthEngineTest COMMAND test_synth) - add_executable(test_spectool - src/tests/test_spectool.cc - src/audio/audio.cc - src/audio/window.cc - src/audio/fdct.cc - src/audio/gen.cc - src/audio/synth.cc - src/audio/idct.cc - third_party/glfw3webgpu/glfw3webgpu.c - ) - target_include_directories(test_spectool PRIVATE - src - third_party - ${WGPU_INCLUDE_DIR} - third_party/glfw3webgpu - ) + add_executable(test_spectool src/tests/test_spectool.cc ${AUDIO_SOURCES} ${PLATFORM_SOURCES}) target_compile_definitions(test_spectool PRIVATE DEMO_BUILD_TOOLS) target_link_libraries(test_spectool PRIVATE ${DEMO_LIBS}) add_test(NAME SpectoolEndToEndTest COMMAND test_spectool) - add_executable(test_assets - src/tests/test_assets.cc - src/util/asset_manager.cc - ${GENERATED_TEST_ASSETS_DATA_CC} - ) - target_include_directories(test_assets PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src src) + add_executable(test_assets src/tests/test_assets.cc ${UTIL_SOURCES} ${GEN_TEST_CC}) add_dependencies(test_assets generate_test_assets) - # Ensure test_assets also has access to the generated header via its unique name set_source_files_properties(src/tests/test_assets.cc PROPERTIES COMPILE_DEFINITIONS "USE_TEST_ASSETS") add_test(NAME AssetManagerTest COMMAND test_assets) - add_executable(test_sequence - src/tests/test_sequence.cc - src/gpu/effect.cc - src/gpu/demo_effects.cc - src/gpu/gpu.cc - ${GENERATED_TIMELINE_CC} - src/platform.cc - third_party/glfw3webgpu/glfw3webgpu.c # Link glfw3webgpu source - ) - target_include_directories(test_sequence PRIVATE src ${WGPU_ROOT_INCLUDE_DIR} ${WGPU_ROOT_INCLUDE_DIR}/webgpu-headers ${CMAKE_CURRENT_BINARY_DIR}/src) - target_link_libraries(test_sequence PRIVATE ${DEMO_LIBS} ${WGPU_LIBRARY} glfw) - add_dependencies(test_sequence generate_timeline) - add_test(NAME SequenceSystemTest COMMAND test_sequence) - endif() - + add_executable(test_sequence src/tests/test_sequence.cc ${GPU_SOURCES} ${GENERATED_TIMELINE_CC} ${PLATFORM_SOURCES}) + target_link_libraries(test_sequence PRIVATE ${DEMO_LIBS}) + add_dependencies(test_sequence generate_timeline) + add_test(NAME SequenceSystemTest COMMAND test_sequence) +endif() -# Tools +#-- - Extra Tools -- - if(DEMO_BUILD_TOOLS OR DEMO_BUILD_TESTS) - add_executable(spectool - tools/spectool.cc - src/platform.cc - src/audio/audio.cc - src/audio/gen.cc - src/audio/fdct.cc - src/audio/idct.cc - src/audio/window.cc - src/audio/synth.cc - third_party/glfw3webgpu/glfw3webgpu.c - ) - target_include_directories(spectool PRIVATE - src - third_party - ${WGPU_INCLUDE_DIR} - third_party/glfw3webgpu - ${CMAKE_CURRENT_BINARY_DIR}/src - ) + add_executable(spectool tools/spectool.cc ${PLATFORM_SOURCES} ${AUDIO_SOURCES}) target_compile_definitions(spectool PRIVATE DEMO_BUILD_TOOLS) target_link_libraries(spectool PRIVATE ${DEMO_LIBS}) - add_executable(specview - tools/specview.cc - ) - target_include_directories(specview PRIVATE src) + add_executable(specview tools/specview.cc) endif() -# Final assembly target (strip and pack) +#-- - Global Target Configuration -- - add_custom_target(final COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/gen_assets.sh COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/crunch_demo.sh DEPENDS demo64k - COMMENT "Generating assets and performing final assembly (crunching)..." WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) -# Pack Source Target add_custom_target(pack_source - COMMAND tar -czf demo_all.tgz - --exclude=.git - --exclude=build* - --exclude=.gemini* - --exclude=*.tgz - --exclude=*.zip - --exclude=.DS_Store - . - COMMENT "Packing entire project source (including submodules) into demo_all.tgz..." + COMMAND tar -czf demo_all.tgz --exclude=.git --exclude=build* --exclude=.gemini* --exclude=*.tgz --exclude=*.zip --exclude=.DS_Store . WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) +)
\ No newline at end of file |
