aboutsummaryrefslogtreecommitdiff
path: root/tests/CMakeLists.txt
blob: 3545b758427012d02e1a29c6a176c549fe76964c (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
cmake_minimum_required(VERSION 3.20)
project(sokol-test)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)

# SOKOL_GLCORE33, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU, SOKOL_DUMMY
set(SOKOL_BACKEND "SOKOL_DUMMY_BACKEND" CACHE STRING "Select 3D backend API")
set_property(CACHE SOKOL_BACKEND PROPERTY STRINGS SOKOL_GLCORE33 SOKOL_METAL SOKOL_D3D11 SOKOL_DUMMY_BACKEND)
option(SOKOL_FORCE_EGL "Force EGL with GLCORE33 backend" OFF)
option(SOKOL_FORCE_SLES "Force SLES in sokol-audio Android backend" OFF)
option(USE_ARC "Enable/disable ARC" OFF)
option(USE_ANALYZER "Enable/disable clang analyzer" OFF)

if (CMAKE_SYSTEM_NAME STREQUAL Emscripten)
    set(EMSCRIPTEN 1)
elseif (CMAKE_SYSTEM_NAME STREQUAL iOS)
    set(OSX_IOS 1)
elseif (CMAKE_SYSTEM_NAME STREQUAL Android)
    set(ANDROID 1)
elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
    set(LINUX 1)
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
    set(OSX_MACOS 1)
elseif (CMAKE_SYSTEM_NAME STREQUAL Windows)
    set(WINDOWS 1)
else()
    message(FATAL_ERROR "Unrecognized CMAKE_SYSTEM_NAME")
endif()

message(">> CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
message(">> SOKOL_BACKEND: ${SOKOL_BACKEND}")
message(">> SOKOL_FORCE_EGL: ${SOKOL_FORCE_EGL}")
message(">> SOKOL_FORCE_SLES: ${SOKOL_FORCE_SLES}")
if (OSX_IOS OR OSX_MACOS)
    if (USE_ARC)
        message(">> ObjC ARC ENABLED")
    else()
        message(">> ObjC ARC DISABLED")
    endif()
endif()
message(">> BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(">> TOOLCHAIN: ${CMAKE_TOOLCHAIN_FILE}")

set(c_flags)
set(cxx_flags)
set(link_flags)
set(system_libs)

if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
    set(c_flags ${c_flags} /W4 /WX /D_CRT_SECURE_NO_WARNINGS)
    set(cxx_flags ${cxx_flags} /W4 /WX /EHsc /D_CRT_SECURE_NO_WARNINGS)
else()
    set(c_flags ${c_flags} -Wall -Wextra -Werror -Wsign-conversion)
    set(cxx_flags ${cxx_flags} -Wall -Wextra -Werror -Wsign-conversion -fno-rtti -fno-exceptions)
    if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
        set(c_flags ${c_flags} -Wno-missing-field-initializers)
        set(cxx_flags ${cxx_flags} -Wno-missing-field-initializers)
    endif()
    if (USE_ANALYZER)
        # FIXME: consider using clang-tidy via CMAKE_CXX_CLANG_TIDY: https://ortogonal.github.io/cmake-clang-tidy/
        # with the default settings this spams the output with irrelevant C++ coding style warnings in 3rd party libs though
        message(">> Configuring for static code analysis")
        set(c_flags ${c_flags} --analyze -Xanalyzer -analyzer-opt-analyze-headers)
        set(cxx_flags ${cxx_flags} --analyze -Xanalyzer -analyzer-opt-analyze-headers)
        set(link_flags ${link_flags} --analyze -Wno-unused-command-line-argument)
    endif()
endif()

if (EMSCRIPTEN)
    set(CMAKE_EXECUTABLE_SUFFIX ".html")
    set(link_flags ${link-flags} -sNO_FILESYSTEM=1 -sASSERTIONS=0 -sMALLOC=emmalloc -sINITIAL_MEMORY=33554432 --closure=1)
elseif (OSX_IOS)
    set(exe_type MACOSX_BUNDLE)
    if (USE_ARC)
        set(c_flags ${c_flags} -fobjc-arc)
        set(cxx_flags ${cxx_flags} -fobjc-arc)
    endif()
    set(system_libs ${system_libs} "-framework Foundation" "-framework UIKit" "-framework AudioToolbox" "-framework AVFoundation")
    if (SOKOL_BACKEND STREQUAL SOKOL_METAL)
        set(system_libs ${system_libs} "-framework Metal" "-framework MetalKit")
    else()
        set(system_libs ${system_libs} "-framework OpenGLES" "-framework GLKit")
    endif()
elseif (ANDROID)
    if (SOKOL_FORCE_SLES)
        set(system_libs ${system_libs} GLESv3 EGL OpenSLES log android)
    else()
        set(system_libs ${system_libs} GLESv3 EGL aaudio log android)
    endif()
elseif (LINUX)
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    find_package(Threads REQUIRED)
    if ((SOKOL_BACKEND STREQUAL SOKOL_GLES3) OR SOKOL_FORCE_EGL)
        set(system_libs ${system_libs} X11 Xi Xcursor EGL GL asound dl m Threads::Threads)
    else()
        set(system_libs ${system_libs} X11 Xi Xcursor GL asound dl m Threads::Threads)
    endif()
elseif (OSX_MACOS)
    set(exe_type MACOSX_BUNDLE)
    if (USE_ARC)
        set(c_flags ${c_flags} -fobjc-arc)
        set(cxx_flags ${cxx_flags} -fobjc-arc)
    endif()
    set(system_libs ${system_libs} "-framework QuartzCore" "-framework Cocoa" "-framework AudioToolbox")
    if (SOKOL_BACKEND STREQUAL SOKOL_METAL)
        set(system_libs ${system_libs} "-framework MetalKit" "-framework Metal")
    else()
        set(system_libs ${system_libs} "-framework OpenGL")
    endif()
elseif (WINDOWS)
    set(exe_type WIN32)
endif()

macro(configure_common target)
    if (SOKOL_FORCE_EGL)
        target_compile_definitions(${target} PRIVATE SOKOL_FORCE_EGL)
    endif()
    if (SOKOL_FORCE_SLES)
        target_compile_definitions(${target} PRIVATE SAUDIO_ANDROID_SLES)
    endif()
    target_compile_definitions(${target} PRIVATE ${SOKOL_BACKEND})
    target_link_options(${target} PRIVATE ${link_flags})
    target_link_libraries(${target} PRIVATE ${system_libs})
    target_include_directories(${target} PRIVATE ../.. ../../util)
    target_include_directories(${target} PRIVATE ../ext)
endmacro()

macro(configure_osx_properties target)
    if (OSX_IOS)
        target_compile_definitions(${target} PRIVATE GLES_SILENCE_DEPRECATION)
    endif()
    set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${target}")
    set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "${target}")
    set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_PRODUCT_NAME "${target}")
    set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${target}")
endmacro()

macro(configure_c target)
    configure_common(${target})
    target_compile_options(${target} PRIVATE ${c_flags})
    if (OSX_MACOS OR OSX_IOS)
        target_compile_options(${target} PRIVATE -x objective-c)
        configure_osx_properties(${target})
    endif()
endmacro()

macro(configure_cxx target)
    configure_common(${target})
    target_compile_options(${target} PRIVATE ${cxx_flags})
    if (OSX_MACOS OR OSX_IOS)
        target_compile_options(${target} PRIVATE -x objective-c++)
        configure_osx_properties(${target})
    endif()
endmacro()

add_subdirectory(ext)
add_subdirectory(compile)
add_subdirectory(functional)