summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt303
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