Common.cmake 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. function(add_engine_dependencies target_name)
  2. if(RENDER_API_MODULE MATCHES "DirectX 11")
  3. add_dependencies(${target_name} BansheeD3D11RenderAPI)
  4. elseif(RENDER_API_MODULE MATCHES "Vulkan")
  5. add_dependencies(${target_name} BansheeVulkanRenderAPI)
  6. else()
  7. add_dependencies(${target_name} BansheeGLRenderAPI)
  8. endif()
  9. if(AUDIO_MODULE MATCHES "FMOD")
  10. add_dependencies(${target_name} BansheeFMOD)
  11. else() # Default to OpenAudio
  12. add_dependencies(${target_name} BansheeOpenAudio)
  13. endif()
  14. add_dependencies(${target_name} BansheeMono BansheeSL BansheePhysX RenderBeast SBansheeEngine)
  15. endfunction()
  16. function(add_subdirectory_optional subdir_name)
  17. get_filename_component(fullPath ${subdir_name} ABSOLUTE)
  18. if(EXISTS ${fullPath}/CMakeLists.txt)
  19. add_subdirectory(${subdir_name})
  20. endif()
  21. endfunction()
  22. # Generates a set of variables pointing to the default locations for library's includes and binaries.
  23. # Must be defined before calling:
  24. # - ${LIB_NAME}_INSTALL_DIR
  25. #
  26. # Will define:
  27. # - ${LIB_NAME}_INCLUDE_SEARCH_DIRS
  28. # - ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS
  29. # - ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS
  30. MACRO(gen_default_lib_search_dirs LIB_NAME)
  31. set(${LIB_NAME}_INCLUDE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/include")
  32. if(BS_64BIT)
  33. list(APPEND ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x64/Release")
  34. list(APPEND ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x64/Debug")
  35. else()
  36. list(APPEND ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x86/Release")
  37. list(APPEND ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x86/Debug")
  38. endif()
  39. # Allow for paths without a configuration specified
  40. if(BS_64BIT)
  41. list(APPEND ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x64")
  42. list(APPEND ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x64")
  43. else()
  44. list(APPEND ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x86")
  45. list(APPEND ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/x86")
  46. endif()
  47. # Allow for paths without a platform specified
  48. list(APPEND ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/Release")
  49. list(APPEND ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib/Debug")
  50. # Allow for paths without a platform or configuration specified
  51. list(APPEND ${LIB_NAME}_LIBRARY_RELEASE_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib")
  52. list(APPEND ${LIB_NAME}_LIBRARY_DEBUG_SEARCH_DIRS "${${LIB_NAME}_INSTALL_DIR}/lib")
  53. ENDMACRO()
  54. MACRO(add_imported_library LIB_NAME RELEASE_NAME DEBUG_NAME IS_SHARED)
  55. if(${IS_SHARED} AND NOT WIN32)
  56. add_library(${LIB_NAME} SHARED IMPORTED)
  57. else()
  58. add_library(${LIB_NAME} STATIC IMPORTED)
  59. endif()
  60. if(CMAKE_CONFIGURATION_TYPES) # Multiconfig generator?
  61. set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION_DEBUG "${DEBUG_NAME}")
  62. set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION_OPTIMIZEDDEBUG "${RELEASE_NAME}")
  63. set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION_RELEASE "${RELEASE_NAME}")
  64. else()
  65. set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION "${RELEASE_NAME}")
  66. endif()
  67. ENDMACRO()
  68. MACRO(find_imported_library3 FOLDER_NAME LIB_NAME DEBUG_LIB_NAME IS_SHARED)
  69. find_library(${LIB_NAME}_LIBRARY_RELEASE NAMES ${LIB_NAME} PATHS ${${FOLDER_NAME}_LIBRARY_RELEASE_SEARCH_DIRS} NO_DEFAULT_PATH)
  70. find_library(${LIB_NAME}_LIBRARY_RELEASE NAMES ${LIB_NAME} PATHS ${${FOLDER_NAME}_LIBRARY_RELEASE_SEARCH_DIRS})
  71. if(${FOLDER_NAME}_LIBRARY_DEBUG_SEARCH_DIRS)
  72. find_library(${LIB_NAME}_LIBRARY_DEBUG NAMES ${DEBUG_LIB_NAME} PATHS ${${FOLDER_NAME}_LIBRARY_DEBUG_SEARCH_DIRS} NO_DEFAULT_PATH)
  73. find_library(${LIB_NAME}_LIBRARY_DEBUG NAMES ${DEBUG_LIB_NAME} PATHS ${${FOLDER_NAME}_LIBRARY_DEBUG_SEARCH_DIRS})
  74. else()
  75. find_library(${LIB_NAME}_LIBRARY_DEBUG NAMES ${DEBUG_LIB_NAME} PATHS ${${FOLDER_NAME}_LIBRARY_RELEASE_SEARCH_DIRS} NO_DEFAULT_PATH)
  76. find_library(${LIB_NAME}_LIBRARY_DEBUG NAMES ${DEBUG_LIB_NAME} PATHS ${${FOLDER_NAME}_LIBRARY_RELEASE_SEARCH_DIRS})
  77. endif()
  78. if(${LIB_NAME}_LIBRARY_RELEASE)
  79. if(${LIB_NAME}_LIBRARY_DEBUG)
  80. add_imported_library(${FOLDER_NAME}::${LIB_NAME} "${${LIB_NAME}_LIBRARY_RELEASE}"
  81. "${${LIB_NAME}_LIBRARY_DEBUG}" ${IS_SHARED})
  82. else()
  83. add_imported_library(${FOLDER_NAME}::${LIB_NAME} "${${LIB_NAME}_LIBRARY_RELEASE}"
  84. "${${LIB_NAME}_LIBRARY_RELEASE}" ${IS_SHARED})
  85. endif()
  86. else()
  87. set(${FOLDER_NAME}_FOUND FALSE)
  88. message(STATUS "...Cannot find imported library: ${LIB_NAME} ${${LIB_NAME}_LIBRARY_RELEASE}")
  89. endif()
  90. list(APPEND ${FOLDER_NAME}_LIBRARIES ${FOLDER_NAME}::${LIB_NAME})
  91. mark_as_advanced(${LIB_NAME}_LIBRARY_RELEASE ${LIB_NAME}_LIBRARY_DEBUG)
  92. ENDMACRO()
  93. MACRO(find_imported_library_shared2 FOLDER_NAME LIB_NAME DEBUG_LIB_NAME)
  94. find_imported_library3(${FOLDER_NAME} ${LIB_NAME} ${DEBUG_LIB_NAME} TRUE)
  95. ENDMACRO()
  96. MACRO(find_imported_library_shared FOLDER_NAME LIB_NAME)
  97. find_imported_library_shared2(${FOLDER_NAME} ${LIB_NAME} ${LIB_NAME})
  98. ENDMACRO()
  99. MACRO(find_imported_library2 FOLDER_NAME LIB_NAME DEBUG_LIB_NAME)
  100. find_imported_library3(${FOLDER_NAME} ${LIB_NAME} ${DEBUG_LIB_NAME} FALSE)
  101. ENDMACRO()
  102. MACRO(find_imported_library FOLDER_NAME LIB_NAME)
  103. find_imported_library2(${FOLDER_NAME} ${LIB_NAME} ${LIB_NAME})
  104. ENDMACRO()
  105. MACRO(find_imported_includes FOLDER_NAME INCLUDE_FILES)
  106. find_path(${FOLDER_NAME}_INCLUDE_DIR NAMES ${INCLUDE_FILES} PATHS ${${FOLDER_NAME}_INCLUDE_SEARCH_DIRS} NO_DEFAULT_PATH)
  107. find_path(${FOLDER_NAME}_INCLUDE_DIR NAMES ${INCLUDE_FILES} PATHS ${${FOLDER_NAME}_INCLUDE_SEARCH_DIRS})
  108. if(${FOLDER_NAME}_INCLUDE_DIR)
  109. set(${FOLDER_NAME}_FOUND TRUE)
  110. else()
  111. message(STATUS "...Cannot find include file \"${INCLUDE_FILES}\" at path ${${FOLDER_NAME}_INCLUDE_SEARCH_DIRS}")
  112. set(${FOLDER_NAME}_FOUND FALSE)
  113. endif()
  114. ENDMACRO()
  115. MACRO(start_find_package FOLDER_NAME)
  116. message(STATUS "Looking for ${FOLDER_NAME} installation...")
  117. ENDMACRO()
  118. MACRO(end_find_package FOLDER_NAME MAIN_LIB_NAME)
  119. if(NOT ${FOLDER_NAME}_FOUND)
  120. if(${FOLDER_NAME}_FIND_REQUIRED)
  121. message(FATAL_ERROR "Cannot find ${FOLDER_NAME} installation. Try modifying the ${FOLDER_NAME}_INSTALL_DIR path.")
  122. elseif(NOT ${FOLDER_NAME}_FIND_QUIETLY)
  123. message(WARNING "Cannot find ${FOLDER_NAME} installation. Try modifying the ${FOLDER_NAME}_INSTALL_DIR path.")
  124. endif()
  125. else()
  126. set_target_properties(${FOLDER_NAME}::${MAIN_LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${${FOLDER_NAME}_INCLUDE_DIR}")
  127. message(STATUS "...${FOLDER_NAME} OK.")
  128. endif()
  129. mark_as_advanced(${FOLDER_NAME}_INSTALL_DIR ${FOLDER_NAME}_INCLUDE_DIR)
  130. set(${FOLDER_NAME}_INCLUDE_DIRS ${${FOLDER_NAME}_INCLUDE_DIR})
  131. ENDMACRO()
  132. function(target_link_framework TARGET FRAMEWORK)
  133. find_library(FM_${FRAMEWORK} ${FRAMEWORK})
  134. if(NOT FM_${FRAMEWORK})
  135. message(FATAL_ERROR "Cannot find ${FRAMEWORK} framework.")
  136. endif()
  137. target_link_libraries(${TARGET} PRIVATE ${FM_${FRAMEWORK}})
  138. endfunction()
  139. function(update_binary_deps DEP_VERSION)
  140. # Clean and create a temporary folder
  141. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../Temp)
  142. execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/../Temp)
  143. if(WIN32)
  144. set(DEP_TYPE VS2015)
  145. elseif(LINUX)
  146. set(DEP_TYPE Linux)
  147. endif()
  148. set(BINARY_DEPENDENCIES_URL http://data.banshee3d.com/BansheeDependencies_${DEP_TYPE}_Master_${DEP_VERSION}.zip)
  149. file(DOWNLOAD ${BINARY_DEPENDENCIES_URL} ${PROJECT_SOURCE_DIR}/../Temp/Dependencies.zip
  150. SHOW_PROGRESS
  151. STATUS DOWNLOAD_STATUS)
  152. list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
  153. if(NOT STATUS_CODE EQUAL 0)
  154. message(FATAL_ERROR "Binary dependencies failed to download from URL: ${BINARY_DEPENDENCIES_URL}")
  155. endif()
  156. message(STATUS "Extracting files. Please wait...")
  157. execute_process(
  158. COMMAND ${CMAKE_COMMAND} -E tar xzf ${PROJECT_SOURCE_DIR}/../Temp/Dependencies.zip
  159. WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/../Temp
  160. )
  161. # Copy executables and dynamic libraries
  162. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../bin)
  163. execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../Temp/bin ${PROJECT_SOURCE_DIR}/../bin)
  164. # Copy static libraries, headers and tools
  165. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../Dependencies)
  166. execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../Temp/Dependencies ${PROJECT_SOURCE_DIR}/../Dependencies)
  167. # Clean up
  168. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../Temp)
  169. endfunction()
  170. function(update_builtin_assets DEP_VERSION)
  171. # Clean and create a temporary folder
  172. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../Temp)
  173. execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/../Temp)
  174. set(ASSET_DEPENDENCIES_URL http://data.banshee3d.com/BansheeData_Master_${DEP_VERSION}.zip)
  175. file(DOWNLOAD ${ASSET_DEPENDENCIES_URL} ${PROJECT_SOURCE_DIR}/../Temp/Dependencies.zip
  176. SHOW_PROGRESS
  177. STATUS DOWNLOAD_STATUS)
  178. list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
  179. if(NOT STATUS_CODE EQUAL 0)
  180. message(FATAL_ERROR "Builtin assets failed to download from URL: ${ASSET_DEPENDENCIES_URL}")
  181. endif()
  182. message(STATUS "Extracting files. Please wait...")
  183. execute_process(
  184. COMMAND ${CMAKE_COMMAND} -E tar xzf ${PROJECT_SOURCE_DIR}/../Temp/Dependencies.zip
  185. WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/../Temp
  186. )
  187. # Copy files
  188. execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../Temp/Data ${PROJECT_SOURCE_DIR}/../Data)
  189. # Make sure timestamp modify date/times are newer (avoids triggering reimport)
  190. execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_SOURCE_DIR}/../Data/Engine/Timestamp.asset )
  191. execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_SOURCE_DIR}/../Data/Editor/Timestamp.asset )
  192. # Make sure resource manifests get rebuilt
  193. execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${PROJECT_SOURCE_DIR}/../Data/Engine/ResourceManifest.asset)
  194. execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${PROJECT_SOURCE_DIR}/../Data/Editor/ResourceManifest.asset)
  195. # Clean up
  196. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../Temp)
  197. endfunction()