CMakeLists.txt 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. # Copyright (c) 2008-2023 the Urho3D project
  2. # License: MIT
  3. # Define target name
  4. set (TARGET_NAME Urho3D)
  5. if (MSVC)
  6. # Set warning level for Urho3D project
  7. add_compile_options (/W3)
  8. endif ()
  9. # Prevent ICE from old MinGW versions, workaround from the GCC bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61189
  10. if (MINGW AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.1 AND NOT URHO3D_64BIT)
  11. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mpreferred-stack-boundary=2")
  12. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mpreferred-stack-boundary=2")
  13. endif ()
  14. check_include_files (stdint.h HAVE_STDINT_H)
  15. if (HAVE_STDINT_H)
  16. add_definitions (-DHAVE_STDINT_H)
  17. endif ()
  18. # For AngelScript big files
  19. if (MSVC)
  20. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj")
  21. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
  22. elseif (MINGW)
  23. if (URHO3D_64BIT)
  24. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wa,-mbig-obj")
  25. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj")
  26. elseif (CMAKE_BUILD_TYPE MATCHES Debug)
  27. SET_SOURCE_FILES_PROPERTIES(AngelScript/Generated_Classes.cpp PROPERTIES COMPILE_FLAGS -Os)
  28. SET_SOURCE_FILES_PROPERTIES(AngelScript/Generated_Classes.cpp PROPERTIES LINK_FLAGS -Os)
  29. SET_SOURCE_FILES_PROPERTIES(AngelScript/Generated_Classes.cpp PROPERTIES STATIC_LIBRARY_FLAGS -Os)
  30. endif ()
  31. endif ()
  32. # Save keep the preprocessor macros (for using the Urho3D library) for later use in generating Urho3D.pc file
  33. get_directory_property (URHO3D_COMPILE_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS)
  34. # Define preprocessor macros (for building the Urho3D library)
  35. add_definitions (-DURHO3D_IS_BUILDING)
  36. if (ANDROID AND DEFINED ENV{ASSET_DIR_INDICATOR})
  37. add_definitions (-DASSET_DIR_INDICATOR=\"$ENV{ASSET_DIR_INDICATOR}\")
  38. endif ()
  39. if ($ENV{COVERITY_SCAN_BRANCH})
  40. # This macro is used when scanning Urho3D library via Coverity-Scan
  41. # TODO: The Coverity-Scan modelling is not yet working properly (anyone interested in static analyzer is welcome to give it another try)
  42. add_definitions (-DCOVERITY_SCAN_MODEL)
  43. endif ()
  44. if (TARGET GLEW)
  45. # These macros are required because Urho3D (OpenGL) headers are exposed to GLEW headers
  46. add_definitions (-DGLEW_STATIC -DGLEW_NO_GLU)
  47. endif ()
  48. if (HAVE_SINCOSF)
  49. add_definitions (-DHAVE_SINCOSF)
  50. elseif (HAVE___SINCOSF)
  51. add_definitions (-DHAVE___SINCOSF)
  52. endif ()
  53. # Enable/disable SIMD instruction set for STB image
  54. if (NEON)
  55. if (XCODE)
  56. if (IOS)
  57. set (SDK iphoneos)
  58. elseif (TVOS)
  59. set (SDK appletvos)
  60. endif ()
  61. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_OTHER_CFLAGS[sdk=${SDK}*] "-DSTBI_NEON $(OTHER_CFLAGS)")
  62. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_OTHER_CPLUSPLUSFLAGS[sdk=${SDK}*] "-DSTBI_NEON $(OTHER_CPLUSPLUSFLAGS)")
  63. else ()
  64. add_definitions (-DSTBI_NEON)
  65. endif ()
  66. elseif (MSVC AND NOT URHO3D_SSE)
  67. add_definitions (-DSTBI_NO_SIMD)
  68. elseif (MINGW AND NOT URHO3D_64BIT AND URHO3D_SSE)
  69. add_definitions (-DSTBI_MINGW_ENABLE_SSE2)
  70. endif ()
  71. if (URHO3D_LUA)
  72. if (NOT URHO3D_SAFE_LUA)
  73. add_definitions (-DTOLUA_RELEASE)
  74. endif ()
  75. if (URHO3D_LUA_RAW_SCRIPT_LOADER)
  76. add_definitions (-DURHO3D_LUA_RAW_SCRIPT_LOADER)
  77. endif ()
  78. endif ()
  79. if (ODBC_VERSION AND NOT ODBC_VERSION VERSION_LESS 3)
  80. add_definitions (-DODBC_3_OR_LATER)
  81. endif ()
  82. if (WIN32)
  83. set (CMAKE_DEBUG_POSTFIX _d)
  84. if (NOT MINGW OR HAVE_RTL_OSVERSIONINFOW)
  85. add_definitions (-DHAVE_RTL_OSVERSIONINFOW)
  86. endif ()
  87. endif ()
  88. if (URHO3D_HASH_DEBUG)
  89. add_definitions (-DURHO3D_HASH_DEBUG)
  90. endif ()
  91. if (URHO3D_SSL)
  92. add_definitions (-DURHO3D_SSL)
  93. if (URHO3D_SSL_DYNAMIC)
  94. add_definitions (-DURHO3D_SSL_DYNAMIC)
  95. endif ()
  96. endif ()
  97. # Define source files
  98. foreach (DIR IK Navigation Network Physics Physics2D Urho2D WebP)
  99. string (TOUPPER URHO3D_${DIR} OPT)
  100. if (NOT ${OPT})
  101. list (APPEND EXCLUDED_SOURCE_DIRS ${DIR})
  102. endif ()
  103. endforeach ()
  104. if (NOT URHO3D_ANGELSCRIPT)
  105. list (APPEND EXCLUDED_SOURCE_DIRS AngelScript)
  106. endif ()
  107. if (NOT URHO3D_LUA)
  108. list (APPEND EXCLUDED_SOURCE_DIRS LuaScript)
  109. endif ()
  110. if (URHO3D_DATABASE)
  111. if (URHO3D_DATABASE_ODBC)
  112. list (APPEND EXCLUDED_SOURCE_DIRS Database/SQLite)
  113. else ()
  114. list (APPEND EXCLUDED_SOURCE_DIRS Database/ODBC)
  115. endif ()
  116. else ()
  117. list (APPEND EXCLUDED_SOURCE_DIRS Database)
  118. endif ()
  119. if (NOT URHO3D_OPENGL)
  120. list (APPEND EXCLUDED_SOURCE_DIRS GraphicsAPI/OpenGL)
  121. endif ()
  122. if (NOT URHO3D_D3D11)
  123. list (APPEND EXCLUDED_SOURCE_DIRS GraphicsAPI/Direct3D11)
  124. endif ()
  125. if (APPLE AND NOT ARM)
  126. set (GLOB_OBJC_PATTERN *.m) # Should only pick up MacFileWatcher.m for macOS platform at the moment
  127. endif ()
  128. string (REPLACE ";" "/[^;]+;" EXCLUDE_PATTERNS "${EXCLUDED_SOURCE_DIRS};")
  129. define_source_files (EXCLUDE_PATTERNS ${EXCLUDE_PATTERNS} GLOB_CPP_PATTERNS *.cpp ${GLOB_OBJC_PATTERN} RECURSE GROUP)
  130. if (URHO3D_GENERATEBINDINGS)
  131. # https://github.com/urho3d/Urho3D/issues/2757
  132. find_package (Doxygen 1.9.2 REQUIRED)
  133. if (NOT DOXYGEN_FOUND)
  134. message (FATAL_ERROR "Doxygen >= 1.9.2 required to generate bindings")
  135. endif ()
  136. # Generating Doxyfile
  137. set (DOXYFILE_PATH "${CMAKE_BINARY_DIR}/Source/Tools/BindingGenerator/generated/Doxyfile")
  138. configure_file ("${CMAKE_SOURCE_DIR}/Source/Tools/BindingGenerator/Doxyfile.in" "${DOXYFILE_PATH}")
  139. set (XML_AST_DIR "${CMAKE_BINARY_DIR}/Source/Tools/BindingGenerator/generated/xml")
  140. set (BINDING_GENERATOR_PATH "${CMAKE_BINARY_DIR}/bin/tool/BindingGenerator")
  141. set (AS_GENERATED_FILES "AngelScript/Generated_Enums.cpp"
  142. "AngelScript/Generated_ObjectTypes.cpp"
  143. "AngelScript/Generated_DefaultConstructors.cpp"
  144. "AngelScript/Generated_Classes.cpp"
  145. "AngelScript/Generated_GlobalVariables.cpp"
  146. "AngelScript/Generated_GlobalFunctions.cpp"
  147. "AngelScript/Generated_Includes.h"
  148. "AngelScript/Generated_Members.h"
  149. "AngelScript/Generated_Templates.h")
  150. set (AS_GENERATED_FILES_FULL_PATHS "${AS_GENERATED_FILES}")
  151. # Add "${CMAKE_SOURCE_DIR}/Source/Urho3D/" to every item in list
  152. list(TRANSFORM AS_GENERATED_FILES_FULL_PATHS PREPEND "${CMAKE_SOURCE_DIR}/Source/Urho3D/")
  153. set (BINDED_HEADER_FILES "${SOURCE_FILES}")
  154. # Header files only are used when generating bindings
  155. list (FILTER BINDED_HEADER_FILES INCLUDE REGEX ".*\.h$")
  156. # Exclude files from AngelScript directory to solve circular dependency
  157. list (FILTER BINDED_HEADER_FILES EXCLUDE REGEX "^AngelScript/")
  158. # Generate xmls and run BindingGenerator
  159. add_custom_command (OUTPUT ${AS_GENERATED_FILES_FULL_PATHS}
  160. #${CMAKE_SOURCE_DIR}/Source/Urho3D/Lua/Generated.cpp
  161. #${CMAKE_SOURCE_DIR}/Source/Urho3D/JavaScript/Generated.cpp
  162. #${CMAKE_SOURCE_DIR}/Source/Urho3D/CSharp/Generated.cpp
  163. #fake_output_to_force_run_every_time
  164. COMMAND ${CMAKE_COMMAND} -E echo "Generating XMLs with AST to ${XML_AST_DIR}"
  165. COMMAND ${DOXYGEN_EXECUTABLE} "${DOXYFILE_PATH}"
  166. COMMAND ${CMAKE_COMMAND} -E echo "Running ${BINDING_GENERATOR_PATH} ${XML_AST_DIR} ${CMAKE_SOURCE_DIR}"
  167. COMMAND "${BINDING_GENERATOR_PATH}" "${XML_AST_DIR}" "${CMAKE_SOURCE_DIR}"
  168. DEPENDS BindingGenerator "${DOXYFILE_PATH}" "${BINDED_HEADER_FILES}"
  169. COMMENT "Generating bindings to script languages")
  170. if (URHO3D_ANGELSCRIPT)
  171. # If generated files already exists they will be in list SOURCE_FILES already.
  172. # But they can also be removed.
  173. # Make sure we have generated files in SOURCE_FILES in a single copy
  174. list (REMOVE_ITEM SOURCE_FILES ${AS_GENERATED_FILES})
  175. list (APPEND SOURCE_FILES ${AS_GENERATED_FILES})
  176. source_group ("Source Files\\AngelScript" FILES ${AS_GENERATED_FILES})
  177. endif()
  178. endif ()
  179. # Define generated source files
  180. if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/librevision.h)
  181. execute_process (COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h -P cmake/Modules/GetUrhoRevision.cmake
  182. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_QUIET ERROR_QUIET)
  183. endif ()
  184. set (URHO3D_DEPS ${STATIC_LIBRARY_TARGETS})
  185. if (TARGET LuaJIT_universal)
  186. list (REMOVE_ITEM URHO3D_DEPS LuaJIT)
  187. set (LuaJIT_universal_symbolic LuaJIT_universal_symbolic)
  188. add_custom_command (OUTPUT ${LuaJIT_universal_symbolic}
  189. COMMAND xcodebuild ARCHS="$(ARCHS)" -target LuaJIT_universal -configuration $(CONFIGURATION)
  190. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  191. list (APPEND SYMBOLIC_SOURCES ${LuaJIT_universal_symbolic})
  192. endif ()
  193. set_source_files_properties (${SYMBOLIC_SOURCES} PROPERTIES SYMBOLIC TRUE)
  194. add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
  195. COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new -P cmake/Modules/GetUrhoRevision.cmake
  196. COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
  197. COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new
  198. DEPENDS ${URHO3D_DEPS} ${CMAKE_SOURCE_DIR}/cmake/Modules/GetUrhoRevision.cmake
  199. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  200. COMMENT "") # Suppress the comment as the header file may or may not be re-generated
  201. source_group ("Source Files\\Generated" FILES ${CMAKE_CURRENT_BINARY_DIR}/librevision.h)
  202. if (URHO3D_LUA)
  203. # The host tool must be built natively
  204. if (CMAKE_CROSSCOMPILING OR URHO3D_LUAJIT)
  205. check_native_compiler_exist ()
  206. # When cross-compiling or using LuaJIT, build the tolua++ host tool as external project using normal Lua (there is not much point using LuaJIT for the tool building even when technically it can)
  207. include (ExternalProject)
  208. if (ANDROID AND DEFINED ENV{TRAVIS})
  209. set (TRAVIS_ANDROID_FIX -DURHO3D_DEPLOYMENT_TARGET=generic)
  210. endif ()
  211. if (IOS OR TVOS)
  212. set (ALTERNATE_COMMAND CMAKE_COMMAND /usr/bin/env -i PATH=$ENV{PATH} CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND} BUILD_COMMAND )
  213. else ()
  214. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND})
  215. endif ()
  216. ExternalProject_Add (tolua++bin
  217. SOURCE_DIR ${CMAKE_SOURCE_DIR}/Source/ThirdParty/toluapp/src/bin
  218. CMAKE_ARGS -D URHO3D_DEPLOYMENT_TARGET=generic -D DEST_RUNTIME_DIR=${CMAKE_BINARY_DIR}/bin/tool -D BAKED_CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR} -D URHO3D_UPDATE_SOURCE_TREE=${URHO3D_UPDATE_SOURCE_TREE} -D CMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
  219. ${TRAVIS_ANDROID_FIX}
  220. ${ALTERNATE_COMMAND})
  221. add_make_clean_files (${CMAKE_BINARY_DIR}/bin/tool/tolua++)
  222. message("Added tolua++ as an external project")
  223. else ()
  224. # Otherwise, build it internally as per normal
  225. add_subdirectory (../ThirdParty/toluapp/src/bin ../ThirdParty/toluapp/src/bin)
  226. endif ()
  227. # Use the host tool to generate source files for tolua++ API binding
  228. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated)
  229. file (GLOB API_PKG_FILES LuaScript/pkgs/*.pkg)
  230. foreach (DIR IK Navigation Network Database Physics Physics2D Urho2D)
  231. string (TOUPPER URHO3D_${DIR} OPT)
  232. if (NOT ${OPT})
  233. list (REMOVE_ITEM API_PKG_FILES ${CMAKE_CURRENT_SOURCE_DIR}/LuaScript/pkgs/${DIR}LuaAPI.pkg)
  234. endif ()
  235. endforeach ()
  236. foreach (API_PKG_FILE ${API_PKG_FILES})
  237. get_filename_component (NAME ${API_PKG_FILE} NAME)
  238. string (REGEX REPLACE LuaAPI\\.pkg$ "" DIR ${NAME})
  239. set (GEN_CPP_FILE ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated/${DIR}LuaAPI.cpp)
  240. list (APPEND LUA_GEN_CPP_FILES ${GEN_CPP_FILE})
  241. file (GLOB PKG_FILES LuaScript/pkgs/${DIR}/*.pkg)
  242. add_custom_command (OUTPUT ${GEN_CPP_FILE}
  243. COMMAND ${CMAKE_BINARY_DIR}/bin/tool/tolua++ -E ${CMAKE_PROJECT_NAME} -L ToCppHook.lua -o ${GEN_CPP_FILE} ${NAME}
  244. DEPENDS tolua++bin ${API_PKG_FILE} ${PKG_FILES} LuaScript/pkgs/ToCppHook.lua
  245. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/LuaScript/pkgs
  246. COMMENT "Generating tolua++ API binding on the fly for ${DIR}")
  247. endforeach ()
  248. source_group ("Source Files\\LuaScript\\Generated" FILES ${LUA_GEN_CPP_FILES})
  249. if (URHO3D_LINT)
  250. execute_process (COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdParty/.clang-tidy ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated)
  251. endif ()
  252. endif ()
  253. # Aggregate all source files
  254. list (APPEND SOURCE_FILES ${GEN_CPP_FILES} ${LUA_GEN_CPP_FILES} librevision.h Urho3D.h ${SYMBOLIC_SOURCES})
  255. # Define dependency libs
  256. # Add include directories to find the precompiled header, export header, and installed headers from third-party libs
  257. set (INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${THIRD_PARTY_INCLUDE_DIR})
  258. if (URHO3D_PHYSICS)
  259. # Bullet library depends on its own include dir to be added in the header search path
  260. # This is more practical than patching its header files in many places to make them work with relative path
  261. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Bullet)
  262. endif ()
  263. if (URHO3D_NAVIGATION)
  264. # DetourTileCache and DetourCrowd libraries depend on Detour's include dir to be added in the header search path
  265. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Detour)
  266. endif ()
  267. if (URHO3D_LUA)
  268. # Lua/LuaJIT library depends on its own include dir to be added in the header search path
  269. # This is more practical than patching its header files in many places to make them work with relative path
  270. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Lua${JIT})
  271. endif ()
  272. # Workaround for GCC 5.4 and above when building a SHARED lib type for Linux platform to fix the undefined symbol "__cpu_model" issue (see #1519)
  273. if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.3.1 AND CMAKE_SYSTEM_NAME STREQUAL Linux AND URHO3D_LIB_TYPE STREQUAL SHARED) # 5.3.1 was the last known good version
  274. list (APPEND LIBS gcc)
  275. endif ()
  276. # Setup library output path
  277. set_output_directories (${CMAKE_BINARY_DIR}/lib ARCHIVE LIBRARY)
  278. # Setup target
  279. if (IOS OR TVOS)
  280. set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
  281. endif ()
  282. setup_library (${URHO3D_LIB_TYPE} ${EXCLUDE_FROM_ALL})
  283. # Workaround for Xcode parrallel build failing: Add the generated sources as a custom target that Urho3D depends on so they are generated first.
  284. if (URHO3D_LUA)
  285. add_custom_target (LuaGenCppFiles
  286. DEPENDS tolua++bin ${LUA_GEN_CPP_FILES})
  287. add_dependencies(${TARGET_NAME} LuaGenCppFiles)
  288. endif()
  289. # Generate platform specific export header file (can only be called after the target has been added)
  290. if (MSVC)
  291. set (APPENDIX "\n#pragma warning(disable: 4251)\n#pragma warning(disable: 4275)\n\n#if _MSC_VER < 1900\n#define strtoll _strtoi64\n#define strtoull _strtoui64\n#endif\n")
  292. endif ()
  293. foreach (DEFINE URHO3D_STATIC_DEFINE URHO3D_OPENGL URHO3D_D3D11 URHO3D_SSE URHO3D_DATABASE_ODBC URHO3D_DATABASE_SQLITE URHO3D_LUAJIT URHO3D_TESTING CLANG_PRE_STANDARD)
  294. if (${DEFINE})
  295. set (APPENDIX "${APPENDIX}#define ${DEFINE}\n")
  296. endif ()
  297. endforeach()
  298. if (URHO3D_FORCE_AS_MAX_PORTABILITY)
  299. set (APPENDIX "${APPENDIX}#define AS_MAX_PORTABILITY\n")
  300. endif ()
  301. generate_export_header (${TARGET_NAME} EXPORT_MACRO_NAME URHO3D_API EXPORT_FILE_NAME Urho3D.h.new CUSTOM_CONTENT_FROM_VARIABLE APPENDIX)
  302. set (COPYRIGHT "// Copyright (c) 2008-2023 the Urho3D project\n// License: MIT\n")
  303. file (READ ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new EXPORT_HEADER)
  304. file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new ${COPYRIGHT}${EXPORT_HEADER})
  305. execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h)
  306. file (REMOVE ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new)
  307. source_group ("Source Files\\Generated" FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h)
  308. # Precompile the header after the export header file has been generated
  309. enable_pch (Precompiled.h)
  310. if (NOT ANDROID AND NOT WEB)
  311. file (READ .soversion SOVERSION)
  312. string (STRIP ${SOVERSION} SOVERSION)
  313. string (REGEX MATCH "([^.]+)\\.([^.]+)\\.(.+)" MATCHED ${SOVERSION})
  314. if (MATCHED)
  315. set_target_properties (${TARGET_NAME} PROPERTIES VERSION ${MATCHED} SOVERSION ${CMAKE_MATCH_1})
  316. else ()
  317. message (FATAL_ERROR "The .soversion file is corrupted. It should contain a version number with this format major(0xFFFF).minor(0xFF).patch-level(0xFF). e.g.: 0.1.2")
  318. endif ()
  319. else ()
  320. set_target_properties (${TARGET_NAME} PROPERTIES NO_SONAME TRUE)
  321. endif ()
  322. # TODO: to use 'xcframework' as Apple discourages the use of 'lipo' to create universal binary combining libs/frameworks from different SDK
  323. # As of Xcode 12 the 'iphonesimulator' SDK produces binary for both 'x86_64' and 'arm64' archs
  324. # This has caused problem with 'lipo' to combine the already FAT lib from 'iphonesimulator' SDK with 'iphoneos' SDK containing 'arm64' arch
  325. # Temporary workaround by not generating the universal binary when the issue is detected
  326. if (IOS)
  327. # Add a custom target to build Mach-O universal binary consisting of both iPhoneOS and iPhoneSimulator SDKs
  328. add_custom_target (${TARGET_NAME}_universal ALL
  329. COMMAND true #if [ '$(CONFIGURATION)' != 'Debug' ]\; then if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |egrep -cq 'x86_64.*arm64|arm64.*x86_64'\; then echo $<TARGET_FILE:${TARGET_NAME}> is already a Mach-O universal binary consisting of both iphoneos and iphonesimulator SDKs\; else mv $<TARGET_FILE:${TARGET_NAME}>{,.ori} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.ori 2>/dev/null |egrep -cq x86_64\; then sdk=iphoneos\; else sdk=iphonesimulator\; fi && xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION) -sdk $$sdk 2>&1 && mv $<TARGET_FILE:${TARGET_NAME}>{,.$$sdk} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.$$sdk 2>/dev/null |egrep -cq 'x86_64.*arm64|arm64.*x86_64'\; then echo 'Skip on Xcode 12 due to arch conflict' && mv $<TARGET_FILE:${TARGET_NAME}>{.ori,} && rm $<TARGET_FILE:${TARGET_NAME}>.$$sdk\; else lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{,.ori,.$$sdk} && rm $<TARGET_FILE:${TARGET_NAME}>{.ori,.$$sdk}\; fi\; fi\; fi
  330. DEPENDS ${TARGET_NAME}
  331. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  332. COMMENT "DISABLED: Creating Mach-O universal binary library consisting of both iPhoneOS and iPhoneSimulator SDks")
  333. install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${DEST_LIBRARY_DIR})
  334. elseif (TVOS)
  335. # Add a custom target to build Mach-O universal binary consisting of both AppleTVOS and AppleTVSimulator SDKs
  336. add_custom_target (${TARGET_NAME}_universal ALL
  337. COMMAND true #if [ '$(CONFIGURATION)' != 'Debug' ]\; then if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |egrep -cq 'x86_64.*arm64|arm64.*x86_64'\; then echo $<TARGET_FILE:${TARGET_NAME}> is already a Mach-O universal binary consisting of both AppleTVOS and AppleTVSimulator SDKs\; else mv $<TARGET_FILE:${TARGET_NAME}>{,.ori} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.ori 2>/dev/null |grep -cq x86_64\; then sdk=appletvos\; else sdk=appletvsimulator\; fi && xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION) -sdk $$sdk 2>&1 && mv $<TARGET_FILE:${TARGET_NAME}>{,.$$sdk} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.$$sdk 2>/dev/null |egrep -cq 'x86_64.*arm64|arm64.*x86_64'\; then echo 'Skip on Xcode 12 due to arch conflict' && mv $<TARGET_FILE:${TARGET_NAME}>{.ori,} && rm $<TARGET_FILE:${TARGET_NAME}>.$$sdk\; else lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{,.ori,.$$sdk} && rm $<TARGET_FILE:${TARGET_NAME}>{.ori,.$$sdk}\; fi\; fi\; fi
  338. DEPENDS ${TARGET_NAME}
  339. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  340. COMMENT "DISABLED: Creating Mach-O universal binary library consisting of both AppleTVOS and AppleTVSimulator SDKs")
  341. install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${DEST_LIBRARY_DIR})
  342. # TODO: Temporary workaround as CMake does not recognize AppleTV platform yet
  343. add_dependencies (${TARGET_NAME} APPLETV_POST_CMAKE_FIX)
  344. elseif (EMSCRIPTEN)
  345. install (TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${DEST_LIBRARY_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ARCHIVE DESTINATION ${DEST_LIBRARY_DIR})
  346. else ()
  347. install (TARGETS ${TARGET_NAME} RUNTIME DESTINATION ${DEST_RUNTIME_DIR} LIBRARY DESTINATION ${DEST_LIBRARY_DIR} ARCHIVE DESTINATION ${DEST_LIBRARY_DIR})
  348. endif ()
  349. if (WIN32 AND URHO3D_LIB_TYPE STREQUAL SHARED)
  350. set (URHO3D_DLL_INSTALLED TRUE)
  351. endif ()
  352. # TODO: This seems out of place
  353. if (MINGW)
  354. set (CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES_INIT} -lwinmm")
  355. set (CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES_INIT} -lwinmm")
  356. if (URHO3D_LIB_TYPE STREQUAL SHARED)
  357. set_target_properties (${TARGET_NAME} PROPERTIES PREFIX "")
  358. endif ()
  359. endif ()
  360. # Setup dependency libraries to be linked or archived as a whole inside Urho3D library for SHARED or STATIC lib type, respectively
  361. if (APPLE)
  362. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -force_load)
  363. elseif (MSVC)
  364. foreach (THIRD_PARTY_LIB ${STATIC_LIBRARY_TARGETS})
  365. if (NOT ${THIRD_PARTY_LIB} MATCHES boost|rapidjson|STB) # Exclude header-only "fake" static libs
  366. # Must be specified for each library https://github.com/urho3d/Urho3D/issues/2760
  367. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_OPTIONS /WHOLEARCHIVE:${THIRD_PARTY_LIB}) # Require VS 2015 Update 2 onward
  368. endif ()
  369. endforeach ()
  370. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_OPTIONS /FORCE)
  371. else ()
  372. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -Wl,--whole-archive)
  373. endif ()
  374. foreach (TARGET ${STATIC_LIBRARY_TARGETS})
  375. set (ARCHIVE $<TARGET_FILE:${TARGET}>)
  376. if (NOT ${TARGET} MATCHES boost|rapidjson|STB) # Exclude header-only "fake" static lib targets
  377. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES ${ARCHIVE}) # Should work for all compiler toolchains while building shared library
  378. if (URHO3D_LIB_TYPE STREQUAL STATIC)
  379. if (XCODE OR MSVC) # Only works in Xcode and MSVC while building static library
  380. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY STATIC_LIBRARY_OPTIONS ${ARCHIVE})
  381. else ()
  382. list (APPEND ARCHIVES ${ARCHIVE}) # Accumulate the target locations for archiving later
  383. endif ()
  384. endif ()
  385. endif ()
  386. endforeach ()
  387. if (NOT XCODE AND NOT MSVC)
  388. if (NOT APPLE)
  389. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -Wl,--no-whole-archive) # GCC/Clang-specific to pair up with whole-archive linker option
  390. endif ()
  391. if (URHO3D_LIB_TYPE STREQUAL STATIC)
  392. if (APPLE)
  393. # Apple libtool takes archives directly as input
  394. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  395. COMMAND mv $<TARGET_FILE:${TARGET_NAME}>{,.engine}
  396. COMMAND libtool -static $<TARGET_FILE:${TARGET_NAME}>.engine ${ARCHIVES} -o $<TARGET_FILE:${TARGET_NAME}>
  397. COMMAND rm $<TARGET_FILE:${TARGET_NAME}>.engine
  398. COMMENT "Merging all archives into a single static library using libtool")
  399. elseif (EMSCRIPTEN OR CMAKE_BINARY_DIR MATCHES "[ +*;,]")
  400. # Do it the hard way by first extracting the object (bitcode) files and appending them to final archive:
  401. # a) For Emscripten build as Emscripten emar (llvm-ar) neither takes archives directly as input nor supports MRI-style script
  402. # b) When the build tree path contains special characters for MRI scripts (space, '+', '*', ';', ',') as escaping is not supported
  403. get_filename_component (AR ${CMAKE_AR} NAME_WE)
  404. if (CMAKE_HOST_WIN32)
  405. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  406. COMMAND ${CMAKE_COMMAND} -E remove_directory archives
  407. COMMAND ${CMAKE_COMMAND} -E echo "Merging all archives into a single static library using ${AR}")
  408. foreach (ARCHIVE ${ARCHIVES})
  409. # Merge per library because Window cmd shell does not handle long argument list
  410. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory archives)
  411. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  412. COMMAND ${CMAKE_AR} x ${ARCHIVE}
  413. COMMAND ${CMAKE_COMMAND} -E echo_append "\\\"${CMAKE_AR}\\\"" q \\\"$<TARGET_FILE:${TARGET_NAME}>\\\" " " >merge.bat
  414. COMMAND for /F %%i in ('dir /B *.o*') do ${CMAKE_COMMAND} -E echo_append %%i" " >>merge.bat
  415. COMMAND merge.bat WORKING_DIRECTORY archives)
  416. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory archives)
  417. endforeach ()
  418. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${TARGET_NAME}>)
  419. else ()
  420. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  421. COMMAND ${CMAKE_COMMAND} -E remove_directory archives
  422. COMMAND ${CMAKE_COMMAND} -E make_directory archives COMMENT "Merging all archives into a single static library using ${AR}")
  423. foreach (ARCHIVE ${ARCHIVES})
  424. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_AR} x ${ARCHIVE} WORKING_DIRECTORY archives)
  425. endforeach ()
  426. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_AR} q $<TARGET_FILE:${TARGET_NAME}> `ls -1` WORKING_DIRECTORY archives)
  427. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  428. COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${TARGET_NAME}>
  429. COMMAND ${CMAKE_COMMAND} -E remove_directory archives)
  430. endif ()
  431. else ()
  432. # GCC ar does not take archives directly as input like Apple libtool, however, it can be scripted to do so
  433. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  434. COMMAND ${CMAKE_COMMAND} -E rename $<TARGET_FILE:${TARGET_NAME}> $<TARGET_FILE:${TARGET_NAME}>.engine
  435. COMMAND echo CREATE $<TARGET_FILE:${TARGET_NAME}> >script.ar
  436. COMMAND echo ADDLIB $<TARGET_FILE:${TARGET_NAME}>.engine >>script.ar)
  437. foreach (ARCHIVE ${ARCHIVES})
  438. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND echo ADDLIB ${ARCHIVE} >>script.ar)
  439. endforeach ()
  440. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  441. COMMAND echo SAVE >>script.ar
  442. COMMAND echo END >>script.ar
  443. COMMAND ${CMAKE_AR} -M <script.ar
  444. COMMAND ${CMAKE_COMMAND} -E remove $<TARGET_FILE:${TARGET_NAME}>.engine script.ar
  445. COMMENT "Merging all archives into a single static library using ar")
  446. endif ()
  447. endif ()
  448. endif ()
  449. # Use PIC on platforms that support it (shared library type has this property set to true by default, so we only have to deal with those static ones that the shared library links against)
  450. if (NOT URHO3D_LIB_TYPE STREQUAL STATIC)
  451. set_target_properties (${STATIC_LIBRARY_TARGETS} PROPERTIES POSITION_INDEPENDENT_CODE true)
  452. endif ()
  453. # Install headers for using the Urho3D library
  454. install_header_files (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h DESTINATION ${DEST_INCLUDE_DIR} ACCUMULATE GENERATED_HEADERS)
  455. install_header_files (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${DEST_INCLUDE_DIR} FILES_MATCHING PATTERN *.h ACCUMULATE URHO_HEADERS) # Note: the trailing slash is significant
  456. # Generate the include-all-headers header file even though we do not encourage Urho3D library users to use it
  457. list (SORT URHO_HEADERS)
  458. list (REVERSE URHO_HEADERS)
  459. set (OPTIONAL_SUBS AngelScript Database IK LuaScript Navigation Network Physics Physics2D Urho2D)
  460. foreach (SUB ${OPTIONAL_SUBS})
  461. if (URHO_HEADERS MATCHES "(include/Urho3D/${SUB}/[^;]+)")
  462. list (FIND URHO_HEADERS ${CMAKE_MATCH_1} FOUND_INDEX)
  463. list (INSERT URHO_HEADERS ${FOUND_INDEX} "#endif")
  464. endif ()
  465. endforeach ()
  466. list (REVERSE URHO_HEADERS)
  467. foreach (SUB ${OPTIONAL_SUBS})
  468. if (URHO_HEADERS MATCHES "(include/Urho3D/${SUB}/[^;]+)")
  469. string (TOUPPER ${SUB} SUB)
  470. if("${SUB}" STREQUAL "LUASCRIPT")
  471. set (SUB "LUA")
  472. endif ()
  473. list (FIND URHO_HEADERS ${CMAKE_MATCH_1} FOUND_INDEX)
  474. list (INSERT URHO_HEADERS ${FOUND_INDEX} "#if URHO3D_${SUB}")
  475. endif ()
  476. endforeach ()
  477. string (REGEX REPLACE "include/[^;]+(DebugNew|Direct3D|GraphicsImpl|IKConverters|ODBC|OpenGL|Precompiled|SQLite|ToluaUtils|Urho3D|librevision|wrap\.h|aswrappedcall\.h)[^;]*;" "" URHO_HEADERS "${URHO_HEADERS};")
  478. string (REGEX REPLACE "include/([^;]+)" "#include <\\1>" URHO_HEADERS "${GENERATED_HEADERS};;${URHO_HEADERS}")
  479. string (REPLACE ";" \n URHO_HEADERS "${URHO_HEADERS}")
  480. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Urho3DAll.h.in ${CMAKE_CURRENT_BINARY_DIR}/Urho3DAll.h)
  481. install_header_files (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3DAll.h ${CMAKE_CURRENT_BINARY_DIR}/librevision.h DESTINATION ${DEST_INCLUDE_DIR})
  482. # Generate platform specific pkg-config file for the benefit of Urho3D library users via SDK without CMake
  483. if (ABSOLUTE_PATH_LIBS)
  484. string (REPLACE ";" "\" \"" URHO3D_ABS_PATH_LIBS "\"${ABSOLUTE_PATH_LIBS}\"") # Note: need to always "stringify" a variable in list context for replace to work correctly, besides the list could be empty
  485. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" URHO3D_ABS_PATH_LIBS "${URHO3D_ABS_PATH_LIBS}")
  486. endif ()
  487. if (MSVC)
  488. set (DASH /)
  489. set (LIB_DIR "/LIBPATH:\"\${libdir}\"")
  490. string (REPLACE ";" ".lib\" \"" URHO3D_LIBS "\"@LIB_NAME@\" \"${LIBS}.lib\"")
  491. set (PC_SUFFIX .msvc)
  492. else ()
  493. set (LIB_NAME ${TARGET_NAME})
  494. if (MINGW)
  495. if (CMAKE_BUILD_TYPE STREQUAL Debug)
  496. set (LIB_NAME ${LIB_NAME}_d)
  497. endif ()
  498. if (URHO3D_LIB_TYPE STREQUAL SHARED)
  499. set (LIB_NAME ${LIB_NAME}.dll)
  500. endif ()
  501. endif ()
  502. set (DASH -)
  503. set (LIB_DIR "-L\"\${libdir}\"")
  504. string (REPLACE ";" " -l" URHO3D_LIBS "-l${LIB_NAME};${LIBS}")
  505. endif ()
  506. string (REPLACE ";" " ${DASH}D" URHO3D_COMPILE_DEFINITIONS "${DASH}D${URHO3D_COMPILE_DEFINITIONS}")
  507. get_directory_property (GLOBAL_INCLUDE_DIRS DIRECTORY ${CMAKE_SOURCE_DIR} INCLUDE_DIRECTORIES)
  508. if (GLOBAL_INCLUDE_DIRS)
  509. string (REPLACE ";" "\" ${DASH}I\"" GLOBAL_INCLUDE_DIRS "${DASH}I\"${GLOBAL_INCLUDE_DIRS}\"")
  510. string (REPLACE "${SYSROOT}" "" GLOBAL_INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS})
  511. endif ()
  512. set (ENGINE_INCLUDE_DIRS "${DASH}I\"\${includedir}\" ${DASH}I\"\${includedir}/Urho3D/ThirdParty\"")
  513. if (URHO3D_PHYSICS)
  514. # Bullet library depends on its own include dir to be added in the header search path
  515. # This is more practical than patching its header files in many places to make them work with relative path
  516. set (ENGINE_INCLUDE_DIRS "${ENGINE_INCLUDE_DIRS} ${DASH}I\"\${includedir}/Urho3D/ThirdParty/Bullet\"")
  517. endif ()
  518. if (URHO3D_LUA)
  519. # ditto for Lua/LuaJIT
  520. set (ENGINE_INCLUDE_DIRS "${ENGINE_INCLUDE_DIRS} ${DASH}I\"\${includedir}/Urho3D/ThirdParty/Lua${JIT}\"")
  521. endif ()
  522. string (REGEX REPLACE " -include \"[^\"]+\"" "" CLEANED_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  523. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" CLEANED_CMAKE_CXX_FLAGS "${CLEANED_CMAKE_CXX_FLAGS}")
  524. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" CLEANED_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  525. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Urho3D.pc.in ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.pc${PC_SUFFIX} @ONLY)
  526. if (MSVC)
  527. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -DLIB_NAME=$<TARGET_LINKER_FILE_NAME:${TARGET_NAME}> -P ${CMAKE_SOURCE_DIR}/cmake/Modules/AdjustPkgConfigForMSVC.cmake)
  528. endif ()
  529. if (ANDROID)
  530. # After migration to Gradle build system we do not support Android cross-compiling build via pkgconfig anymore, however, this file is still being provided as reference only
  531. set (RENAME RENAME Urho3D-${ANDROID_ABI}.pc)
  532. endif ()
  533. install (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.pc DESTINATION ${DEST_PKGCONFIG_DIR} ${RENAME})
  534. # Define post build steps
  535. if (URHO3D_LIB_TYPE STREQUAL SHARED AND ARM)
  536. # Strip the output shared library for embedded ARM platforms (we don't do this for Android anymore, assuming Android plugin will take care of it)
  537. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${TARGET_NAME}>
  538. COMMENT "Stripping Urho3D shared library")
  539. endif ()
  540. if (URHO3D_SCP_TO_TARGET)
  541. # Ensure SCP is the last command
  542. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND scp $<TARGET_FILE:${TARGET_NAME}> ${URHO3D_SCP_TO_TARGET} || exit 0
  543. COMMENT "Scp-ing Urho3D library to target system")
  544. endif ()
  545. if (URHO3D_FORCE_AS_MAX_PORTABILITY)
  546. add_definitions (-DAS_MAX_PORTABILITY)
  547. endif ()