summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: b06bd6dc7dd8b3e7e29330b6a4515e428ba56727 (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
118
119
120
cmake_minimum_required(VERSION 3.16)
project(demo64k LANGUAGES C CXX)

option(DEMO_SIZE_OPT "Enable size optimization flags" OFF)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Search in both debug and release
set(WGPU_SEARCH_PATHS
    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/wgpu-native/target/debug
    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/wgpu-native/target/release
)

find_library(
    WGPU_LIBRARY NAMES libwgpu_native.a wgpu_native.lib wgpu_native
    HINTS ${WGPU_SEARCH_PATHS}
    REQUIRED
)

include_directories(
    src
    third_party
    third_party/wgpu-native/ffi
    third_party/wgpu-native/ffi/webgpu-headers
)

find_package(glfw3 REQUIRED)

set(DEMO_LIBS glfw ${WGPU_LIBRARY})

# Platform-specific dependencies for wgpu-native
if (APPLE)
    set_source_files_properties(src/platform.cc PROPERTIES COMPILE_FLAGS "-x objective-c++")
    list(APPEND DEMO_LIBS
        "-framework Metal"
        "-framework Foundation"
        "-framework Cocoa"
        "-framework QuartzCore"
    )
else()
    # Assume Linux/other POSIX-like systems might need these
    list(APPEND DEMO_LIBS pthread m dl)
endif()

add_executable(demo64k
    src/main.cc
    src/platform.cc
    src/gpu/gpu.cc
    src/audio/audio.cc
    src/audio/fdct.cc
    src/audio/idct.cc
    src/audio/window.cc
    src/audio/synth.cc
)

target_link_libraries(demo64k PRIVATE ${DEMO_LIBS})

if (DEMO_SIZE_OPT)
    if (MSVC)
        target_compile_options(demo64k PRIVATE /Os /GS-)
        target_link_options(demo64k PRIVATE /OPT:REF /OPT:ICF /INCREMENTAL:NO)
    else()
        target_compile_options(demo64k PRIVATE -Os -ffunction-sections -fdata-sections)
        target_link_options(demo64k PRIVATE -Wl,--gc-sections -s)
    endif()
endif()

option(DEMO_BUILD_TESTS "Build tests" OFF)
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_test(NAME HammingWindowTest COMMAND test_window)

    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_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/synth.cc
        src/audio/idct.cc
    )
    target_include_directories(test_spectool PRIVATE src third_party)
    target_link_libraries(test_spectool PRIVATE ${DEMO_LIBS})
    add_test(NAME SpectoolEndToEndTest COMMAND test_spectool)
endif()

option(DEMO_BUILD_TOOLS "Build tools" OFF)
if(DEMO_BUILD_TOOLS)
    add_executable(spectool
        tools/spectool.cc
        src/platform.cc
        src/audio/audio.cc
        src/audio/fdct.cc
        src/audio/idct.cc
        src/audio/window.cc
        src/audio/synth.cc
    )
    target_include_directories(spectool PRIVATE src third_party)
    target_link_libraries(spectool PRIVATE ${DEMO_LIBS})

    add_executable(specview
        tools/specview.cc
    )
    target_include_directories(specview PRIVATE src)
endif()