CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. cmake_minimum_required (VERSION 3.6.1)
  2. project (Banshee)
  3. # Version
  4. set (BS_VERSION_MAJOR 0)
  5. set (BS_VERSION_MINOR 4)
  6. # Configuration types
  7. if(CMAKE_CONFIGURATION_TYPES) # Multiconfig generator?
  8. set(CMAKE_CONFIGURATION_TYPES "Debug;OptimizedDebug;Release;" CACHE INTERNAL "")
  9. else()
  10. if(NOT CMAKE_BUILD_TYPE)
  11. message("Defaulting to release build.")
  12. set(CMAKE_BUILD_TYPE Release CACHE INTERNAL "")
  13. endif()
  14. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
  15. # Set the valid options for cmake-gui drop-down list
  16. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug OptimizedDebug Release)
  17. endif()
  18. if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
  19. set(BS_64BIT true)
  20. endif()
  21. # Options
  22. set(AUDIO_MODULE "OpenAudio" CACHE STRING "Audio backend to use.")
  23. set_property(CACHE AUDIO_MODULE PROPERTY STRINGS OpenAudio FMOD)
  24. set(PHYSICS_MODULE "PhysX" CACHE STRING "Physics backend to use.")
  25. set_property(CACHE PHYSICS_MODULE PROPERTY STRINGS PhysX)
  26. set(INPUT_MODULE "OIS" CACHE STRING "Input backend to use.")
  27. set_property(CACHE INPUT_MODULE PROPERTY STRINGS OIS)
  28. if(WIN32)
  29. set(RENDER_API_MODULE "DirectX 11" CACHE STRING "Render API to use.")
  30. set_property(CACHE RENDER_API_MODULE PROPERTY STRINGS "DirectX 11" "OpenGL" "Vulkan")
  31. else()
  32. set(RENDER_API_MODULE "OpenGL" CACHE STRING "Render API to use.")
  33. set_property(CACHE RENDER_API_MODULE PROPERTY STRINGS "OpenGL" "Vulkan")
  34. endif()
  35. set(RENDERER_MODULE "RenderBeast" CACHE STRING "Renderer backend to use.")
  36. set_property(CACHE RENDERER_MODULE PROPERTY STRINGS RenderBeast)
  37. set(BUILD_SCOPE "Runtime" CACHE STRING "Determines which parts of Banshee to build. Pick Framework to build only the low-level C++ framework. Pick Runtime to build everything, including the framework, scripting API and the editor.")
  38. set_property(CACHE BUILD_SCOPE PROPERTY STRINGS "Runtime" "Framework")
  39. set(INCLUDE_ALL_IN_WORKFLOW OFF CACHE BOOL "If true, all libraries (even those not selected) will be included in the generated workflow. Only relevant for workflow generators like Visual Studio.")
  40. if(BUILD_SCOPE MATCHES "Runtime")
  41. set(BUILD_EDITOR ON)
  42. else()
  43. set(BUILD_EDITOR OFF)
  44. endif()
  45. mark_as_advanced(CMAKE_INSTALL_PREFIX)
  46. # External code
  47. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/Modules/")
  48. # Global compile & linker flags
  49. ## Compiler-agnostic settings
  50. ### Target at least C++14
  51. set(CMAKE_CXX_STANDARD 14)
  52. ## Compiler-specific settings
  53. if(MSVC)
  54. # Linker
  55. set(BS_LINKER_FLAGS_COMMON "/DYNAMICBASE /NOLOGO")
  56. set(BS_LINKER_FLAGS_DEBUG "${BS_LINKER_FLAGS_COMMON} /DEBUG")
  57. set(BS_LINKER_FLAGS_OPTIMIZEDDEBUG "${BS_LINKER_FLAGS_COMMON} /LTCG:incremental /INCREMENTAL:NO /OPT:REF /DEBUG")
  58. set(BS_LINKER_FLAGS_RELEASE "${BS_LINKER_FLAGS_COMMON} /LTCG /INCREMENTAL:NO /OPT:REF")
  59. if(BS_64BIT)
  60. set(BS_LINKER_FLAGS_OPTIMIZEDDEBUG "${BS_LINKER_FLAGS_OPTIMIZEDDEBUG} /OPT:ICF")
  61. set(BS_LINKER_FLAGS_RELEASE "${BS_LINKER_FLAGS_RELEASE} /OPT:ICF")
  62. endif()
  63. set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/DLL ${BS_LINKER_FLAGS_DEBUG}")
  64. set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "/DLL ${BS_LINKER_FLAGS_DEBUG}")
  65. set(CMAKE_EXE_LINKER_FLAGS_DEBUG ${BS_LINKER_FLAGS_DEBUG})
  66. set(CMAKE_SHARED_LINKER_FLAGS_OPTIMIZEDDEBUG "/DLL ${BS_LINKER_FLAGS_OPTIMIZEDDEBUG}")
  67. set(CMAKE_MODULE_LINKER_FLAGS_OPTIMIZEDDEBUG "/DLL ${BS_LINKER_FLAGS_OPTIMIZEDDEBUG}")
  68. set(CMAKE_EXE_LINKER_FLAGS_OPTIMIZEDDEBUG ${BS_LINKER_FLAGS_OPTIMIZEDDEBUG})
  69. set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/DLL ${BS_LINKER_FLAGS_RELEASE}")
  70. set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "/DLL ${BS_LINKER_FLAGS_RELEASE}")
  71. set(CMAKE_EXE_LINKER_FLAGS_RELEASE ${BS_LINKER_FLAGS_RELEASE})
  72. # Compiler
  73. set(BS_COMPILER_FLAGS_COMMON "/GS- /W3 /GR- /WX- /nologo /bigobj /wd\"4577\"")
  74. set(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS")
  75. set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} /Gm /Od /RTC1 /MDd")
  76. if(BS_64BIT) # Debug edit and continue for 64-bit
  77. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /ZI")
  78. else() # Normal debug for 32-bit
  79. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Zi")
  80. endif()
  81. set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} /GL /Gy /Zi /Gm /O2 /Oi /MD")
  82. set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} /GL /Gy /O2 /Oi /MD")
  83. # Global defines
  84. add_definitions(-D_HAS_EXCEPTIONS=0)
  85. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  86. # Note: Optionally add -ffunction-sections, -fdata-sections, but with linker option --gc-sections
  87. # TODO: Use link-time optimization -flto. Might require non-default linker.
  88. set(BS_COMPILER_FLAGS_COMMON "-fpic -fno-exceptions -fno-strict-aliasing -fno-rtti -fno-ms-compatibility -fms-extensions")
  89. set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0")
  90. set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} -gline-tables-only -O2")
  91. set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} -g0 -O2")
  92. elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  93. # TODO: Use link-time optimization -flto. Might require non-default linker.
  94. set(BS_COMPILER_FLAGS_COMMON "-fpic -fno-exceptions -fno-strict-aliasing -fno-rtti")
  95. set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0")
  96. set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} -gline-tables-only -O2")
  97. set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} -g0 -O2")
  98. else()
  99. # TODO_OTHER_COMPILERS_GO_HERE
  100. endif()
  101. # Output
  102. set(CMAKE_BINARY_DIR "${PROJECT_SOURCE_DIR}/../Build/${CMAKE_GENERATOR}/")
  103. if(BS_64BIT)
  104. set(BS_OUTPUT_DIR_PREFIX x64)
  105. else()
  106. set(BS_OUTPUT_DIR_PREFIX x86)
  107. endif()
  108. set(BS_BINARY_OUTPUT_DIR ${PROJECT_SOURCE_DIR}/../bin/${BS_OUTPUT_DIR_PREFIX})
  109. set(BS_LIBRARY_OUTPUT_DIR ${PROJECT_SOURCE_DIR}/../lib/${BS_OUTPUT_DIR_PREFIX})
  110. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BS_BINARY_OUTPUT_DIR}/Debug)
  111. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_OPTIMIZEDDEBUG ${BS_BINARY_OUTPUT_DIR}/OptimizedDebug)
  112. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${BS_BINARY_OUTPUT_DIR}/Release)
  113. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${BS_BINARY_OUTPUT_DIR}/Debug)
  114. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_OPTIMIZEDDEBUG ${BS_BINARY_OUTPUT_DIR}/OptimizedDebug)
  115. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${BS_BINARY_OUTPUT_DIR}/Release)
  116. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${BS_LIBRARY_OUTPUT_DIR}/Debug)
  117. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_OPTIMIZEDDEBUG ${BS_LIBRARY_OUTPUT_DIR}/OptimizedDebug)
  118. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${BS_LIBRARY_OUTPUT_DIR}/Release)
  119. if(WIN32)
  120. set(BS_LIBRARY_EXTENSION ".lib")
  121. else()
  122. set(BS_LIBRARY_EXTENSION ".a")
  123. endif()
  124. function(add_library_per_config target_name lib_name release_name debug_name)
  125. add_library(${lib_name} STATIC IMPORTED)
  126. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_DEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${lib_name}/lib/${BS_OUTPUT_DIR_PREFIX}/${debug_name}${BS_LIBRARY_EXTENSION})
  127. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${lib_name}/lib/${BS_OUTPUT_DIR_PREFIX}/${release_name}${BS_LIBRARY_EXTENSION})
  128. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_RELEASE ${PROJECT_SOURCE_DIR}/../Dependencies/${lib_name}/lib/${BS_OUTPUT_DIR_PREFIX}/${release_name}${BS_LIBRARY_EXTENSION})
  129. target_link_libraries(${target_name} PRIVATE ${lib_name})
  130. endfunction()
  131. function(add_library_per_config_multi target_name lib_name file_name release_name debug_name)
  132. add_library(${lib_name} STATIC IMPORTED)
  133. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_DEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${file_name}/lib/${BS_OUTPUT_DIR_PREFIX}/${debug_name}${BS_LIBRARY_EXTENSION})
  134. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${file_name}/lib/${BS_OUTPUT_DIR_PREFIX}/${release_name}${BS_LIBRARY_EXTENSION})
  135. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_RELEASE ${PROJECT_SOURCE_DIR}/../Dependencies/${file_name}/lib/${BS_OUTPUT_DIR_PREFIX}/${release_name}${BS_LIBRARY_EXTENSION})
  136. target_link_libraries(${target_name} PRIVATE ${lib_name})
  137. endfunction()
  138. function(add_engine_dependencies target_name)
  139. if(RENDER_API_MODULE MATCHES "DirectX 11")
  140. add_dependencies(${target_name} BansheeD3D11RenderAPI)
  141. elseif(RENDER_API_MODULE MATCHES "Vulkan")
  142. add_dependencies(${target_name} BansheeVulkanRenderAPI)
  143. else()
  144. add_dependencies(${target_name} BansheeGLRenderAPI)
  145. endif()
  146. if(AUDIO_MODULE MATCHES "FMOD")
  147. add_dependencies(${target_name} BansheeFMOD)
  148. else() # Default to OpenAudio
  149. add_dependencies(${target_name} BansheeOpenAudio)
  150. endif()
  151. add_dependencies(${target_name} BansheeMono BansheeSL BansheeOISInput BansheePhysX RenderBeast SBansheeEngine)
  152. endfunction()
  153. set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)
  154. # Sub-directories
  155. ## Layers
  156. add_subdirectory(BansheeUtility)
  157. add_subdirectory(BansheeCore)
  158. add_subdirectory(BansheeEngine)
  159. if(BUILD_EDITOR OR MSVC)
  160. add_subdirectory(BansheeEditor)
  161. endif()
  162. ## Plugins
  163. ### If using MSVC include all plugins in the solution (which ones actually build is controlled by dependencies)
  164. if(INCLUDE_ALL_IN_WORKFLOW AND MSVC)
  165. add_subdirectory(BansheeD3D11RenderAPI)
  166. add_subdirectory(BansheeGLRenderAPI)
  167. add_subdirectory(BansheeVulkanRenderAPI)
  168. add_subdirectory(BansheeFMOD)
  169. add_subdirectory(BansheeOpenAudio)
  170. else() # Otherwise include only chosen ones
  171. if(RENDER_API_MODULE MATCHES "DirectX 11")
  172. add_subdirectory(BansheeD3D11RenderAPI)
  173. elseif(RENDER_API_MODULE MATCHES "Vulkan")
  174. add_subdirectory(BansheeVulkanRenderAPI)
  175. else()
  176. add_subdirectory(BansheeGLRenderAPI)
  177. endif()
  178. if(AUDIO_MODULE MATCHES "FMOD")
  179. add_subdirectory(BansheeFMOD)
  180. else() # Default to OpenAudio
  181. add_subdirectory(BansheeOpenAudio)
  182. endif()
  183. endif()
  184. add_subdirectory(RenderBeast)
  185. add_subdirectory(BansheeOISInput)
  186. add_subdirectory(BansheePhysX)
  187. add_subdirectory(BansheeFBXImporter)
  188. add_subdirectory(BansheeFontImporter)
  189. add_subdirectory(BansheeFreeImgImporter)
  190. add_subdirectory(BansheeMono)
  191. add_subdirectory(BansheeSL)
  192. ## Script interop
  193. add_subdirectory(SBansheeEngine)
  194. if(BUILD_EDITOR OR (INCLUDE_ALL_IN_WORKFLOW AND MSVC))
  195. add_subdirectory(SBansheeEditor)
  196. endif()
  197. ## Executables
  198. add_subdirectory(ExampleProject)
  199. if(BUILD_EDITOR OR (INCLUDE_ALL_IN_WORKFLOW AND MSVC))
  200. add_subdirectory(BansheeEditorExec)
  201. add_subdirectory(Game)
  202. endif()
  203. ## Managed projects
  204. if(MSVC)
  205. if(BUILD_EDITOR)
  206. include_external_msproject(MBansheeEngine ${PROJECT_SOURCE_DIR}/MBansheeEngine/MBansheeEngine.csproj)
  207. include_external_msproject(MBansheeEditor ${PROJECT_SOURCE_DIR}/MBansheeEditor/MBansheeEditor.csproj)
  208. set_property(TARGET MBansheeEngine PROPERTY FOLDER Script)
  209. set_property(TARGET MBansheeEditor PROPERTY FOLDER Script)
  210. add_dependencies(BansheeEditorExec MBansheeEngine MBansheeEditor)
  211. add_dependencies(Game MBansheeEngine)
  212. set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT BansheeEditorExec)
  213. endif()
  214. else()
  215. # TODO - Use Mono compiler to build the managed code as a pre-build step
  216. endif()
  217. # Config file
  218. ## Set names of libraries used in the config file
  219. if(RENDER_API_MODULE MATCHES "DirectX 11")
  220. set(RENDER_API_MODULE_LIB BansheeD3D11RenderAPI)
  221. elseif(RENDER_API_MODULE MATCHES "Vulkan")
  222. set(RENDER_API_MODULE_LIB BansheeVulkanRenderAPI)
  223. else()
  224. set(RENDER_API_MODULE_LIB BansheeGLRenderAPI)
  225. endif()
  226. if(AUDIO_MODULE MATCHES "FMOD")
  227. set(AUDIO_MODULE_LIB BansheeFMOD)
  228. else() # Default to OpenAudio
  229. set(AUDIO_MODULE_LIB BansheeOpenAudio)
  230. endif()
  231. set(RENDERER_MODULE_LIB RenderBeast)
  232. set(INPUT_MODULE_LIB BansheeOISInput)
  233. set(PHYSICS_MODULE_LIB BansheePhysX)
  234. if(BUILD_EDITOR)
  235. set(BS_EDITOR_BUILD 1)
  236. else()
  237. set(BS_EDITOR_BUILD 0)
  238. endif()
  239. ## Generate config files
  240. configure_file("${PROJECT_SOURCE_DIR}/CMake/BsEngineConfig.h.in" "${PROJECT_SOURCE_DIR}/BansheeEngine/Include/BsEngineConfig.h")
  241. configure_file("${PROJECT_SOURCE_DIR}/CMake/BsFrameworkConfig.h.in" "${PROJECT_SOURCE_DIR}/BansheeUtility/Include/BsFrameworkConfig.h")