CMakeLists.txt 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. #
  2. # Copyright (c) 2008-2020 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. # Prevent ICE from old MinGW versions, workaround from the GCC bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61189
  25. if (MINGW AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.1 AND NOT URHO3D_64BIT)
  26. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mpreferred-stack-boundary=2")
  27. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mpreferred-stack-boundary=2")
  28. endif ()
  29. check_include_files (stdint.h HAVE_STDINT_H)
  30. if (HAVE_STDINT_H)
  31. add_definitions (-DHAVE_STDINT_H)
  32. endif ()
  33. # Generate JSON compilation database format specification
  34. if (URHO3D_CLANG_TOOLS OR URHO3D_BINDINGS)
  35. set (CMAKE_EXPORT_COMPILE_COMMANDS 1)
  36. # 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
  37. # Clang has a hard-coded way to search for their headers (see http://clang.llvm.org/docs/LibTooling.html#builtin-includes)
  38. # In order for our Clang-tools to work correctly we need to make this Clang's assumption to be true
  39. execute_process (COMMAND ${LLVM_CONFIG} --version OUTPUT_VARIABLE LLVM_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
  40. string (REGEX REPLACE "([.0123456789]+).*" \\1 LLVM_VERSION "${LLVM_VERSION}") # Stringify against empty output variable
  41. execute_process (COMMAND ${LLVM_CONFIG} --libdir OUTPUT_VARIABLE LLVM_LIBDIR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
  42. execute_process (COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/bin/tool/lib/clang/${LLVM_VERSION})
  43. create_symlink (${LLVM_LIBDIR}/clang/${LLVM_VERSION}/include ${CMAKE_BINARY_DIR}/bin/tool/lib/clang/${LLVM_VERSION}/include FALLBACK_TO_COPY)
  44. endif ()
  45. # Save keep the preprocessor macros (for using the Urho3D library) for later use in generating Urho3D.pc file
  46. get_directory_property (URHO3D_COMPILE_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS)
  47. # Define preprocessor macros (for building the Urho3D library)
  48. add_definitions (-DURHO3D_IS_BUILDING)
  49. if (ANDROID AND DEFINED ENV{ASSET_DIR_INDICATOR})
  50. add_definitions (-DASSET_DIR_INDICATOR=\"$ENV{ASSET_DIR_INDICATOR}\")
  51. endif ()
  52. if ($ENV{COVERITY_SCAN_BRANCH})
  53. # This macro is used when scanning Urho3D library via Coverity-Scan
  54. # TODO: The Coverity-Scan modelling is not yet working properly (anyone interested in static analyzer is welcome to give it another try)
  55. add_definitions (-DCOVERITY_SCAN_MODEL)
  56. endif ()
  57. if (TARGET GLEW)
  58. # These macros are required because Urho3D (OpenGL) headers are exposed to GLEW headers
  59. add_definitions (-DGLEW_STATIC -DGLEW_NO_GLU)
  60. endif ()
  61. if (HAVE_SINCOSF)
  62. add_definitions (-DHAVE_SINCOSF)
  63. elseif (HAVE___SINCOSF)
  64. add_definitions (-DHAVE___SINCOSF)
  65. endif ()
  66. # Enable/disable SIMD instruction set for STB image
  67. if (NEON)
  68. if (XCODE)
  69. if (IOS)
  70. set (SDK iphoneos)
  71. elseif (TVOS)
  72. set (SDK appletvos)
  73. endif ()
  74. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_OTHER_CFLAGS[sdk=${SDK}*] "-DSTBI_NEON $(OTHER_CFLAGS)")
  75. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_OTHER_CPLUSPLUSFLAGS[sdk=${SDK}*] "-DSTBI_NEON $(OTHER_CPLUSPLUSFLAGS)")
  76. else ()
  77. add_definitions (-DSTBI_NEON)
  78. endif ()
  79. elseif (MSVC AND NOT URHO3D_SSE)
  80. add_definitions (-DSTBI_NO_SIMD)
  81. elseif (MINGW AND NOT URHO3D_64BIT AND URHO3D_SSE)
  82. add_definitions (-DSTBI_MINGW_ENABLE_SSE2)
  83. endif ()
  84. if (URHO3D_LUA)
  85. if (NOT URHO3D_SAFE_LUA)
  86. add_definitions (-DTOLUA_RELEASE)
  87. endif ()
  88. if (URHO3D_LUA_RAW_SCRIPT_LOADER)
  89. add_definitions (-DURHO3D_LUA_RAW_SCRIPT_LOADER)
  90. endif ()
  91. endif ()
  92. if (ODBC_VERSION AND NOT ODBC_VERSION VERSION_LESS 3)
  93. add_definitions (-DODBC_3_OR_LATER)
  94. endif ()
  95. if (WIN32)
  96. set (CMAKE_DEBUG_POSTFIX _d)
  97. if (NOT MINGW OR HAVE_RTL_OSVERSIONINFOW)
  98. add_definitions (-DHAVE_RTL_OSVERSIONINFOW)
  99. endif ()
  100. endif ()
  101. if (URHO3D_HASH_DEBUG)
  102. add_definitions (-DURHO3D_HASH_DEBUG)
  103. endif ()
  104. if (URHO3D_SSL)
  105. add_definitions (-DURHO3D_SSL)
  106. if (URHO3D_SSL_DYNAMIC)
  107. add_definitions (-DURHO3D_SSL_DYNAMIC)
  108. endif ()
  109. endif ()
  110. # Define source files
  111. foreach (DIR IK Navigation Network Physics Urho2D WebP)
  112. string (TOUPPER URHO3D_${DIR} OPT)
  113. if (NOT ${OPT})
  114. list (APPEND EXCLUDED_SOURCE_DIRS ${DIR})
  115. endif ()
  116. endforeach ()
  117. if (NOT URHO3D_ANGELSCRIPT)
  118. list (APPEND EXCLUDED_SOURCE_DIRS AngelScript)
  119. endif ()
  120. if (NOT URHO3D_LUA)
  121. list (APPEND EXCLUDED_SOURCE_DIRS LuaScript)
  122. endif ()
  123. if (URHO3D_DATABASE)
  124. if (URHO3D_DATABASE_ODBC)
  125. list (APPEND EXCLUDED_SOURCE_DIRS Database/SQLite)
  126. else ()
  127. list (APPEND EXCLUDED_SOURCE_DIRS Database/ODBC)
  128. endif ()
  129. else ()
  130. list (APPEND EXCLUDED_SOURCE_DIRS Database)
  131. endif ()
  132. if (URHO3D_OPENGL)
  133. # Exclude the opposite source directory
  134. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/Direct3D9 Graphics/Direct3D11)
  135. else ()
  136. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/OpenGL)
  137. if (URHO3D_D3D11)
  138. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/Direct3D9)
  139. else ()
  140. list (APPEND EXCLUDED_SOURCE_DIRS Graphics/Direct3D11)
  141. endif ()
  142. endif ()
  143. if (APPLE AND NOT ARM)
  144. set (GLOB_OBJC_PATTERN *.m) # Should only pick up MacFileWatcher.m for macOS platform at the moment
  145. endif ()
  146. string (REPLACE ";" "/[^;]+;" EXCLUDE_PATTERNS "${EXCLUDED_SOURCE_DIRS};")
  147. define_source_files (EXCLUDE_PATTERNS ${EXCLUDE_PATTERNS} GLOB_CPP_PATTERNS *.cpp ${GLOB_OBJC_PATTERN} RECURSE GROUP)
  148. if (URHO3D_GENERATEBINDINGS)
  149. find_package (Doxygen 1.8.17 REQUIRED)
  150. if (NOT DOXYGEN_FOUND)
  151. message (FATAL_ERROR "Doxygen >= 1.8.17 required to generate bindings")
  152. endif ()
  153. # Generating Doxyfile
  154. set (DOXYFILE_PATH "${CMAKE_BINARY_DIR}/Source/Tools/BindingGenerator/generated/Doxyfile")
  155. configure_file ("${CMAKE_SOURCE_DIR}/Source/Tools/BindingGenerator/Doxyfile.in" "${DOXYFILE_PATH}")
  156. set (XML_AST_DIR "${CMAKE_BINARY_DIR}/Source/Tools/BindingGenerator/generated/xml")
  157. set (BINDING_GENERATOR_PATH "${CMAKE_BINARY_DIR}/bin/tool/BindingGenerator")
  158. set (AS_GENERATED_FILES "AngelScript/Generated_Enums.cpp"
  159. "AngelScript/Generated_Classes.cpp"
  160. "AngelScript/Generated_Members_HighPriority.cpp"
  161. "AngelScript/Generated_Members_A.cpp"
  162. "AngelScript/Generated_Members_B.cpp"
  163. "AngelScript/Generated_Members_Constraint.cpp"
  164. "AngelScript/Generated_Members_Ca_Cm.cpp"
  165. "AngelScript/Generated_Members_Cn_Cz.cpp"
  166. "AngelScript/Generated_Members_D.cpp"
  167. "AngelScript/Generated_Members_E.cpp"
  168. "AngelScript/Generated_Members_F.cpp"
  169. "AngelScript/Generated_Members_G.cpp"
  170. "AngelScript/Generated_Members_H.cpp"
  171. "AngelScript/Generated_Members_I.cpp"
  172. "AngelScript/Generated_Members_J.cpp"
  173. "AngelScript/Generated_Members_K.cpp"
  174. "AngelScript/Generated_Members_L.cpp"
  175. "AngelScript/Generated_Members_M.cpp"
  176. "AngelScript/Generated_Members_N.cpp"
  177. "AngelScript/Generated_Members_O.cpp"
  178. "AngelScript/Generated_Members_P.cpp"
  179. "AngelScript/Generated_Members_Q.cpp"
  180. "AngelScript/Generated_Members_R.cpp"
  181. "AngelScript/Generated_Members_Sa_Sm.cpp"
  182. "AngelScript/Generated_Members_Sn_Sz.cpp"
  183. "AngelScript/Generated_Members_Ta_Tm.cpp"
  184. "AngelScript/Generated_Members_Tn_Tz.cpp"
  185. "AngelScript/Generated_Members_U.cpp"
  186. "AngelScript/Generated_Members_V.cpp"
  187. "AngelScript/Generated_Members_W.cpp"
  188. "AngelScript/Generated_Members_X.cpp"
  189. "AngelScript/Generated_Members_Y.cpp"
  190. "AngelScript/Generated_Members_Z.cpp"
  191. "AngelScript/Generated_Members_Other.cpp"
  192. "AngelScript/Generated_GlobalVariables.cpp"
  193. "AngelScript/Generated_GlobalFunctions.cpp"
  194. "AngelScript/Generated_Templates.h")
  195. set (AS_GENERATED_FILES_FULL_PATHS "${AS_GENERATED_FILES}")
  196. # Add "${CMAKE_SOURCE_DIR}/Source/Urho3D/" to every item in list
  197. list(TRANSFORM AS_GENERATED_FILES_FULL_PATHS PREPEND "${CMAKE_SOURCE_DIR}/Source/Urho3D/")
  198. # If generated files already exists they will be in list SOURCE_FILES already.
  199. # We need list without generated files to solve circular dependency
  200. set (SOURCE_FILES_WITHOUT_GENERATED "${SOURCE_FILES}")
  201. list (REMOVE_ITEM SOURCE_FILES_WITHOUT_GENERATED ${AS_GENERATED_FILES})
  202. # Generate xmls and run BindingGenerator
  203. add_custom_command (OUTPUT ${AS_GENERATED_FILES_FULL_PATHS}
  204. #${CMAKE_SOURCE_DIR}/Source/Urho3D/Lua/Generated.cpp
  205. #${CMAKE_SOURCE_DIR}/Source/Urho3D/JavaScript/Generated.cpp
  206. #${CMAKE_SOURCE_DIR}/Source/Urho3D/CSharp/Generated.cpp
  207. #fake_output_to_force_run_every_time
  208. COMMAND ${CMAKE_COMMAND} -E echo "Generating XMLs with AST to ${XML_AST_DIR}"
  209. COMMAND ${DOXYGEN_EXECUTABLE} "${DOXYFILE_PATH}"
  210. COMMAND ${CMAKE_COMMAND} -E echo "Running ${BINDING_GENERATOR_PATH} ${XML_AST_DIR} ${CMAKE_SOURCE_DIR}"
  211. COMMAND "${BINDING_GENERATOR_PATH}" "${XML_AST_DIR}" "${CMAKE_SOURCE_DIR}"
  212. DEPENDS BindingGenerator "${DOXYFILE_PATH}" "${SOURCE_FILES_WITHOUT_GENERATED}"
  213. COMMENT "Generating bindings to script languages")
  214. if (URHO3D_ANGELSCRIPT)
  215. # Make sure we have generated files in SOURCE_FILES
  216. set (SOURCE_FILES "${SOURCE_FILES_WITHOUT_GENERATED}")
  217. list (APPEND SOURCE_FILES ${AS_GENERATED_FILES})
  218. source_group ("Source Files\\AngelScript" FILES ${AS_GENERATED_FILES})
  219. endif()
  220. endif ()
  221. # Define generated source files
  222. if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/librevision.h)
  223. execute_process (COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h -P cmake/Modules/GetUrhoRevision.cmake
  224. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_QUIET ERROR_QUIET)
  225. endif ()
  226. set (URHO3D_DEPS ${STATIC_LIBRARY_TARGETS})
  227. if (TARGET LuaJIT_universal)
  228. list (REMOVE_ITEM URHO3D_DEPS LuaJIT)
  229. set (LuaJIT_universal_symbolic LuaJIT_universal_symbolic)
  230. add_custom_command (OUTPUT ${LuaJIT_universal_symbolic}
  231. COMMAND xcodebuild ARCHS="$(ARCHS)" -target LuaJIT_universal -configuration $(CONFIGURATION)
  232. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  233. list (APPEND SYMBOLIC_SOURCES ${LuaJIT_universal_symbolic})
  234. endif ()
  235. set_source_files_properties (${SYMBOLIC_SOURCES} PROPERTIES SYMBOLIC TRUE)
  236. add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
  237. COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new -P cmake/Modules/GetUrhoRevision.cmake
  238. COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
  239. COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/librevision.h.new
  240. DEPENDS ${URHO3D_DEPS} ${CMAKE_SOURCE_DIR}/cmake/Modules/GetUrhoRevision.cmake
  241. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  242. COMMENT "") # Suppress the comment as the header file may or may not be re-generated
  243. source_group ("Source Files\\Generated" FILES ${CMAKE_CURRENT_BINARY_DIR}/librevision.h)
  244. # Use the AutoBinder tool to generate source files for binding script subsystems
  245. if (URHO3D_BINDINGS)
  246. # 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
  247. include (ExternalProject)
  248. if (IOS OR TVOS)
  249. # When cross-compiling for iOS/tvOS the host environment has been altered by xcodebuild for the said platform, the following fix is required to reset the host environment before spawning another process to configure/generate project file for external project
  250. # Also workaround a known CMake/Xcode generator bug which prevents it from installing native tool binaries correctly
  251. 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*")
  252. else ()
  253. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND})
  254. endif ()
  255. ExternalProject_Add (AutoBinder
  256. SOURCE_DIR ${CMAKE_SOURCE_DIR}/Source/Clang-Tools
  257. CMAKE_ARGS -D URHO3D_CLANG_TOOLS=AutoBinder -D URHO3D_DEPLOYMENT_TARGET=generic -D DEST_RUNTIME_DIR=${CMAKE_BINARY_DIR}/bin/tool/clang -D DEST_INCLUDE_DIR=${DEST_INCLUDE_DIR} -D BAKED_CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR} -D CMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
  258. ${ALTERNATE_COMMAND})
  259. add_make_clean_files (${CMAKE_BINARY_DIR}/bin/tool/clang/AutoBinder)
  260. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated/generated)
  261. foreach (SCRIPT AngelScript LuaScript JavaScript)
  262. string (TOUPPER URHO3D_${SCRIPT} OPT)
  263. if (${OPT})
  264. list (APPEND SCRIPT_SUBSYSTEMS -s ${SCRIPT})
  265. list (APPEND GEN_CPP_FILES ${CMAKE_CURRENT_BINARY_DIR}/generated/${SCRIPT}API.cpp)
  266. endif ()
  267. endforeach ()
  268. string (REGEX REPLACE "[^;]+API\\.cpp" "" ANNOTATED_SOURCES "${CPP_FILES}") # Stringify to preserve the semicolons
  269. add_custom_command (OUTPUT ${GEN_CPP_FILES}
  270. 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}
  271. COMMAND ${CMAKE_COMMAND} -E touch ${GEN_CPP_FILES} # TODO: fake the output - WIP
  272. DEPENDS AutoBinder ${H_FILES}
  273. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  274. COMMENT "Generating source files for binding script subsystems")
  275. endif ()
  276. if (URHO3D_LUA)
  277. # The host tool must be built natively
  278. if (CMAKE_CROSSCOMPILING OR URHO3D_LUAJIT)
  279. check_native_compiler_exist ()
  280. # 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)
  281. include (ExternalProject)
  282. if (ANDROID AND DEFINED ENV{TRAVIS})
  283. set (TRAVIS_ANDROID_FIX -DURHO3D_DEPLOYMENT_TARGET=generic)
  284. endif ()
  285. if (IOS OR TVOS)
  286. 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*")
  287. else ()
  288. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND})
  289. endif ()
  290. ExternalProject_Add (tolua++
  291. SOURCE_DIR ${CMAKE_SOURCE_DIR}/Source/ThirdParty/toluapp/src/bin
  292. 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}
  293. ${TRAVIS_ANDROID_FIX}
  294. ${ALTERNATE_COMMAND})
  295. add_make_clean_files (${CMAKE_BINARY_DIR}/bin/tool/tolua++)
  296. else ()
  297. # Otherwise, build it internally as per normal
  298. add_subdirectory (../ThirdParty/toluapp/src/bin ../ThirdParty/toluapp/src/bin)
  299. endif ()
  300. # Use the host tool to generate source files for tolua++ API binding
  301. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated)
  302. file (GLOB API_PKG_FILES LuaScript/pkgs/*.pkg)
  303. foreach (DIR IK Navigation Network Database Physics Urho2D)
  304. string (TOUPPER URHO3D_${DIR} OPT)
  305. if (NOT ${OPT})
  306. list (REMOVE_ITEM API_PKG_FILES ${CMAKE_CURRENT_SOURCE_DIR}/LuaScript/pkgs/${DIR}LuaAPI.pkg)
  307. endif ()
  308. endforeach ()
  309. foreach (API_PKG_FILE ${API_PKG_FILES})
  310. get_filename_component (NAME ${API_PKG_FILE} NAME)
  311. string (REGEX REPLACE LuaAPI\\.pkg$ "" DIR ${NAME})
  312. set (GEN_CPP_FILE ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated/${DIR}LuaAPI.cpp)
  313. list (APPEND LUA_GEN_CPP_FILES ${GEN_CPP_FILE})
  314. file (GLOB PKG_FILES LuaScript/pkgs/${DIR}/*.pkg)
  315. add_custom_command (OUTPUT ${GEN_CPP_FILE}
  316. COMMAND ${CMAKE_BINARY_DIR}/bin/tool/tolua++ -E ${CMAKE_PROJECT_NAME} -L ToCppHook.lua -o ${GEN_CPP_FILE} ${NAME}
  317. DEPENDS tolua++ ${API_PKG_FILE} ${PKG_FILES} LuaScript/pkgs/ToCppHook.lua
  318. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/LuaScript/pkgs
  319. COMMENT "Generating tolua++ API binding on the fly for ${DIR}")
  320. endforeach ()
  321. source_group ("Source Files\\LuaScript\\Generated" FILES ${LUA_GEN_CPP_FILES})
  322. if (URHO3D_LINT)
  323. execute_process (COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdParty/.clang-tidy ${CMAKE_CURRENT_BINARY_DIR}/LuaScript/generated)
  324. endif ()
  325. endif ()
  326. # Aggregate all source files
  327. list (APPEND SOURCE_FILES ${GEN_CPP_FILES} ${LUA_GEN_CPP_FILES} librevision.h Urho3D.h ${SYMBOLIC_SOURCES})
  328. # Define dependency libs
  329. # Add include directories to find the precompiled header, export header, and installed headers from third-party libs
  330. set (INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${THIRD_PARTY_INCLUDE_DIR})
  331. if (URHO3D_PHYSICS)
  332. # Bullet library depends on its own include dir to be added in the header search path
  333. # This is more practical than patching its header files in many places to make them work with relative path
  334. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Bullet)
  335. endif ()
  336. if (URHO3D_WEBSOCKETS)
  337. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/libwebsockets)
  338. add_definitions (-DURHO3D_WEBSOCKETS)
  339. message (STATUS "Adding websockets support")
  340. else ()
  341. endif ()
  342. if (URHO3D_NAVIGATION)
  343. # DetourTileCache and DetourCrowd libraries depend on Detour's include dir to be added in the header search path
  344. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Detour)
  345. endif ()
  346. if (URHO3D_LUA)
  347. # Lua/LuaJIT library depends on its own include dir to be added in the header search path
  348. # This is more practical than patching its header files in many places to make them work with relative path
  349. list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Lua${JIT})
  350. endif ()
  351. # 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)
  352. 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
  353. list (APPEND LIBS gcc)
  354. endif ()
  355. # Setup library output path
  356. set_output_directories (${CMAKE_BINARY_DIR}/lib ARCHIVE LIBRARY)
  357. # Setup target
  358. if (IOS OR TVOS)
  359. set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
  360. endif ()
  361. setup_library (${URHO3D_LIB_TYPE} ${EXCLUDE_FROM_ALL})
  362. # Generate platform specific export header file (can only be called after the target has been added)
  363. if (MSVC)
  364. 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")
  365. endif ()
  366. if (URHO3D_CLANG_TOOLS)
  367. set (ANNOTATE_NONSCRIPTABLE "__attribute__((annotate(\"nonscriptable\")))")
  368. endif ()
  369. set (APPENDIX "${APPENDIX}\n#define NONSCRIPTABLE ${ANNOTATE_NONSCRIPTABLE}\n\n")
  370. foreach (DEFINE URHO3D_STATIC_DEFINE URHO3D_OPENGL URHO3D_D3D11 URHO3D_SSE URHO3D_DATABASE_ODBC URHO3D_DATABASE_SQLITE URHO3D_LUAJIT URHO3D_TESTING CLANG_PRE_STANDARD)
  371. if (${DEFINE})
  372. set (APPENDIX "${APPENDIX}#define ${DEFINE}\n")
  373. endif ()
  374. endforeach()
  375. generate_export_header (${TARGET_NAME} EXPORT_MACRO_NAME URHO3D_API EXPORT_FILE_NAME Urho3D.h.new CUSTOM_CONTENT_FROM_VARIABLE APPENDIX)
  376. file (READ Precompiled.h COPYRIGHT LIMIT 1128)
  377. file (READ ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new EXPORT_HEADER)
  378. file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new ${COPYRIGHT}${EXPORT_HEADER})
  379. execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h)
  380. file (REMOVE ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h.new)
  381. source_group ("Source Files\\Generated" FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h)
  382. # Precompile the header after the export header file has been generated
  383. enable_pch (Precompiled.h)
  384. if (NOT ANDROID AND NOT WEB)
  385. file (READ .soversion SOVERSION)
  386. string (STRIP ${SOVERSION} SOVERSION)
  387. string (REGEX MATCH "([^.]+)\\.([^.]+)\\.(.+)" MATCHED ${SOVERSION})
  388. if (MATCHED)
  389. set_target_properties (${TARGET_NAME} PROPERTIES VERSION ${MATCHED} SOVERSION ${CMAKE_MATCH_1})
  390. else ()
  391. 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")
  392. endif ()
  393. else ()
  394. set_target_properties (${TARGET_NAME} PROPERTIES NO_SONAME TRUE)
  395. endif ()
  396. # TODO: to use 'xcframework' as Apple discourages the use of 'lipo' to create universal binary combining libs/frameworks from different SDK
  397. # As of Xcode 12 the 'iphonesimulator' SDK produces binary for both 'x86_64' and 'arm64' archs
  398. # This has caused problem with 'lipo' to combine the already FAT lib from 'iphonesimulator' SDK with 'iphoneos' SDK containing 'arm64' arch
  399. # Temporary workaround by not generating the universal binary when the issue is detected
  400. if (IOS)
  401. # Add a custom target to build Mach-O universal binary consisting of both iPhoneOS and iPhoneSimulator SDKs
  402. add_custom_target (${TARGET_NAME}_universal ALL
  403. COMMAND 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
  404. DEPENDS ${TARGET_NAME}
  405. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  406. COMMENT "Creating Mach-O universal binary library consisting of both iPhoneOS and iPhoneSimulator SDks")
  407. install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${DEST_LIBRARY_DIR})
  408. elseif (TVOS)
  409. # Add a custom target to build Mach-O universal binary consisting of both AppleTVOS and AppleTVSimulator SDKs
  410. add_custom_target (${TARGET_NAME}_universal ALL
  411. COMMAND 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
  412. DEPENDS ${TARGET_NAME}
  413. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  414. COMMENT "Creating Mach-O universal binary library consisting of both AppleTVOS and AppleTVSimulator SDKs")
  415. install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${DEST_LIBRARY_DIR})
  416. # TODO: Temporary workaround as CMake does not recognize AppleTV platform yet
  417. add_dependencies (${TARGET_NAME} APPLETV_POST_CMAKE_FIX)
  418. elseif (EMSCRIPTEN)
  419. install (TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${DEST_LIBRARY_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ARCHIVE DESTINATION ${DEST_LIBRARY_DIR})
  420. else ()
  421. install (TARGETS ${TARGET_NAME} RUNTIME DESTINATION ${DEST_RUNTIME_DIR} LIBRARY DESTINATION ${DEST_LIBRARY_DIR} ARCHIVE DESTINATION ${DEST_LIBRARY_DIR})
  422. endif ()
  423. if (WIN32 AND URHO3D_LIB_TYPE STREQUAL SHARED)
  424. set (URHO3D_DLL_INSTALLED TRUE)
  425. endif ()
  426. # TODO: This seems out of place
  427. if (MINGW)
  428. set (CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES_INIT} -lwinmm")
  429. set (CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES_INIT} -lwinmm")
  430. if (URHO3D_LIB_TYPE STREQUAL SHARED)
  431. set_target_properties (${TARGET_NAME} PROPERTIES PREFIX "")
  432. endif ()
  433. endif ()
  434. # Setup dependency libraries to be linked or archived as a whole inside Urho3D library for SHARED or STATIC lib type, respectively
  435. if (APPLE)
  436. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -force_load)
  437. elseif (MSVC)
  438. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_OPTIONS /FORCE /WHOLEARCHIVE) # Require VS 2015 Update 2 onward
  439. else ()
  440. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -Wl,--whole-archive)
  441. endif ()
  442. foreach (TARGET ${STATIC_LIBRARY_TARGETS})
  443. set (ARCHIVE $<TARGET_FILE:${TARGET}>)
  444. if (NOT ${TARGET} MATCHES boost|rapidjson|STB) # Exclude header-only "fake" static lib targets
  445. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES ${ARCHIVE}) # Should work for all compiler toolchains while building shared library
  446. if (URHO3D_LIB_TYPE STREQUAL STATIC)
  447. if (XCODE OR MSVC) # Only works in Xcode and MSVC while building static library
  448. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY STATIC_LIBRARY_OPTIONS ${ARCHIVE})
  449. else ()
  450. list (APPEND ARCHIVES ${ARCHIVE}) # Accumulate the target locations for archiving later
  451. endif ()
  452. endif ()
  453. endif ()
  454. endforeach ()
  455. if (NOT XCODE AND NOT MSVC)
  456. if (NOT APPLE)
  457. set_property (TARGET ${TARGET_NAME} APPEND PROPERTY LINK_LIBRARIES -Wl,--no-whole-archive) # GCC/Clang-specific to pair up with whole-archive linker option
  458. endif ()
  459. if (URHO3D_LIB_TYPE STREQUAL STATIC)
  460. if (APPLE)
  461. # Apple libtool takes archives directly as input
  462. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  463. COMMAND mv $<TARGET_FILE:${TARGET_NAME}>{,.engine}
  464. COMMAND libtool -static $<TARGET_FILE:${TARGET_NAME}>.engine ${ARCHIVES} -o $<TARGET_FILE:${TARGET_NAME}>
  465. COMMAND rm $<TARGET_FILE:${TARGET_NAME}>.engine
  466. COMMENT "Merging all archives into a single static library using libtool")
  467. elseif (EMSCRIPTEN OR CMAKE_BINARY_DIR MATCHES "[ +*;,]")
  468. # Do it the hard way by first extracting the object (bitcode) files and appending them to final archive:
  469. # a) For Emscripten build as Emscripten emar (llvm-ar) neither takes archives directly as input nor supports MRI-style script
  470. # b) When the build tree path contains special characters for MRI scripts (space, '+', '*', ';', ',') as escaping is not supported
  471. get_filename_component (AR ${CMAKE_AR} NAME_WE)
  472. if (CMAKE_HOST_WIN32)
  473. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  474. COMMAND ${CMAKE_COMMAND} -E remove_directory archives
  475. COMMAND ${CMAKE_COMMAND} -E echo "Merging all archives into a single static library using ${AR}")
  476. foreach (ARCHIVE ${ARCHIVES})
  477. # Merge per library because Window cmd shell does not handle long argument list
  478. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory archives)
  479. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  480. COMMAND ${CMAKE_AR} x ${ARCHIVE}
  481. COMMAND ${CMAKE_COMMAND} -E echo_append "\\\"${CMAKE_AR}\\\"" q \\\"$<TARGET_FILE:${TARGET_NAME}>\\\" " " >merge.bat
  482. COMMAND for /F %%i in ('dir /B *.o*') do ${CMAKE_COMMAND} -E echo_append %%i" " >>merge.bat
  483. COMMAND merge.bat WORKING_DIRECTORY archives)
  484. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory archives)
  485. endforeach ()
  486. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${TARGET_NAME}>)
  487. else ()
  488. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  489. COMMAND ${CMAKE_COMMAND} -E remove_directory archives
  490. COMMAND ${CMAKE_COMMAND} -E make_directory archives COMMENT "Merging all archives into a single static library using ${AR}")
  491. foreach (ARCHIVE ${ARCHIVES})
  492. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_AR} x ${ARCHIVE} WORKING_DIRECTORY archives)
  493. endforeach ()
  494. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_AR} q $<TARGET_FILE:${TARGET_NAME}> `ls -1` WORKING_DIRECTORY archives)
  495. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  496. COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${TARGET_NAME}>
  497. COMMAND ${CMAKE_COMMAND} -E remove_directory archives)
  498. endif ()
  499. else ()
  500. # GCC ar does not take archives directly as input like Apple libtool, however, it can be scripted to do so
  501. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  502. COMMAND ${CMAKE_COMMAND} -E rename $<TARGET_FILE:${TARGET_NAME}> $<TARGET_FILE:${TARGET_NAME}>.engine
  503. COMMAND echo CREATE $<TARGET_FILE:${TARGET_NAME}> >script.ar
  504. COMMAND echo ADDLIB $<TARGET_FILE:${TARGET_NAME}>.engine >>script.ar)
  505. foreach (ARCHIVE ${ARCHIVES})
  506. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND echo ADDLIB ${ARCHIVE} >>script.ar)
  507. endforeach ()
  508. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  509. COMMAND echo SAVE >>script.ar
  510. COMMAND echo END >>script.ar
  511. COMMAND ${CMAKE_AR} -M <script.ar
  512. COMMAND ${CMAKE_COMMAND} -E remove $<TARGET_FILE:${TARGET_NAME}>.engine script.ar
  513. COMMENT "Merging all archives into a single static library using ar")
  514. endif ()
  515. endif ()
  516. endif ()
  517. # 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)
  518. if (NOT URHO3D_LIB_TYPE STREQUAL STATIC)
  519. set_target_properties (${STATIC_LIBRARY_TARGETS} PROPERTIES POSITION_INDEPENDENT_CODE true)
  520. endif ()
  521. # Install headers for using the Urho3D library
  522. install_header_files (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.h DESTINATION ${DEST_INCLUDE_DIR} ACCUMULATE GENERATED_HEADERS)
  523. 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
  524. # Generate the include-all-headers header file even though we do not encourage Urho3D library users to use it
  525. list (SORT URHO_HEADERS)
  526. list (REVERSE URHO_HEADERS)
  527. set (OPTIONAL_SUBS AngelScript Database IK Lua Navigation Network Physics Urho2D)
  528. foreach (SUB ${OPTIONAL_SUBS})
  529. if (URHO_HEADERS MATCHES "(include/Urho3D/${SUB}[^;]+)")
  530. list (FIND URHO_HEADERS ${CMAKE_MATCH_1} FOUND_INDEX)
  531. list (INSERT URHO_HEADERS ${FOUND_INDEX} "#endif")
  532. endif ()
  533. endforeach ()
  534. list (REVERSE URHO_HEADERS)
  535. foreach (SUB ${OPTIONAL_SUBS})
  536. if (URHO_HEADERS MATCHES "(include/Urho3D/${SUB}[^;]+)")
  537. string (TOUPPER ${SUB} SUB)
  538. list (FIND URHO_HEADERS ${CMAKE_MATCH_1} FOUND_INDEX)
  539. list (INSERT URHO_HEADERS ${FOUND_INDEX} "#if URHO3D_${SUB}")
  540. endif ()
  541. endforeach ()
  542. string (REGEX REPLACE "include/[^;]+(DebugNew|Direct3D|GraphicsImpl|IKConverters|ODBC|OpenGL|Precompiled|SQLite|ToluaUtils|Urho3D|librevision)[^;]+;" "" URHO_HEADERS "${URHO_HEADERS};")
  543. string (REGEX REPLACE "include/([^;]+)" "#include <\\1>" URHO_HEADERS "${GENERATED_HEADERS};;${URHO_HEADERS}")
  544. string (REPLACE ";" \n URHO_HEADERS "${URHO_HEADERS}")
  545. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Urho3DAll.h.in ${CMAKE_CURRENT_BINARY_DIR}/Urho3DAll.h)
  546. install_header_files (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3DAll.h ${CMAKE_CURRENT_BINARY_DIR}/librevision.h DESTINATION ${DEST_INCLUDE_DIR})
  547. # Generate platform specific pkg-config file for the benefit of Urho3D library users via SDK without CMake
  548. if (ABSOLUTE_PATH_LIBS)
  549. 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
  550. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" URHO3D_ABS_PATH_LIBS "${URHO3D_ABS_PATH_LIBS}")
  551. endif ()
  552. if (MSVC)
  553. set (DASH /)
  554. set (LIB_DIR "/LIBPATH:\"\${libdir}\"")
  555. string (REPLACE ";" ".lib\" \"" URHO3D_LIBS "\"@LIB_NAME@\" \"${LIBS}.lib\"")
  556. set (PC_SUFFIX .msvc)
  557. else ()
  558. set (LIB_NAME ${TARGET_NAME})
  559. if (MINGW)
  560. if (CMAKE_BUILD_TYPE STREQUAL Debug)
  561. set (LIB_NAME ${LIB_NAME}_d)
  562. endif ()
  563. if (URHO3D_LIB_TYPE STREQUAL SHARED)
  564. set (LIB_NAME ${LIB_NAME}.dll)
  565. endif ()
  566. endif ()
  567. set (DASH -)
  568. set (LIB_DIR "-L\"\${libdir}\"")
  569. string (REPLACE ";" " -l" URHO3D_LIBS "-l${LIB_NAME};${LIBS}")
  570. endif ()
  571. string (REPLACE ";" " ${DASH}D" URHO3D_COMPILE_DEFINITIONS "${DASH}D${URHO3D_COMPILE_DEFINITIONS}")
  572. get_directory_property (GLOBAL_INCLUDE_DIRS DIRECTORY ${CMAKE_SOURCE_DIR} INCLUDE_DIRECTORIES)
  573. if (GLOBAL_INCLUDE_DIRS)
  574. string (REPLACE ";" "\" ${DASH}I\"" GLOBAL_INCLUDE_DIRS "${DASH}I\"${GLOBAL_INCLUDE_DIRS}\"")
  575. string (REPLACE "${SYSROOT}" "" GLOBAL_INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS})
  576. endif ()
  577. set (ENGINE_INCLUDE_DIRS "${DASH}I\"\${includedir}\" ${DASH}I\"\${includedir}/Urho3D/ThirdParty\"")
  578. if (URHO3D_PHYSICS)
  579. # Bullet library depends on its own include dir to be added in the header search path
  580. # This is more practical than patching its header files in many places to make them work with relative path
  581. set (ENGINE_INCLUDE_DIRS "${ENGINE_INCLUDE_DIRS} ${DASH}I\"\${includedir}/Urho3D/ThirdParty/Bullet\"")
  582. endif ()
  583. if (URHO3D_LUA)
  584. # ditto for Lua/LuaJIT
  585. set (ENGINE_INCLUDE_DIRS "${ENGINE_INCLUDE_DIRS} ${DASH}I\"\${includedir}/Urho3D/ThirdParty/Lua${JIT}\"")
  586. endif ()
  587. string (REGEX REPLACE " -include \"[^\"]+\"" "" CLEANED_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  588. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" CLEANED_CMAKE_CXX_FLAGS "${CLEANED_CMAKE_CXX_FLAGS}")
  589. string (REPLACE "${SYSROOT}" "\${pc_sysrootdir}" CLEANED_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  590. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Urho3D.pc.in ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.pc${PC_SUFFIX} @ONLY)
  591. if (MSVC)
  592. 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)
  593. endif ()
  594. if (ANDROID)
  595. # 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
  596. set (RENAME RENAME Urho3D-${ANDROID_ABI}.pc)
  597. endif ()
  598. install (FILES ${CMAKE_CURRENT_BINARY_DIR}/Urho3D.pc DESTINATION ${DEST_PKGCONFIG_DIR} ${RENAME})
  599. # Define post build steps
  600. if (URHO3D_LIB_TYPE STREQUAL SHARED AND ARM)
  601. # 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)
  602. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${TARGET_NAME}>
  603. COMMENT "Stripping Urho3D shared library")
  604. endif ()
  605. if (URHO3D_SCP_TO_TARGET)
  606. # Ensure SCP is the last command
  607. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD COMMAND scp $<TARGET_FILE:${TARGET_NAME}> ${URHO3D_SCP_TO_TARGET} || exit 0
  608. COMMENT "Scp-ing Urho3D library to target system")
  609. endif ()