CMakeLists.txt 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. cmake_minimum_required (VERSION 3.5.1)
  2. project (Banshee)
  3. # Version
  4. set (Banshee_VERSION_MAJOR 0)
  5. set (Banshee_VERSION_MINOR 3)
  6. # Configuration types
  7. if(CMAKE_CONFIGURATION_TYPES) # Multiconfig generator?
  8. set(CMAKE_CONFIGURATION_TYPES "Debug;OptimizedDebug;Release;" CACHE STRING "" FORCE)
  9. else()
  10. if(NOT CMAKE_BUILD_TYPE)
  11. message("Defaulting to release build.")
  12. set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
  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. # Global compile & linker flags
  22. ## Compiler-agnostic settings
  23. ### Target at least C++11
  24. set(CMAKE_CXX_STANDARD 11)
  25. ## Compiler-specific settings
  26. if(MSVC)
  27. # Linker
  28. set(BS_LINKER_FLAGS_COMMON "/DYNAMICBASE /NOLOGO")
  29. set(BS_LINKER_FLAGS_DEBUG "${BS_LINKER_FLAGS_COMMON} /DEBUG")
  30. set(BS_LINKER_FLAGS_OPTIMIZEDDEBUG "${BS_LINKER_FLAGS_COMMON} /LTCG:incremental /OPT:REF /DEBUG")
  31. set(BS_LINKER_FLAGS_RELEASE "${BS_LINKER_FLAGS_COMMON} /LTCG /INCREMENTAL:NO /OPT:REF")
  32. if(BS_64BIT)
  33. set(BS_LINKER_FLAGS_OPTIMIZEDDEBUG "${BS_LINKER_FLAGS_OPTIMIZEDDEBUG} /OPT:ICF")
  34. set(BS_LINKER_FLAGS_RELEASE "${BS_LINKER_FLAGS_RELEASE} /OPT:ICF")
  35. endif()
  36. set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/DLL ${BS_LINKER_FLAGS_DEBUG}")
  37. set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "/DLL ${BS_LINKER_FLAGS_DEBUG}")
  38. set(CMAKE_EXE_LINKER_FLAGS_DEBUG ${BS_LINKER_FLAGS_DEBUG})
  39. set(CMAKE_SHARED_LINKER_FLAGS_OPTIMIZEDDEBUG "/DLL ${BS_LINKER_FLAGS_OPTIMIZEDDEBUG}")
  40. set(CMAKE_MODULE_LINKER_FLAGS_OPTIMIZEDDEBUG "/DLL ${BS_LINKER_FLAGS_OPTIMIZEDDEBUG}")
  41. set(CMAKE_EXE_LINKER_FLAGS_OPTIMIZEDDEBUG ${BS_LINKER_FLAGS_OPTIMIZEDDEBUG})
  42. set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/DLL ${BS_LINKER_FLAGS_RELEASE}")
  43. set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "/DLL ${BS_LINKER_FLAGS_RELEASE}")
  44. set(CMAKE_EXE_LINKER_FLAGS_RELEASE ${BS_LINKER_FLAGS_RELEASE})
  45. # Compiler
  46. set(BS_COMPILER_FLAGS_COMMON "/GS- /W3 /GR- /WX- /nologo /bigobj /wd\"4577\"")
  47. set(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS")
  48. set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} /ZI /Gm /Od /RTC1 /MDd")
  49. set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} /GL /Gy /Zi /Gm /O2 /Oi /MD")
  50. set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} /GL /Gy /O2 /Oi /MD /MP")
  51. # Global defines
  52. add_definitions(-D_HAS_EXCEPTIONS=0)
  53. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  54. # Note: Optionally add -ffunction-sections, -fdata-sections, but with linker option --gc-sections
  55. set(BS_COMPILER_FLAGS_COMMON "-fpic -fno-exceptions -fno-strict-aliasing -fno-rtti -fno-ms-compatibility -fms-extensions")
  56. set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0")
  57. set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} -gline-tables-only -O2")
  58. set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} -g0 -O2")
  59. elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  60. set(BS_COMPILER_FLAGS_COMMON "-fpic -fno-exceptions -fno-strict-aliasing -fno-rtti")
  61. set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0")
  62. set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} -gline-tables-only -O2")
  63. set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} -g0 -O2")
  64. else()
  65. # TODO_OTHER_COMPILERS_GO_HERE
  66. endif()
  67. # Output
  68. set(CMAKE_BINARY_DIR "${PROJECT_SOURCE_DIR}/../Build/${CMAKE_GENERATOR}/")
  69. if(BS_64BIT)
  70. set(BS_OUTPUT_DIR_PREFIX x64)
  71. else()
  72. set(BS_OUTPUT_DIR_PREFIX x86)
  73. endif()
  74. set(BS_BINARY_OUTPUT_DIR ${PROJECT_SOURCE_DIR}/../bin/${BS_OUTPUT_DIR_PREFIX})
  75. set(BS_LIBRARY_OUTPUT_DIR ${PROJECT_SOURCE_DIR}/../lib/${BS_OUTPUT_DIR_PREFIX})
  76. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BS_BINARY_OUTPUT_DIR}/Debug)
  77. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_OPTIMIZEDDEBUG ${BS_BINARY_OUTPUT_DIR}/OptimizedDebug)
  78. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${BS_BINARY_OUTPUT_DIR}/Release)
  79. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${BS_BINARY_OUTPUT_DIR}/Debug)
  80. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_OPTIMIZEDDEBUG ${BS_BINARY_OUTPUT_DIR}/OptimizedDebug)
  81. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${BS_BINARY_OUTPUT_DIR}/Release)
  82. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${BS_LIBRARY_OUTPUT_DIR}/Debug)
  83. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_OPTIMIZEDDEBUG ${BS_LIBRARY_OUTPUT_DIR}/OptimizedDebug)
  84. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${BS_LIBRARY_OUTPUT_DIR}/Release)
  85. if(WIN32)
  86. set(BS_LIBRARY_EXTENSION ".lib")
  87. else()
  88. set(BS_LIBRARY_EXTENSION ".a")
  89. endif()
  90. function(add_library_per_config target_name lib_name)
  91. add_library(${lib_name} STATIC IMPORTED)
  92. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_DEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${target_name}/lib/${BS_OUTPUT_DIR_PREFIX}/Debug/${lib_name}${BS_LIBRARY_EXTENSION})
  93. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${target_name}/lib/${BS_OUTPUT_DIR_PREFIX}/OptimizedDebug/${lib_name}${BS_LIBRARY_EXTENSION})
  94. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_RELEASE ${PROJECT_SOURCE_DIR}/../Dependencies/${target_name}/lib/${BS_OUTPUT_DIR_PREFIX}/Release/${lib_name}${BS_LIBRARY_EXTENSION})
  95. target_link_libraries(${target_name} PRIVATE ${lib_name})
  96. endfunction()
  97. function(add_library_per_config_suffix target_name lib_name rls_suffix debug_suffix)
  98. add_library(${lib_name} STATIC IMPORTED)
  99. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_DEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${target_name}/lib/${BS_OUTPUT_DIR_PREFIX}/Debug/${lib_name}${debug_suffix}${BS_LIBRARY_EXTENSION})
  100. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG ${PROJECT_SOURCE_DIR}/../Dependencies/${target_name}/lib/${BS_OUTPUT_DIR_PREFIX}/OptimizedDebug/${lib_name}${rls_suffix}${BS_LIBRARY_EXTENSION})
  101. set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION_RELEASE ${PROJECT_SOURCE_DIR}/../Dependencies/${target_name}/lib/${BS_OUTPUT_DIR_PREFIX}/Release/${lib_name}${rls_suffix}${BS_LIBRARY_EXTENSION})
  102. target_link_libraries(${target_name} PRIVATE ${lib_name})
  103. endfunction()
  104. set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)
  105. # Sub-directories
  106. ## Layers
  107. add_subdirectory(BansheeUtility)
  108. add_subdirectory(BansheeCore)
  109. add_subdirectory(BansheeEngine)
  110. add_subdirectory(BansheeEditor)
  111. ## Plugins
  112. if(WIN32)
  113. add_subdirectory(BansheeD3D9RenderAPI)
  114. add_subdirectory(BansheeD3D11RenderAPI)
  115. endif()
  116. add_subdirectory(BansheeGLRenderAPI)
  117. add_subdirectory(BansheeFBXImporter)
  118. add_subdirectory(BansheeFontImporter)
  119. add_subdirectory(BansheeFreeImgImporter)
  120. add_subdirectory(BansheeMono)
  121. add_subdirectory(BansheeOISInput)
  122. add_subdirectory(BansheePhysX)
  123. add_subdirectory(BansheeSL)
  124. add_subdirectory(BansheeOpenAudio)
  125. add_subdirectory(RenderBeast)
  126. ## Script interop
  127. add_subdirectory(SBansheeEngine)
  128. add_subdirectory(SBansheeEditor)
  129. ## Executables
  130. add_subdirectory(BansheeEditorExec)
  131. add_subdirectory(Game)
  132. add_subdirectory(ExampleProject)
  133. ## Managed projects
  134. if(MSVC)
  135. include_external_msproject(MBansheeEngine ${PROJECT_SOURCE_DIR}/MBansheeEngine/MBansheeEngine.csproj)
  136. include_external_msproject(MBansheeEditor ${PROJECT_SOURCE_DIR}/MBansheeEditor/MBansheeEditor.csproj)
  137. add_dependencies(BansheeEditorExec MBansheeEngine MBansheeEditor)
  138. add_dependencies(Game MBansheeEngine)
  139. set_property(TARGET MBansheeEngine PROPERTY FOLDER Script)
  140. set_property(TARGET MBansheeEditor PROPERTY FOLDER Script)
  141. else()
  142. # TODO - Use Mono compiler to build the managed code as a pre-build step
  143. endif()