CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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 (e.g. Visual Studio solution). This is useful when working on engine internals with a need for easy access to all parts of it. Only relevant for workflow generators like Visual Studio or XCode.")
  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. # Code generation for script bindings
  155. include(CMake/GenerateScriptBindings.cmake)
  156. # Sub-directories
  157. ## Layers
  158. add_subdirectory(BansheeUtility)
  159. add_subdirectory(BansheeCore)
  160. add_subdirectory(BansheeEngine)
  161. if(BUILD_EDITOR OR MSVC)
  162. add_subdirectory(BansheeEditor)
  163. endif()
  164. ## Plugins
  165. ### If using MSVC include all plugins in the solution (which ones actually build is controlled by dependencies)
  166. if(INCLUDE_ALL_IN_WORKFLOW AND MSVC)
  167. add_subdirectory(BansheeD3D11RenderAPI)
  168. add_subdirectory(BansheeGLRenderAPI)
  169. add_subdirectory(BansheeVulkanRenderAPI)
  170. add_subdirectory(BansheeFMOD)
  171. add_subdirectory(BansheeOpenAudio)
  172. else() # Otherwise include only chosen ones
  173. if(RENDER_API_MODULE MATCHES "DirectX 11")
  174. add_subdirectory(BansheeD3D11RenderAPI)
  175. elseif(RENDER_API_MODULE MATCHES "Vulkan")
  176. add_subdirectory(BansheeVulkanRenderAPI)
  177. else()
  178. add_subdirectory(BansheeGLRenderAPI)
  179. endif()
  180. if(AUDIO_MODULE MATCHES "FMOD")
  181. add_subdirectory(BansheeFMOD)
  182. else() # Default to OpenAudio
  183. add_subdirectory(BansheeOpenAudio)
  184. endif()
  185. endif()
  186. add_subdirectory(RenderBeast)
  187. add_subdirectory(BansheeOISInput)
  188. add_subdirectory(BansheePhysX)
  189. add_subdirectory(BansheeFBXImporter)
  190. add_subdirectory(BansheeFontImporter)
  191. add_subdirectory(BansheeFreeImgImporter)
  192. add_subdirectory(BansheeMono)
  193. add_subdirectory(BansheeSL)
  194. ## Script interop
  195. add_subdirectory(SBansheeEngine)
  196. if(BUILD_EDITOR OR (INCLUDE_ALL_IN_WORKFLOW AND MSVC))
  197. add_subdirectory(SBansheeEditor)
  198. endif()
  199. ## Executables
  200. add_subdirectory(ExampleProject)
  201. add_subdirectory(ExampleLowLevelRendering)
  202. add_subdirectory(ExamplePhysicallyBasedShading)
  203. if(BUILD_EDITOR OR (INCLUDE_ALL_IN_WORKFLOW AND MSVC))
  204. add_subdirectory(BansheeEditorExec)
  205. add_subdirectory(Game)
  206. endif()
  207. ## Managed projects
  208. if(MSVC)
  209. if(BUILD_EDITOR)
  210. include_external_msproject(MBansheeEngine ${PROJECT_SOURCE_DIR}/MBansheeEngine/MBansheeEngine.csproj)
  211. include_external_msproject(MBansheeEditor ${PROJECT_SOURCE_DIR}/MBansheeEditor/MBansheeEditor.csproj)
  212. set_property(TARGET MBansheeEngine PROPERTY FOLDER Script)
  213. set_property(TARGET MBansheeEditor PROPERTY FOLDER Script)
  214. add_dependencies(BansheeEditorExec MBansheeEngine MBansheeEditor)
  215. add_dependencies(Game MBansheeEngine)
  216. set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT BansheeEditorExec)
  217. endif()
  218. else()
  219. # TODO - Use Mono compiler to build the managed code as a pre-build step
  220. endif()
  221. # Config file
  222. ## Set names of libraries used in the config file
  223. if(RENDER_API_MODULE MATCHES "DirectX 11")
  224. set(RENDER_API_MODULE_LIB BansheeD3D11RenderAPI)
  225. elseif(RENDER_API_MODULE MATCHES "Vulkan")
  226. set(RENDER_API_MODULE_LIB BansheeVulkanRenderAPI)
  227. else()
  228. set(RENDER_API_MODULE_LIB BansheeGLRenderAPI)
  229. endif()
  230. if(AUDIO_MODULE MATCHES "FMOD")
  231. set(AUDIO_MODULE_LIB BansheeFMOD)
  232. else() # Default to OpenAudio
  233. set(AUDIO_MODULE_LIB BansheeOpenAudio)
  234. endif()
  235. set(RENDERER_MODULE_LIB RenderBeast)
  236. set(INPUT_MODULE_LIB BansheeOISInput)
  237. set(PHYSICS_MODULE_LIB BansheePhysX)
  238. if(BUILD_EDITOR)
  239. set(BS_EDITOR_BUILD 1)
  240. else()
  241. set(BS_EDITOR_BUILD 0)
  242. endif()
  243. ## Generate config files
  244. configure_file("${PROJECT_SOURCE_DIR}/CMake/BsEngineConfig.h.in" "${PROJECT_SOURCE_DIR}/BansheeEngine/Include/BsEngineConfig.h")
  245. configure_file("${PROJECT_SOURCE_DIR}/CMake/BsFrameworkConfig.h.in" "${PROJECT_SOURCE_DIR}/BansheeUtility/Include/BsFrameworkConfig.h")