CMakeLists.txt 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. #
  2. # Copyright (c) 2008-2017 the Urho3D project.
  3. #
  4. # Permission is hereby granted, free of charge, to any person obtaining a copy
  5. # of this software and associated documentation files (the "Software"), to deal
  6. # in the Software without restriction, including without limitation the rights
  7. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. # copies of the Software, and to permit persons to whom the Software is
  9. # furnished to do so, subject to the following conditions:
  10. #
  11. # The above copyright notice and this permission notice shall be included in
  12. # all copies or substantial portions of the Software.
  13. #
  14. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. # THE SOFTWARE.
  21. #
  22. # Define target name
  23. set (TARGET_NAME Urho3D)
  24. # Generate JSON compilation database format specification
  25. if (URHO3D_CLANG_TOOLS OR URHO3D_BINDINGS)
  26. set (CMAKE_EXPORT_COMPILE_COMMANDS 1)
  27. # Clang assumes all their tools to be installed in a relative path to their libs but this is not the case for our own Clang-tools
  28. # Clang has a hard-coded way to search for their headers (see http://clang.llvm.org/docs/LibTooling.html#builtin-includes)
  29. # In order for our Clang-tools to work correctly we need to make this Clang's assumption to be true
  30. execute_process (COMMAND ${LLVM_CONFIG} --version OUTPUT_VARIABLE LLVM_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
  31. string (REGEX REPLACE "([.0123456789]+).*" \\1 LLVM_VERSION "${LLVM_VERSION}") # Stringify against empty output variable
  32. execute_process (COMMAND ${LLVM_CONFIG} --libdir OUTPUT_VARIABLE LLVM_LIBDIR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
  33. execute_process (COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/bin/tool/lib/clang/${LLVM_VERSION})
  34. create_symlink (${LLVM_LIBDIR}/clang/${LLVM_VERSION}/include ${CMAKE_BINARY_DIR}/bin/tool/lib/clang/${LLVM_VERSION}/include FALLBACK_TO_COPY)
  35. # TODO: Remove this workaround when Travis CI VM has been migrated to Ubuntu 14.04 LTS (ancient glibc header has incorrect defines)
  36. if (DEFINED ENV{TRAVIS})
  37. add_definitions (-D__extern_always_inline=inline)
  38. endif ()
  39. endif ()
  40. # Save keep the preprocessor macros (for using the Urho3D library) for later use in generating Urho3D.pc file
  41. get_directory_property (URHO3D_COMPILE_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS)
  42. # Define preprocessor macros (for building the Urho3D library)
  43. add_definitions (-DURHO3D_IS_BUILDING)
  44. if (ANDROID AND DEFINED ENV{ASSET_DIR_INDICATOR})
  45. add_definitions (-DASSET_DIR_INDICATOR=\"$ENV{ASSET_DIR_INDICATOR}\")
  46. endif ()
  47. if ($ENV{COVERITY_SCAN_BRANCH})
  48. # This macro is used when scanning Urho3D library via Coverity-Scan
  49. # TODO: The Coverity-Scan modelling is not yet working properly (anyone interested in static analyzer is welcome to give it another try)
  50. add_definitions (-DCOVERITY_SCAN_MODEL)
  51. endif ()
  52. if (TARGET GLEW)
  53. # These macros are required because Urho3D (OpenGL) headers are exposed to GLEW headers
  54. add_definitions (-DGLEW_STATIC -DGLEW_NO_GLU)
  55. endif ()
  56. if (HAVE_SINCOSF)
  57. add_definitions (-DHAVE_SINCOSF)
  58. elseif (HAVE___SINCOSF)
  59. add_definitions (-DHAVE___SINCOSF)
  60. endif ()
  61. # Enable/disable SIMD instruction set for STB image
  62. if (NEON)
  63. if (XCODE)
  64. if (IOS)
  65. set (SDK iphoneos)
  66. elseif (TVOS)
  67. set (SDK appletvos)
  68. endif ()
  69. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_OTHER_CFLAGS[sdk=${SDK}*] "-DSTBI_NEON $(OTHER_CFLAGS)")
  70. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_OTHER_CPLUSPLUSFLAGS[sdk=${SDK}*] "-DSTBI_NEON $(OTHER_CPLUSPLUSFLAGS)")
  71. else ()
  72. add_definitions (-DSTBI_NEON)
  73. endif ()
  74. elseif (MSVC AND NOT URHO3D_SSE)
  75. add_definitions (-DSTBI_NO_SIMD)
  76. elseif (MINGW AND NOT URHO3D_64BIT AND URHO3D_SSE)
  77. add_definitions (-DSTBI_MINGW_ENABLE_SSE2)
  78. endif ()
  79. if (URHO3D_LUA)
  80. if (NOT URHO3D_SAFE_LUA)
  81. add_definitions (-DTOLUA_RELEASE)
  82. endif ()
  83. if (URHO3D_LUA_RAW_SCRIPT_LOADER)
  84. add_definitions (-DURHO3D_LUA_RAW_SCRIPT_LOADER)
  85. endif ()
  86. endif ()
  87. if (ODBC_VERSION AND NOT ODBC_VERSION VERSION_LESS 3)
  88. add_definitions (-DODBC_3_OR_LATER)
  89. endif ()
  90. if (WIN32)
  91. set (CMAKE_DEBUG_POSTFIX _d)
  92. endif ()
  93. # Define source files
  94. foreach (DIR IK Navigation Network Physics Urho2D)
  95. string (TOUPPER URHO3D_${DIR} OPT)
  96. if (NOT ${OPT})
  97. list (APPEND EXCLUDED_SOURCE_DIRS ${DIR})
  98. endif ()
  99. endforeach ()
  100. if (NOT URHO3D_ANGELSCRIPT)
  101. list (APPEND EXCLUDED_SOURCE_DIRS AngelScript)
  102. endif ()
  103. if (NOT URHO3D_LUA)
  104. list (APPEND EXCLUDED_SOURCE_DIRS LuaScript)
  105. endif ()
  106. if (URHO3D_DATABASE)
  107. if (URHO3D_DATABASE_ODBC)
  108. list (APPEND EXCLUDED_SOURCE_DIRS Database/SQLite)
  109. else ()
  110. list (APPEND EXCLUDED_SOURCE_DIRS Database/ODBC)
  111. endif ()
  112. else ()
  113. list (APPEND EXCLUDED_SOURCE_DIRS Database)
  114. endif ()
  115. if (URHO3D_OPENGL)
  116. # Exclude the opposite source directory
  117. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/Direct3D9 Graphics/Direct3D11)
  118. else ()
  119. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/OpenGL)
  120. if (URHO3D_D3D11)
  121. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/Direct3D9)
  122. else ()
  123. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/Direct3D11)
  124. endif ()
  125. endif ()
  126. if (APPLE AND NOT IOS)
  127. set (GLOB_OBJC_PATTERN *.m) # Should only pick up MacFileWatcher.m for MacOSX platform at the moment
  128. endif ()
  129. string (REPLACE ";" "/[^;]+;" EXCLUDE_PATTERNS "${EXCLUDED_SOURCE_DIRS};")
  130. define_source_files (EXCLUDE_PATTERNS ${EXCLUDE_PATTERNS} GLOB_CPP_PATTERNS *.cpp ${GLOB_OBJC_PATTERN} RECURSE GROUP PCH Precompiled.h)
  131. # Define generated source files
  132. if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/librevision.h)
  133. execute_process (COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h -P CMake/Modules/GetUrhoRevision.cmake
  134. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_QUIET ERROR_QUIET)
  135. endif ()
  136. set (URHO3D_DEPS ${STATIC_LIBRARY_TARGETS})
  137. if (TARGET LuaJIT_universal)
  138. list (REMOVE_ITEM URHO3D_DEPS LuaJIT)
  139. set (LuaJIT_universal_symbolic LuaJIT_universal_symbolic)
  140. add_custom_command (OUTPUT ${LuaJIT_universal_symbolic}
  141. COMMAND xcodebuild ARCHS="$(ARCHS)" -target LuaJIT_universal -configuration $(CONFIGURATION)
  142. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  143. list (APPEND SYMBOLIC_SOURCES ${LuaJIT_universal_symbolic})
  144. endif ()
  145. set_source_files_properties (${SYMBOLIC_SOURCES} PROPERTIES SYMBOLIC TRUE)
  146. add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
  147. COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new -P CMake/Modules/GetUrhoRevision.cmake
  148. COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
  149. COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new
  150. DEPENDS ${URHO3D_DEPS} ${CMAKE_SOURCE_DIR}/CMake/Modules/GetUrhoRevision.cmake
  151. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  152. COMMENT "") # Suppress the comment as the header file may or may not be re-generated
  153. # Use the AutoBinder tool to generate source files for binding script subsystems
  154. if (URHO3D_BINDINGS)
  155. # Build the Clang-tools as external project (even when we are not cross-compiling because it needs C++11 standard on) for auto-binding generation
  156. include (ExternalProject)
  157. if (IOS)
  158. # For iOS target, ensure the host environment is cleared first; Also workaround a known CMake/Xcode generator bug which prevents it from installing binaries correctly
  159. 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 bash -c "sed -i '' 's/EFFECTIVE_PLATFORM_NAME//g' CMakeScripts/install_postBuildPhase.make*")
  160. else ()
  161. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND})
  162. endif ()
  163. ExternalProject_Add (AutoBinder
  164. SOURCE_DIR ${CMAKE_SOURCE_DIR}/Source/Clang-Tools
  165. CMAKE_ARGS -DURHO3D_CLANG_TOOLS=AutoBinder -DDEST_RUNTIME_DIR=${CMAKE_BINARY_DIR}/bin/tool/clang -DDEST_INCLUDE_DIR=${DEST_INCLUDE_DIR} -DBAKED_CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR}
  166. ${ALTERNATE_COMMAND})
  167. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated/generated)
  168. foreach (SCRIPT AngelScript LuaScript JavaScript)
  169. string (TOUPPER URHO3D_${SCRIPT} OPT)
  170. if (${OPT})
  171. list (APPEND SCRIPT_SUBSYSTEMS -s ${SCRIPT})
  172. list (APPEND GEN_CPP_FILES ${CMAKE_CURRENT_BINARY_DIR}/generated/${SCRIPT}API.cpp)
  173. endif ()
  174. endforeach ()
  175. string (REGEX REPLACE "[^;]+API\\.cpp" "" ANNOTATED_SOURCES "${CPP_FILES}") # Stringify to preserve the semicolons
  176. add_custom_command (OUTPUT ${GEN_CPP_FILES}
  177. COMMAND ${CMAKE_BINARY_DIR}/bin/tool/clang/AutoBinder -p ${CMAKE_BINARY_DIR} -t ${CMAKE_BINARY_DIR}/bin/tool/clang/Templates -o ${CMAKE_CURRENT_BINARY_DIR}/generated ${SCRIPT_SUBSYSTEMS} ${ANNOTATED_SOURCES}
  178. COMMAND ${CMAKE_COMMAND} -E touch ${GEN_CPP_FILES} # TODO: fake the output - WIP
  179. DEPENDS AutoBinder ${H_FILES}
  180. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  181. COMMENT "Generating source files for binding script subsystems")
  182. endif ()
  183. if (URHO3D_LUA)
  184. # The host tool must be built natively
  185. if (CMAKE_CROSSCOMPILING OR URHO3D_LUAJIT)
  186. check_native_compiler_exist ()
  187. # 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)
  188. include (ExternalProject)
  189. if (IOS)
  190. 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 bash -c "sed -i '' 's/EFFECTIVE_PLATFORM_NAME//g' CMakeScripts/install_postBuildPhase.make*")
  191. else ()
  192. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND})
  193. endif ()
  194. ExternalProject_Add (tolua++
  195. SOURCE_DIR ${CMAKE_SOURCE_DIR}/Source/ThirdParty/toluapp/src/bin
  196. CMAKE_ARGS -DDEST_RUNTIME_DIR=${CMAKE_BINARY_DIR}/bin/tool -DBAKED_CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR} -DURHO3D_UPDATE_SOURCE_TREE=${URHO3D_UPDATE_SOURCE_TREE}
  197. ${ALTERNATE_COMMAND})
  198. else ()
  199. # Otherwise, build it internally as per normal
  200. add_subdirectory (../ThirdParty/toluapp/src/bin ../ThirdParty/toluapp/src/bin)
  201. endif ()
  202. # Use the host tool to generate source files for tolua++ API binding
  203. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated)
  204. file (GLOB API_PKG_FILES LuaScript/pkgs/*.pkg)
  205. foreach (DIR IK Navigation Network Database Physics Urho2D)
  206. string (TOUPPER URHO3D_${DIR} OPT)
  207. if (NOT ${OPT})
  208. list (REMOVE_ITEM API_PKG_FILES ${CMAKE_CURRENT_SOURCE_DIR}/LuaScript/pkgs/${DIR}LuaAPI.pkg)
  209. endif ()
  210. endforeach ()
  211. foreach (API_PKG_FILE ${API_PKG_FILES})
  212. get_filename_component (NAME ${API_PKG_FILE} NAME)
  213. string (REGEX REPLACE LuaAPI\\.pkg$ "" DIR ${NAME})
  214. set (GEN_CPP_FILE LuaScript/generated/${DIR}LuaAPI.cpp)
  215. list (APPEND GEN_CPP_FILES ${GEN_CPP_FILE})
  216. file (GLOB PKG_FILES LuaScript/pkgs/${DIR}/*.pkg)
  217. add_custom_command (OUTPUT ${GEN_CPP_FILE}
  218. COMMAND ${CMAKE_BINARY_DIR}/bin/tool/tolua++ -E ${CMAKE_PROJECT_NAME} -L ToCppHook.lua -o ${CMAKE_CURRENT_BINARY_DIR}/${GEN_CPP_FILE} ${NAME}
  219. DEPENDS tolua++ ${API_PKG_FILE} ${PKG_FILES} LuaScript/pkgs/ToCppHook.lua
  220. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/LuaScript/pkgs
  221. COMMENT "Generating tolua++ API binding on the fly for ${DIR}")
  222. endforeach ()
  223. endif ()
  224. # Generate platform specific export header file
  225. if (MSVC)
  226. set (PRE_EXPORT_HEADER "\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\n")
  227. endif ()
  228. if (URHO3D_CLANG_TOOLS)
  229. set (ANNOTATE_NONSCRIPTABLE "__attribute__((annotate(\"nonscriptable\")))")
  230. endif ()
  231. generate_export_header (${TARGET_NAME} ${URHO3D_LIB_TYPE} EXPORT_MACRO_NAME URHO3D_API EXPORT_FILE_NAME Urho3D.h.new)
  232. execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h)
  233. file (REMOVE ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new)
  234. # Define generated object files
  235. # This is a hack as it relies on internal working of CMake
  236. if (MSVC AND URHO3D_LIB_TYPE STREQUAL SHARED) # MSVC linker does not have force_load/whole_archive equivalent
  237. foreach (TARGET ${STATIC_LIBRARY_TARGETS})
  238. get_target_property (SOURCES ${TARGET} SOURCES)
  239. get_target_property (INT_DIR ${TARGET} LOCATION)
  240. if (INT_DIR)
  241. get_filename_component (INT_DIR ${INT_DIR} PATH)
  242. if (CMAKE_GENERATOR MATCHES 2008)
  243. string (REPLACE /$(OutDir) /${TARGET}.dir/$(ConfigurationName) INT_DIR ${INT_DIR})
  244. elseif (VS)
  245. string (REPLACE /$(Configuration) /${TARGET}.dir/$(ConfigurationName) INT_DIR ${INT_DIR})
  246. endif ()
  247. foreach (SOURCE ${SOURCES})
  248. get_filename_component (NAME ${SOURCE} NAME)
  249. if (NAME MATCHES \\.c.*$|\\.mm?$|\\.S$|\\.s$)
  250. if (VS)
  251. string (REGEX REPLACE \\.c.*$|\\.mm?$|\\.S$|\\.s$ "" NAME "${NAME}")
  252. list (APPEND OBJ_FILES ${INT_DIR}/${NAME}.obj)
  253. else ()
  254. string (REGEX REPLACE ^.*/ThirdParty/${TARGET}/ "" SOURCE "${SOURCE}")
  255. list (APPEND OBJ_FILES ${INT_DIR}/CMakeFiles/${TARGET}.dir/${SOURCE}.obj)
  256. endif ()
  257. elseif (NAME MATCHES \\.o.*$)
  258. list (APPEND OBJ_FILES ${SOURCE})
  259. endif ()
  260. endforeach ()
  261. source_group ("Object Files\\${TARGET}" FILES ${OBJ_FILES})
  262. list (APPEND ALL_OBJ_FILES ${OBJ_FILES})
  263. unset (OBJ_FILES)
  264. endif ()
  265. endforeach ()
  266. set_source_files_properties (${ALL_OBJ_FILES} PROPERTIES GENERATED TRUE)
  267. endif ()
  268. # Aggregate all source files
  269. list (APPEND SOURCE_FILES ${GEN_CPP_FILES} ${ALL_OBJ_FILES} librevision.h Urho3D.h ${SYMBOLIC_SOURCES})
  270. # Define dependency libs
  271. # Add include directories to find the precompiled header, export header, and installed headers from thirdparty libs
  272. set (INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}/${DEST_INCLUDE_DIR}/ThirdParty)
  273. if (URHO3D_PHYSICS)
  274. # Bullet library depends on its own include dir to be added in the header search path
  275. # This is more practical than patching its header files in many places to make them work with relative path
  276. list (APPEND INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${DEST_INCLUDE_DIR}/ThirdParty/Bullet)
  277. endif ()
  278. if (URHO3D_NAVIGATION)
  279. # DetourTileCache and DetourCrowd libraries depend on Detour's include dir to be added in the header search path
  280. list (APPEND INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${DEST_INCLUDE_DIR}/ThirdParty/Detour)
  281. endif ()
  282. if (URHO3D_LUA)
  283. # Lua/LuaJIT library depends on its own include dir to be added in the header search path
  284. # This is more practical than patching its header files in many places to make them work with relative path
  285. list (APPEND INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${DEST_INCLUDE_DIR}/ThirdParty/Lua${JIT})
  286. endif ()
  287. # 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)
  288. 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
  289. list (APPEND LIBS gcc)
  290. endif ()
  291. # Setup library output path
  292. if (ANDROID)
  293. set (OUTPUT_PATH ${CMAKE_BINARY_DIR}/libs/${ANDROID_NDK_ABI_NAME})
  294. else ()
  295. set (OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
  296. endif ()
  297. set_output_directories (${OUTPUT_PATH} ARCHIVE LIBRARY)
  298. # Setup target
  299. if (IOS)
  300. set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
  301. endif ()
  302. setup_library (${URHO3D_LIB_TYPE} ${EXCLUDE_FROM_ALL})
  303. if (NOT ANDROID AND NOT WEB)
  304. file (READ .soversion SOVERSION)
  305. string (STRIP ${SOVERSION} SOVERSION)
  306. string (REGEX MATCH "([^.]+)\\.([^.]+)\\.(.+)" MATCHED ${SOVERSION})
  307. if (MATCHED)
  308. set_target_properties (${TARGET_NAME} PROPERTIES VERSION ${MATCHED} SOVERSION ${CMAKE_MATCH_1})
  309. else ()
  310. 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")
  311. endif ()
  312. endif ()
  313. if (IOS)
  314. # Add a custom target to build Mach-O universal binary consisting of iphoneos (universal ARM archs including 'arm64' if 64-bit is enabled) and iphonesimulator (i386 arch and also x86_64 arch if 64-bit is enabled)
  315. add_custom_target (${TARGET_NAME}_universal ALL
  316. COMMAND if [ '$(CONFIGURATION)' != 'Debug' ]\; then if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |egrep -cq 'i386.*armv7|armv7.*i386|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 archs\; else mv $<TARGET_FILE:${TARGET_NAME}>{,.ori} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.ori 2>/dev/null |egrep -cq 'i386|x86_64'\; then sdk=iphoneos\; else sdk=iphonesimulator\; fi && xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION) -sdk $$sdk 2>&1 && mv $<TARGET_FILE:${TARGET_NAME}>{,.new} && lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{,.ori,.new} && rm $<TARGET_FILE:${TARGET_NAME}>{.ori,.new}\; fi\; fi
  317. DEPENDS ${TARGET_NAME}
  318. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  319. COMMENT "Creating Mach-O universal binary library consisting of both iphoneos and iphonesimulator archs")
  320. install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${DEST_LIBRARY_DIR})
  321. elseif (EMSCRIPTEN)
  322. install (TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${DEST_LIBRARY_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ARCHIVE DESTINATION ${DEST_LIBRARY_DIR})
  323. if (URHO3D_LIB_TYPE STREQUAL MODULE)
  324. install (FILES $<TARGET_FILE:${TARGET_NAME}>.mem DESTINATION ${DEST_LIBRARY_DIR})
  325. endif ()
  326. else ()
  327. install (TARGETS ${TARGET_NAME} RUNTIME DESTINATION ${DEST_RUNTIME_DIR} LIBRARY DESTINATION ${DEST_LIBRARY_DIR} ARCHIVE DESTINATION ${DEST_LIBRARY_DIR})
  328. endif ()
  329. if (WIN32 AND URHO3D_LIB_TYPE STREQUAL SHARED)
  330. set (URHO3D_DLL_INSTALLED TRUE)
  331. endif ()
  332. # Setup dependency frameworks and libraries
  333. if (MINGW)
  334. set (CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES_INIT} -lwinmm")
  335. set (CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES_INIT} -lwinmm")
  336. endif ()
  337. if (APPLE)
  338. set (FORCE_LOAD -force_load)
  339. elseif (NOT MSVC)
  340. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -Wl,--whole-archive)
  341. if (WIN32 AND URHO3D_LIB_TYPE STREQUAL SHARED)
  342. set_target_properties (${TARGET_NAME} PROPERTIES PREFIX "")
  343. endif ()
  344. endif ()
  345. foreach (TARGET ${STATIC_LIBRARY_TARGETS})
  346. get_target_property (ARCHIVE ${TARGET} LOCATION)
  347. if (ARCHIVE)
  348. if (NOT MSVC)
  349. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES ${FORCE_LOAD} ${ARCHIVE}) # Only works in Apple (Xcode and Makefile) and GCC while building shared library
  350. endif ()
  351. if (MSVC_VERSION VERSION_EQUAL 1500)
  352. if (ARCHIVE MATCHES " ")
  353. message (FATAL_ERROR "CMake/VS2008 generator does not support spaces in the source and/or build tree path")
  354. endif ()
  355. set_property (TARGET ${TARGET_NAME} APPEND_STRING PROPERTY STATIC_LIBRARY_FLAGS " ${ARCHIVE}") # Fallback for VS2008
  356. elseif (XCODE OR MSVC)
  357. set_property (TARGET ${TARGET_NAME} APPEND_STRING PROPERTY STATIC_LIBRARY_FLAGS " \"${ARCHIVE}\"") # Only works in Apple (Xcode only) and MSVC while building static library
  358. else ()
  359. list (APPEND ARCHIVES ${ARCHIVE})
  360. endif ()
  361. endif ()
  362. endforeach ()
  363. if (NOT XCODE AND NOT MSVC)
  364. if (NOT APPLE)
  365. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -Wl,--no-whole-archive)
  366. endif ()
  367. if (URHO3D_LIB_TYPE STREQUAL STATIC)
  368. if (APPLE)
  369. # Apple libtool takes archives directly as input
  370. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  371. COMMAND mv $<TARGET_FILE:${TARGET_NAME}>{,.engine}
  372. COMMAND libtool -static $<TARGET_FILE:${TARGET_NAME}>.engine ${ARCHIVES} -o $<TARGET_FILE:${TARGET_NAME}>
  373. COMMAND rm $<TARGET_FILE:${TARGET_NAME}>.engine
  374. COMMENT "Merging all archives into a single static library using libtool")
  375. elseif (EMSCRIPTEN OR CMAKE_BINARY_DIR MATCHES "[ +*;,]")
  376. # Do it the hard way by first extracting the object (bitcode) files and appending them to final archive:
  377. # a) For Emscripten build as Emscripten emar (llvm-ar) neither takes archives directly as input nor supports MRI-style script
  378. # b) When the build tree path contains special characters for MRI scripts (space, '+', '*', ';', ',') as escaping is not supported
  379. get_filename_component (AR ${CMAKE_AR} NAME_WE)
  380. if (CMAKE_HOST_WIN32)
  381. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  382. COMMAND ${CMAKE_COMMAND} -E remove_directory archives
  383. COMMAND ${CMAKE_COMMAND} -E echo "Merging all archives into a single static library using ${AR}")
  384. foreach (ARCHIVE ${ARCHIVES})
  385. # Merge per library because Window cmd shell does not handle long argument list
  386. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory archives)
  387. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  388. COMMAND ${CMAKE_AR} x ${ARCHIVE}
  389. COMMAND ${CMAKE_COMMAND} -E echo_append "\\\"${CMAKE_AR}\\\"" q \\\"$<TARGET_FILE:${TARGET_NAME}>\\\" " " >merge.bat
  390. COMMAND for /F %%i in ('dir /B *.o*') do ${CMAKE_COMMAND} -E echo_append %%i" " >>merge.bat
  391. COMMAND merge.bat WORKING_DIRECTORY archives)
  392. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory archives)
  393. endforeach ()
  394. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${TARGET_NAME}>)
  395. else ()
  396. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  397. COMMAND ${CMAKE_COMMAND} -E remove_directory archives
  398. COMMAND ${CMAKE_COMMAND} -E make_directory archives COMMENT "Merging all archives into a single static library using ${AR}")
  399. foreach (ARCHIVE ${ARCHIVES})
  400. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_AR} x ${ARCHIVE} WORKING_DIRECTORY archives)
  401. endforeach ()
  402. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_AR} q $<TARGET_FILE:${TARGET_NAME}> `ls -1` WORKING_DIRECTORY archives)
  403. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  404. COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${TARGET_NAME}>
  405. COMMAND ${CMAKE_COMMAND} -E remove_directory archives)
  406. endif ()
  407. else ()
  408. # GCC ar does not take archives directly as input like Apple libtool, however, it can be scripted to do so
  409. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  410. COMMAND ${CMAKE_COMMAND} -E rename $<TARGET_FILE:${TARGET_NAME}> $<TARGET_FILE:${TARGET_NAME}>.engine
  411. COMMAND echo CREATE $<TARGET_FILE:${TARGET_NAME}> >script.ar
  412. COMMAND echo ADDLIB $<TARGET_FILE:${TARGET_NAME}>.engine >>script.ar)
  413. foreach (ARCHIVE ${ARCHIVES})
  414. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND echo ADDLIB ${ARCHIVE} >>script.ar)
  415. endforeach ()
  416. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  417. COMMAND echo SAVE >>script.ar
  418. COMMAND echo END >>script.ar
  419. COMMAND ${CMAKE_AR} -M <script.ar
  420. COMMAND ${CMAKE_COMMAND} -E remove $<TARGET_FILE:${TARGET_NAME}>.engine script.ar
  421. COMMENT "Merging all archives into a single static library using ar")
  422. endif ()
  423. endif ()
  424. endif ()
  425. # 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)
  426. if (NOT URHO3D_LIB_TYPE STREQUAL STATIC)
  427. set_target_properties (${STATIC_LIBRARY_TARGETS} PROPERTIES POSITION_INDEPENDENT_CODE true)
  428. endif ()
  429. # Install headers for using the Urho3D library
  430. install_header_files (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h DESTINATION ${DEST_INCLUDE_DIR} ACCUMULATE GENERATED_HEADERS)
  431. 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
  432. # Generate the include-all-headers header file even though we do not encourage Urho3D library users to use it
  433. list (SORT URHO_HEADERS)
  434. list (REVERSE URHO_HEADERS)
  435. set (OPTIONAL_SUBS AngelScript Database IK Lua Navigation Network Physics Urho2D)
  436. foreach (SUB ${OPTIONAL_SUBS})
  437. if (URHO_HEADERS MATCHES "(include/Urho3D/${SUB}[^;]+)")
  438. list (FIND URHO_HEADERS ${CMAKE_MATCH_1} FOUND_INDEX)
  439. list (INSERT URHO_HEADERS ${FOUND_INDEX} "#endif")
  440. endif ()
  441. endforeach ()
  442. list (REVERSE URHO_HEADERS)
  443. foreach (SUB ${OPTIONAL_SUBS})
  444. if (URHO_HEADERS MATCHES "(include/Urho3D/${SUB}[^;]+)")
  445. string (TOUPPER ${SUB} SUB)
  446. list (FIND URHO_HEADERS ${CMAKE_MATCH_1} FOUND_INDEX)
  447. list (INSERT URHO_HEADERS ${FOUND_INDEX} "#if URHO3D_${SUB}")
  448. endif ()
  449. endforeach ()
  450. string (REGEX REPLACE "include/[^;]+(DebugNew|Direct3D|ODBC|OpenGL|Precompiled|SQLite|ToluaUtils|Urho3D|librevision)[^;]+;" "" URHO_HEADERS "${URHO_HEADERS};")
  451. string (REGEX REPLACE "include/([^;]+)" "#include <\\1>" URHO_HEADERS "${GENERATED_HEADERS};;${URHO_HEADERS}")
  452. string (REPLACE ";" \n URHO_HEADERS "${URHO_HEADERS}")
  453. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Urho3DAll.h.in ${CMAKE_CURRENT_BINARY_DIR}/Urho3DAll.h)
  454. install_header_files (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3DAll.h ${CMAKE_CURRENT_BINARY_DIR}/librevision.h DESTINATION ${DEST_INCLUDE_DIR})
  455. # Generate platform specific pkg-config file for the benefit of Urho3D library users via SDK without CMake
  456. if (ABSOLUTE_PATH_LIBS)
  457. 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
  458. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" URHO3D_ABS_PATH_LIBS "${URHO3D_ABS_PATH_LIBS}")
  459. endif ()
  460. if (MSVC)
  461. set (DASH /)
  462. set (LIB_DIR "/LIBPATH:\"\${libdir}\"")
  463. string (REPLACE ";" ".lib\" \"" URHO3D_LIBS "\"@LIB_NAME@\" \"${LIBS}.lib\"")
  464. set (PC_SUFFIX .msvc)
  465. else ()
  466. set (LIB_NAME ${TARGET_NAME})
  467. if (MINGW)
  468. if (CMAKE_BUILD_TYPE STREQUAL Debug)
  469. set (LIB_NAME ${LIB_NAME}_d)
  470. endif ()
  471. if (URHO3D_LIB_TYPE STREQUAL SHARED)
  472. set (LIB_NAME ${LIB_NAME}.dll)
  473. endif ()
  474. endif ()
  475. set (DASH -)
  476. set (LIB_DIR "-L\"\${libdir}\"")
  477. string (REPLACE ";" " -l" URHO3D_LIBS "-l${LIB_NAME};${LIBS}")
  478. endif ()
  479. string (REPLACE ";" " ${DASH}D" URHO3D_COMPILE_DEFINITIONS "${DASH}D${URHO3D_COMPILE_DEFINITIONS}")
  480. get_directory_property (GLOBAL_INCLUDE_DIRS DIRECTORY ${CMAKE_SOURCE_DIR} INCLUDE_DIRECTORIES)
  481. if (GLOBAL_INCLUDE_DIRS)
  482. string (REPLACE ";" "\" ${DASH}I\"" GLOBAL_INCLUDE_DIRS "${DASH}I\"${GLOBAL_INCLUDE_DIRS}\"")
  483. string (REPLACE "${SYSROOT}" "" GLOBAL_INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS})
  484. endif ()
  485. set (ENGINE_INCLUDE_DIRS "${DASH}I\"\${includedir}\" ${DASH}I\"\${includedir}/Urho3D/ThirdParty\"")
  486. if (URHO3D_PHYSICS)
  487. # Bullet library depends on its own include dir to be added in the header search path
  488. # This is more practical than patching its header files in many places to make them work with relative path
  489. set (ENGINE_INCLUDE_DIRS "${ENGINE_INCLUDE_DIRS} ${DASH}I\"\${includedir}/Urho3D/ThirdParty/Bullet\"")
  490. endif ()
  491. if (URHO3D_LUA)
  492. # ditto for Lua/LuaJIT
  493. set (ENGINE_INCLUDE_DIRS "${ENGINE_INCLUDE_DIRS} ${DASH}I\"\${includedir}/Urho3D/ThirdParty/Lua${JIT}\"")
  494. endif ()
  495. # todo: Reevaluate the command below when the CMake minimum required version is set to 2.8.12 (and remove only when the deprecated add_compiler_export_flags() is not used anymore)
  496. # Remove compiler flags that are only used for building the library
  497. string (REGEX REPLACE " -fvisibility[^ ]+" "" CLEANED_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  498. string (REGEX REPLACE " -include \"[^\"]+\"" "" CLEANED_CMAKE_CXX_FLAGS "${CLEANED_CMAKE_CXX_FLAGS}")
  499. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" CLEANED_CMAKE_CXX_FLAGS "${CLEANED_CMAKE_CXX_FLAGS}")
  500. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" CLEANED_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  501. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Urho3D.pc.in ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.pc${PC_SUFFIX} @ONLY)
  502. if (MSVC)
  503. 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)
  504. endif ()
  505. if (ANDROID)
  506. set (RENAME RENAME Urho3D-${ANDROID_NDK_ABI_NAME}.pc)
  507. endif ()
  508. install (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.pc DESTINATION ${DEST_PKGCONFIG_DIR} ${RENAME})
  509. # Define post build steps
  510. if (ANDROID_NDK_GDB)
  511. # Copy the library while it still has debug symbols for ndk-gdb
  512. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${TARGET_NAME}> ${NDK_GDB_SOLIB_PATH}
  513. COMMENT "Copying Urho3D library with debug symbols to ${NDK_GDB_SOLIB_PATH} directory")
  514. endif ()
  515. if (URHO3D_LIB_TYPE STREQUAL SHARED AND (ANDROID OR ARM))
  516. # Strip the output shared library for embedded devices
  517. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${TARGET_NAME}>
  518. COMMENT "Stripping Urho3D shared library")
  519. endif ()
  520. if (URHO3D_SCP_TO_TARGET)
  521. # Ensure SCP is the last command
  522. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND scp $<TARGET_FILE:${TARGET_NAME}> ${URHO3D_SCP_TO_TARGET} || exit 0
  523. COMMENT "Scp-ing Urho3D library to target system")
  524. endif ()