CMakeLists.txt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. cmake_minimum_required(VERSION 3.20)
  2. project(sokol-test)
  3. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
  4. set(CMAKE_C_STANDARD 11)
  5. set(CMAKE_CXX_STANDARD 17) # needed for UWP
  6. # SOKOL_GLCORE33, SOKOL_GLES2, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU, SOKOL_DUMMY
  7. set(SOKOL_BACKEND "SOKOL_DUMMY_BACKEND" CACHE STRING "Select 3D backend API")
  8. set_property(CACHE SOKOL_BACKEND PROPERTY STRINGS SOKOL_GLCORE33 SOKOL_METAL SOKOL_D3D11 SOKOL_DUMMY_BACKEND)
  9. option(SOKOL_FORCE_EGL "Force EGL with GLCORE33 backend" OFF)
  10. option(USE_ARC "Enable/disable ARC" OFF)
  11. option(USE_ANALYZER "Enable/disable clang analyzer" OFF)
  12. if (CMAKE_SYSTEM_NAME STREQUAL Emscripten)
  13. set(EMSCRIPTEN 1)
  14. elseif (CMAKE_SYSTEM_NAME STREQUAL iOS)
  15. set(OSX_IOS 1)
  16. elseif (CMAKE_SYSTEM_NAME STREQUAL Android)
  17. set(ANDROID 1)
  18. elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
  19. set(LINUX 1)
  20. elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
  21. set(OSX_MACOS 1)
  22. elseif (CMAKE_SYSTEM_NAME STREQUAL WindowsStore)
  23. set(UWP 1)
  24. elseif (CMAKE_SYSTEM_NAME STREQUAL Windows)
  25. set(WINDOWS 1)
  26. else()
  27. message(FATAL_ERROR "Unrecognized CMAKE_SYSTEM_NAME")
  28. endif()
  29. message(">> CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
  30. message(">> SOKOL_BACKEND: ${SOKOL_BACKEND}")
  31. message(">> SOKOL_FORCE_EGL: ${SOKOL_FORCE_EGL}")
  32. if (OSX_IOS OR OSX_MACOS)
  33. if (USE_ARC)
  34. message(">> ObjC ARC ENABLED")
  35. else()
  36. message(">> ObjC ARC DISABLED")
  37. endif()
  38. endif()
  39. message(">> BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
  40. message(">> TOOLCHAIN: ${CMAKE_TOOLCHAIN_FILE}")
  41. set(c_flags)
  42. set(cxx_flags)
  43. set(link_flags)
  44. set(system_libs)
  45. if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  46. set(c_flags ${c_flags} /W4 /WX /D_CRT_SECURE_NO_WARNINGS)
  47. set(cxx_flags ${cxx_flags} /W4 /WX /EHsc /D_CRT_SECURE_NO_WARNINGS)
  48. else()
  49. set(c_flags ${c_flags} -Wall -Wextra -Werror -Wsign-conversion)
  50. set(cxx_flags ${cxx_flags} -Wall -Wextra -Werror -Wsign-conversion -fno-rtti -fno-exceptions)
  51. if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  52. set(c_flags ${c_flags} -Wno-missing-field-initializers)
  53. set(cxx_flags ${cxx_flags} -Wno-missing-field-initializers)
  54. endif()
  55. if (USE_ANALYZER)
  56. # FIXME: consider using clang-tidy via CMAKE_CXX_CLANG_TIDY: https://ortogonal.github.io/cmake-clang-tidy/
  57. # with the default settings this spams the output with irrelevant C++ coding style warnings in 3rd party libs though
  58. message(">> Configuring for static code analysis")
  59. set(c_flags ${c_flags} --analyze -Xanalyzer -analyzer-opt-analyze-headers)
  60. set(cxx_flags ${cxx_flags} --analyze -Xanalyzer -analyzer-opt-analyze-headers)
  61. set(link_flags ${link_flags} --analyze -Wno-unused-command-line-argument)
  62. endif()
  63. endif()
  64. if (EMSCRIPTEN)
  65. set(CMAKE_EXECUTABLE_SUFFIX ".html")
  66. set(link_flags ${link-flags} -sNO_FILESYSTEM=1 -sASSERTIONS=0 -sMALLOC=emmalloc -sINITIAL_MEMORY=33554432 --closure=1)
  67. elseif (OSX_IOS)
  68. set(exe_type MACOSX_BUNDLE)
  69. if (USE_ARC)
  70. set(c_flags ${c_flags} -fobjc-arc)
  71. set(cxx_flags ${cxx_flags} -fobjc-arc)
  72. endif()
  73. set(system_libs ${system_libs} "-framework Foundation" "-framework UIKit" "-framework AudioToolbox" "-framework AVFoundation")
  74. if (SOKOL_BACKEND STREQUAL SOKOL_METAL)
  75. set(system_libs ${system_libs} "-framework Metal" "-framework MetalKit")
  76. else()
  77. set(system_libs ${system_libs} "-framework OpenGLES" "-framework GLKit")
  78. endif()
  79. elseif (ANDROID)
  80. set(system_libs ${system_libs} GLESv3 EGL OpenSLES log android)
  81. # FIXME
  82. elseif (LINUX)
  83. set(THREADS_PREFER_PTHREAD_FLAG ON)
  84. find_package(Threads REQUIRED)
  85. if ((SOKOL_BACKEND STREQUAL SOKOL_GLES3) OR SOKOL_FORCE_EGL)
  86. set(system_libs ${system_libs} X11 Xi Xcursor EGL GL asound dl m Threads::Threads)
  87. else()
  88. set(system_libs ${system_libs} X11 Xi Xcursor GL asound dl m Threads::Threads)
  89. endif()
  90. elseif (OSX_MACOS)
  91. set(exe_type MACOSX_BUNDLE)
  92. if (USE_ARC)
  93. set(c_flags ${c_flags} -fobjc-arc)
  94. set(cxx_flags ${cxx_flags} -fobjc-arc)
  95. endif()
  96. set(system_libs ${system_libs} "-framework QuartzCore" "-framework Cocoa" "-framework AudioToolbox")
  97. if (SOKOL_BACKEND STREQUAL SOKOL_METAL)
  98. set(system_libs ${system_libs} "-framework MetalKit" "-framework Metal")
  99. else()
  100. set(system_libs ${system_libs} "-framework OpenGL")
  101. endif()
  102. elseif (UWP)
  103. set(exe_type WIN32)
  104. elseif (WINDOWS)
  105. set(exe_type WIN32)
  106. endif()
  107. macro(configure_common target)
  108. if (SOKOL_FORCE_EGL)
  109. target_compile_definitions(${target} PRIVATE SOKOL_FORCE_EGL)
  110. endif()
  111. target_compile_definitions(${target} PRIVATE ${SOKOL_BACKEND})
  112. target_link_options(${target} PRIVATE ${link_flags})
  113. target_link_libraries(${target} PRIVATE ${system_libs})
  114. target_include_directories(${target} PRIVATE ../.. ../../util)
  115. target_include_directories(${target} PRIVATE ../ext)
  116. endmacro()
  117. macro(configure_osx_properties target)
  118. if (OSX_IOS)
  119. target_compile_definitions(${target} PRIVATE GLES_SILENCE_DEPRECATION)
  120. endif()
  121. set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${target}")
  122. set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "${target}")
  123. set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_PRODUCT_NAME "${target}")
  124. set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${target}")
  125. endmacro()
  126. macro(configure_c target)
  127. configure_common(${target})
  128. target_compile_options(${target} PRIVATE ${c_flags})
  129. if (OSX_MACOS OR OSX_IOS)
  130. target_compile_options(${target} PRIVATE -x objective-c)
  131. configure_osx_properties(${target})
  132. endif()
  133. endmacro()
  134. macro(configure_cxx target)
  135. configure_common(${target})
  136. target_compile_options(${target} PRIVATE ${cxx_flags})
  137. if (OSX_MACOS OR OSX_IOS)
  138. target_compile_options(${target} PRIVATE -x objective-c++)
  139. configure_osx_properties(${target})
  140. endif()
  141. endmacro()
  142. add_subdirectory(ext)
  143. add_subdirectory(compile)
  144. add_subdirectory(functional)