CMakeLists.txt 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  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. # Based on src/Makefile from http://luajit.org
  23. # The cross-compiling logic is ported to CMake as faithful as possible although currently Urho3D does not support all target archs supported by LuaJIT
  24. if (NOT CMAKE_PROJECT_NAME STREQUAL Urho3D)
  25. # Set CMake minimum version and CMake policy required by UrhoCommon module
  26. if (APPLE)
  27. cmake_minimum_required (VERSION 3.4.1)
  28. else ()
  29. cmake_minimum_required (VERSION 3.2.3)
  30. endif ()
  31. if (COMMAND cmake_policy)
  32. # Libraries linked via full path no longer produce linker search paths
  33. cmake_policy (SET CMP0003 NEW)
  34. # INTERFACE_LINK_LIBRARIES defines the link interface
  35. cmake_policy (SET CMP0022 NEW)
  36. # Disallow use of the LOCATION target property - so we set to OLD as we still need it
  37. cmake_policy (SET CMP0026 OLD)
  38. # MACOSX_RPATH is enabled by default
  39. cmake_policy (SET CMP0042 NEW)
  40. # Honor the visibility properties for SHARED target types only
  41. cmake_policy (SET CMP0063 OLD)
  42. endif ()
  43. # Set project name
  44. project (Urho3D-ExternalProject-LuaJIT-${ARCH})
  45. # Set CMake modules search path
  46. set (CMAKE_MODULE_PATH ${BAKED_CMAKE_SOURCE_DIR}/CMake/Modules)
  47. # Include UrhoCommon.cmake module after setting project name
  48. include (UrhoCommon)
  49. # When performing Xcode CI build suppress all the warnings for 3rd party libraries because there are just too many of them
  50. if (XCODE AND DEFINED ENV{CI})
  51. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
  52. endif ()
  53. elseif (NOT BAKED_CMAKE_SOURCE_DIR)
  54. set (BAKED_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR})
  55. endif ()
  56. # Makefile: Compiler options
  57. if (NOT MSVC)
  58. # Since the assembler part does NOT maintain a frame pointer, it's pointless
  59. # to slow down the C part by not omitting it. Debugging, tracebacks and
  60. # unwinding are not affected -- the assembler part has frame unwind
  61. # information and GCC emits it where needed (x64) or with -g (see CCDEBUG).
  62. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer")
  63. endif ()
  64. # Makefile: Build mode
  65. # When LuaJIT is enabled for Urho3D, always build as static library to be linked against in main Urho3D executable or library CMake target
  66. # Use -DURHO3D_LUAJIT_AMALG=1 to compile LuaJIT core as one huge C file and allows GCC to generate faster and shorter code
  67. # Use -Dxxxxx=0/1/2 as CMake build option to turn off/on the features and debugging support below
  68. # Makefile: Features
  69. #
  70. # Undocumented in the original Makefile yet, but it seems to be a new option which is only used when targeting Xbox One
  71. if (LUAJIT_ENABLE_GC64)
  72. add_definitions (-DLUAJIT_ENABLE_GC64)
  73. endif ()
  74. # Permanently disable the FFI extension to reduce the size of the LuaJIT
  75. # executable. But please consider that the FFI library is compiled-in,
  76. # but NOT loaded by default. It only allocates any memory, if you actually
  77. # make use of it.
  78. if (LUAJIT_DISABLE_FFI)
  79. add_definitions (-DLUAJIT_DISABLE_FFI)
  80. endif ()
  81. # Features from Lua 5.2 that are unlikely to break existing code are
  82. # enabled by default. Some other features that *might* break some existing
  83. # code (e.g. __pairs or os.execute() return values) can be enabled here.
  84. # Note: this does not provide full compatibility with Lua 5.2 at this time.
  85. if (LUAJIT_ENABLE_LUA52COMPAT)
  86. add_definitions (-DLUAJIT_ENABLE_LUA52COMPAT)
  87. endif ()
  88. # Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter.
  89. if (LUAJIT_DISABLE_JIT)
  90. add_definitions (-DLUAJIT_DISABLE_JIT)
  91. endif ()
  92. # Some architectures (e.g. PPC) can use either single-number (1) or
  93. # dual-number (2) mode. Uncomment one of these lines to override the
  94. # default mode. Please see LJ_ARCH_NUMMODE in lj_arch.h for details.
  95. if (DEFINED LUAJIT_NUMMODE)
  96. add_definitions (-DLUAJIT_NUMMODE=${LUAJIT_NUMMODE})
  97. endif ()
  98. # Makefile: Debugging support
  99. # Note that most of these are NOT suitable for benchmarking or release mode!
  100. #
  101. # Use the system provided memory allocator (realloc) instead of the
  102. # bundled memory allocator. This is slower, but sometimes helpful for
  103. # debugging. This option cannot be enabled on x64, since realloc usually
  104. # doesn't return addresses in the right address range.
  105. # OTOH this option is mandatory for Valgrind's memcheck tool on x64 and
  106. # the only way to get useful results from it for all other architectures.
  107. if (LUAJIT_USE_SYSMALLOC)
  108. add_definitions (-DLUAJIT_USE_SYSMALLOC)
  109. endif ()
  110. # This define is required to run LuaJIT under Valgrind. The Valgrind
  111. # header files must be installed. You should enable debug information, too.
  112. # Use --suppressions=lj.supp to avoid some false positives.
  113. if (LUAJIT_USE_VALGRIND)
  114. add_definitions (-DLUAJIT_USE_VALGRIND)
  115. endif ()
  116. # This is the client for the GDB JIT API. GDB 7.0 or higher is required
  117. # to make use of it. See lj_gdbjit.c for details. Enabling this causes
  118. # a non-negligible overhead, even when not running under GDB.
  119. if (LUAJIT_USE_GDBJIT)
  120. add_definitions (-DLUAJIT_USE_GDBJIT)
  121. endif ()
  122. # Turn on assertions for the Lua/C API to debug problems with lua_* calls.
  123. # This is rather slow -- use only while developing C libraries/embeddings.
  124. if (LUA_USE_APICHECK)
  125. add_definitions (-DLUA_USE_APICHECK)
  126. endif ()
  127. # Turn on assertions for the whole LuaJIT VM. This significantly slows down
  128. # everything. Use only if you suspect a problem with LuaJIT itself.
  129. if (LUA_USE_ASSERT)
  130. add_definitions (-DLUA_USE_ASSERT)
  131. endif ()
  132. # Makefile: Host system detection.
  133. if (CMAKE_HOST_WIN32)
  134. set (HOST_SYS Windows)
  135. else ()
  136. execute_process (COMMAND uname -s OUTPUT_VARIABLE HOST_SYS ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
  137. endif ()
  138. # Macro for finding a substring in TARGET_TESTARCH variable
  139. macro (find_string find_regex output_var)
  140. message (STATUS "Detecting LuaJIT ${output_var}")
  141. string (REGEX MATCH ${find_regex} matched "${TARGET_TESTARCH}") # Stringify to guard against empty string
  142. if (matched)
  143. string (REGEX MATCH "\\(.*\\)" captured "${find_regex}")
  144. if (captured)
  145. string (REGEX REPLACE ${find_regex} \\1 matched "${matched}")
  146. endif ()
  147. set (${output_var} ${matched})
  148. message (STATUS "Detecting LuaJIT ${output_var} - found (${matched})")
  149. else ()
  150. message (STATUS "Detecting LuaJIT ${output_var} - not found")
  151. endif ()
  152. endmacro ()
  153. # Makefile: Flags and options for host and target
  154. if (NOT LUAJIT_CACHE STREQUAL "${URHO3D_64BIT}-${LUAJIT_DISABLE_FFI}-${LUAJIT_DISABLE_JIT}-${LUAJIT_ENABLE_GC64}-${LUAJIT_NUMMODE}")
  155. if (MSVC)
  156. if (URHO3D_64BIT)
  157. set (MSVC_ARCH_BITS 64)
  158. set (MSVC_TARGET_ARCH X64)
  159. else ()
  160. set (MSVC_ARCH_BITS 32)
  161. set (MSVC_TARGET_ARCH X86)
  162. endif ()
  163. if (LUAJIT_DISABLE_FFI)
  164. set (MSVC_HASFFI 0)
  165. else ()
  166. set (MSVC_HASFFI 1)
  167. endif ()
  168. if (LUAJIT_DISABLE_JIT)
  169. set (MSVC_HASJIT 0)
  170. else ()
  171. set (MSVC_HASJIT 1)
  172. endif ()
  173. set (TARGET_TESTARCH
  174. "LJ_TARGET_${MSVC_TARGET_ARCH} 1\n"
  175. "LJ_ARCH_BITS ${MSVC_ARCH_BITS}\n"
  176. "LJ_HASFFI ${MSVC_HASFFI}\n"
  177. "LJ_HASJIT ${MSVC_HASJIT}\n"
  178. "LJ_ARCH_HASFPU 1\n"
  179. "LJ_ABI_SOFTFP 0\n")
  180. else ()
  181. string (REPLACE " " ";" TARGET_TCFLAGS "${CMAKE_C_FLAGS}") # Convert string of flags to list of flags
  182. get_directory_property (COMPILE_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS)
  183. string (REPLACE ";" ";-D" COMPILE_DEFINITIONS "-D${COMPILE_DEFINITIONS}") # Prefix defines with -D
  184. if (XCODE)
  185. if (ARCH) # The ARCH variable is defined only when we are building LuaJIT for non-native archs using external project
  186. set (ARCH_FLAGS -arch ${ARCH})
  187. elseif (ARM)
  188. if (URHO3D_64BIT)
  189. set (ARCH_FLAGS -arch arm64)
  190. else ()
  191. set (ARCH_FLAGS -arch armv7)
  192. endif ()
  193. elseif (NOT URHO3D_64BIT)
  194. set (ARCH_FLAGS -arch i386)
  195. endif ()
  196. endif ()
  197. execute_process (COMMAND egrep -V RESULT_VARIABLE EGREP_EXIT_CODE OUTPUT_QUIET ERROR_QUIET)
  198. if (EGREP_EXIT_CODE EQUAL 0)
  199. set (FILTER COMMAND egrep "LJ_|MIPSEL")
  200. endif ()
  201. execute_process (COMMAND ${CMAKE_C_COMPILER} ${COMPILE_DEFINITIONS} ${TARGET_TCFLAGS} ${ARCH_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/src/lj_arch.h -E -dM
  202. ${FILTER} OUTPUT_VARIABLE TARGET_TESTARCH ERROR_QUIET)
  203. endif ()
  204. find_string ("LJ_TARGET_(X64|X86|ARM|ARM64|PS3|PPC|MIPS) 1" TARGET_LJARCH)
  205. if (NOT TARGET_LJARCH)
  206. message (FATAL_ERROR "Unsupported target architecture")
  207. endif ()
  208. string (TOLOWER ${TARGET_LJARCH} TARGET_LJARCH)
  209. if (TARGET_LJARCH STREQUAL ppc)
  210. find_string ("LJ_LE (1)" LUAJIT_LE)
  211. if (LUAJIT_LE)
  212. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_ENDIAN=LUAJIT_LE)
  213. else ()
  214. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_ENDIAN=LUAJIT_BE)
  215. endif ()
  216. elseif (TARGET_LJARCH STREQUAL mips)
  217. find_string ("MIPSEL (1)" MIPSEL)
  218. if (MIPSEL)
  219. set (TARGET_ARCH ${TARGET_ARCH} -D__MIPSEL__=1)
  220. endif ()
  221. elseif (TARGET_LJARCH STREQUAL ps3)
  222. set (TARGET_SYS PS3)
  223. set (TARGET_ARCH ${TARGET_ARCH} -D__CELLOS_LV2__)
  224. add_definitions (-DLUAJIT_USE_SYSMALLOC)
  225. endif ()
  226. set (TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_TARGET=LUAJIT_ARCH_${TARGET_LJARCH})
  227. # Makefile: Target system detection
  228. if (IOS OR TVOS)
  229. set (TARGET_SYS iOS)
  230. elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
  231. set (TARGET_SYS Linux)
  232. elseif (MINGW)
  233. set (TARGET_SYS Windows)
  234. elseif (NOT TARGET_SYS)
  235. set (TARGET_SYS ${HOST_SYS})
  236. endif ()
  237. if (NOT HOST_SYS STREQUAL TARGET_SYS)
  238. if (TARGET_SYS STREQUAL Windows)
  239. set (HOST_XCFLAGS ${HOST_XCFLAGS} -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS)
  240. elseif (TARGET_SYS STREQUAL Linux)
  241. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_LINUX)
  242. elseif (TARGET_SYS MATCHES Darwin|iOS)
  243. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OSX)
  244. else ()
  245. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OTHER)
  246. endif ()
  247. endif ()
  248. # Makefile: Files and pathnames
  249. set (DASM_ARCH ${TARGET_LJARCH})
  250. find_string ("LJ_LE (1)" LITTLE_ENDIAN)
  251. if (LITTLE_ENDIAN)
  252. set (DASM_AFLAGS ${DASM_AFLAGS} -D ENDIAN_LE)
  253. else ()
  254. set (DASM_AFLAGS ${DASM_AFLAGS} -D ENDIAN_BE)
  255. endif ()
  256. find_string ("LJ_ARCH_BITS ([^\\n]*)" ARCH_BITS) # Workaround for "LJ_ARCH_BITS (.*?)\\n" as CMake does not understand non-greedy quantifier
  257. if (ARCH_BITS EQUAL 64)
  258. set (DASM_AFLAGS ${DASM_AFLAGS} -D P64)
  259. endif ()
  260. find_string ("LJ_HASJIT (1)" HASJIT)
  261. if (HASJIT)
  262. set (DASM_AFLAGS ${DASM_AFLAGS} -D JIT)
  263. endif ()
  264. find_string ("LJ_HASFFI (1)" HASFFI)
  265. if (HASFFI)
  266. set (DASM_AFLAGS ${DASM_AFLAGS} -D FFI)
  267. endif ()
  268. find_string ("LJ_DUALNUM (1)" DUALNUM)
  269. if (DUALNUM)
  270. set (DASM_AFLAGS ${DASM_AFLAGS} -D DUALNUM)
  271. endif ()
  272. find_string ("LJ_ARCH_HASFPU ([^\\n]*)" ARCH_HASFPU)
  273. if (ARCH_HASFPU)
  274. set (DASM_AFLAGS ${DASM_AFLAGS} -D FPU)
  275. endif ()
  276. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_HASFPU=${ARCH_HASFPU})
  277. find_string ("LJ_ABI_SOFTFP ([^\\n]*)" ABI_SOFTFP)
  278. if (NOT ABI_SOFTFP)
  279. set (DASM_AFLAGS ${DASM_AFLAGS} -D HFABI)
  280. endif ()
  281. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ABI_SOFTFP=${ABI_SOFTFP})
  282. find_string ("LJ_NO_UNWIND (1)" NO_UNWIND)
  283. if (NO_UNWIND)
  284. set (DASM_AFLAGS ${DASM_AFLAGS} -D NO_UNWIND)
  285. set (TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_NO_UNWIND)
  286. endif ()
  287. find_string ("LJ_ARCH_VERSION ([^\\n]*)" ARCH_VERSION)
  288. set (DASM_AFLAGS ${DASM_AFLAGS} -D VER=${ARCH_VERSION})
  289. if (TARGET_SYS STREQUAL Windows)
  290. set (DASM_AFLAGS ${DASM_AFLAGS} -D WIN)
  291. endif ()
  292. if (TARGET_LJARCH STREQUAL x64)
  293. find_string ("LJ_FR2 (1)" TWO_SLOT_FRAME)
  294. if (NOT TWO_SLOT_FRAME)
  295. set (DASM_ARCH x86)
  296. endif ()
  297. elseif (TARGET_LJARCH STREQUAL arm)
  298. if (TARGET_SYS STREQUAL iOS)
  299. set (DASM_AFLAGS ${DASM_AFLAGS} -D IOS)
  300. endif ()
  301. elseif (TARGET_LJARCH STREQUAL ppc)
  302. find_string ("LJ_ARCH_SQRT (1)" ARCH_SQRT)
  303. if (ARCH_SQRT)
  304. set (DASM_AFLAGS ${DASM_AFLAGS} -D SQRT)
  305. endif ()
  306. find_string ("LJ_ARCH_ROUND (1)" ARCH_ROUND)
  307. if (ARCH_ROUND)
  308. set (DASM_AFLAGS ${DASM_AFLAGS} -D ROUND)
  309. endif ()
  310. find_string ("LJ_ARCH_PPC32ON64 (1)" ARCH_PPC32ON64)
  311. if (ARCH_PPC32ON64)
  312. set (DASM_AFLAGS ${DASM_AFLAGS} -D GPR64)
  313. endif ()
  314. if (TARGET_SYS STREQUAL PS3)
  315. set (DASM_AFLAGS ${DASM_AFLAGS} -D PPE -D TOC)
  316. endif ()
  317. find_string ("LJ_ARCH_PPC64 (1)" ARCH_PPC64)
  318. if (ARCH_PPC64)
  319. set (DASM_ARCH ppc64)
  320. endif ()
  321. endif ()
  322. set (LUAJIT_CACHE "${URHO3D_64BIT}-${LUAJIT_DISABLE_FFI}-${LUAJIT_DISABLE_JIT}-${LUAJIT_ENABLE_GC64}-${LUAJIT_NUMMODE}" CACHE INTERNAL "LuaJIT - cache invalidator")
  323. set (TARGET_LJARCH ${TARGET_LJARCH} CACHE INTERNAL "LuaJIT - target architecture")
  324. set (TARGET_ARCH ${TARGET_ARCH} CACHE INTERNAL "LuaJIT - flags and options for target architecture")
  325. set (DASM_ARCH ${DASM_ARCH} CACHE INTERNAL "LuaJIT - dynasm architecture")
  326. set (DASM_FLAGS ${DASM_XFLAGS} ${DASM_AFLAGS} CACHE INTERNAL "LuaJIT - flags for dynasm")
  327. set (HOST_XCFLAGS ${HOST_XCFLAGS} CACHE INTERNAL "LuaJIT - host compiler flags")
  328. endif ()
  329. # Note that we have intentionally deviated from original Makefile for the following cases
  330. if (NOT MSVC)
  331. if (LUAJIT_NO_STACK_PROTECTION)
  332. # Original Makefile attempts to set -fno-stack-protector for non-MSVC compiler whenever it supports this flag, but we decided not to use this flag by default (use LUAJIT_NO_STACK_PROTECTION build option to override)
  333. execute_process (COMMAND ${CMAKE_COMMAND} -E echo COMMAND ${CMAKE_C_COMPILER} -fno-stack-protector -E - RESULT_VARIABLE EXIT_CODE OUTPUT_QUIET ERROR_QUIET)
  334. if (EXIT_CODE STREQUAL 0)
  335. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-stack-protector")
  336. endif ()
  337. endif ()
  338. if (TARGET_LJARCH STREQUAL x86)
  339. # Original Makefile enables the SSE when targeting x86 regardless, but we only enable it when URHO3D_SSE build option is also set
  340. if (URHO3D_SSE)
  341. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse") # When URHO3D_SSE is set then -msse -msse2 should be already configured at the global scope
  342. endif ()
  343. elseif (TARGET_LJARCH STREQUAL arm64)
  344. # Original Makefile only sets this flags for 64-bit iOS, but we set it for arm64 in general instead
  345. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
  346. endif ()
  347. endif ()
  348. # Makefile: Build mode handling
  349. # Urho3D only builds static LuaJIT library
  350. # Makefile: Make targets
  351. # The host tool must be built natively
  352. if (CMAKE_CROSSCOMPILING)
  353. check_native_compiler_exist ()
  354. # Escape the variables
  355. foreach (ESCAPED_VAR HOST_XCFLAGS TARGET_ARCH DASM_FLAGS DASM_ARCH)
  356. string (REPLACE -D +D ${ESCAPED_VAR} "${${ESCAPED_VAR}}")
  357. string (REPLACE ";" , ${ESCAPED_VAR} "${${ESCAPED_VAR}}")
  358. endforeach ()
  359. # When cross-compiling, build the host tool as external project
  360. include (ExternalProject)
  361. if (IOS OR TVOS)
  362. # 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
  363. # Also workaround a known CMake/Xcode generator bug which prevents it from installing native tool binaries correctly
  364. 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*")
  365. else ()
  366. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CC=${SAVED_CC} CXX=${SAVED_CXX} CI=$ENV{CI} ${CMAKE_COMMAND})
  367. endif ()
  368. set (TOOL_PATH ${CMAKE_CURRENT_BINARY_DIR}/tool/)
  369. ExternalProject_Add (buildvm
  370. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/host
  371. CMAKE_ARGS -DURHO3D_64BIT=${URHO3D_64BIT} -DDEST_RUNTIME_DIR=${TOOL_PATH} -DBAKED_CMAKE_SOURCE_DIR=${BAKED_CMAKE_SOURCE_DIR} -DHOST_XCFLAGS=${HOST_XCFLAGS} -DTARGET_ARCH=${TARGET_ARCH} -DDASM_FLAGS=${DASM_FLAGS} -DDASM_ARCH=${DASM_ARCH}
  372. ${ALTERNATE_COMMAND})
  373. else ()
  374. # Otherwise, build it internally as per normal
  375. set (PRIVATE PRIVATE)
  376. add_subdirectory (src/host)
  377. endif ()
  378. # Add definitions specific for target C Compiler
  379. if (NOT MSVC)
  380. # Large file support
  381. add_definitions (-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE)
  382. # Buffer overflows check
  383. add_definitions (-U_FORTIFY_SOURCE)
  384. endif ()
  385. # Define target name for LuaJIT library
  386. set (TARGET_NAME LuaJIT)
  387. # Macro for generating source file
  388. macro (generate_source name mode)
  389. set (GEN_SRC ${CMAKE_CURRENT_BINARY_DIR}/generated/${name})
  390. set (GEN_SRCS ${GEN_SRCS} ${GEN_SRC})
  391. add_custom_command (OUTPUT ${GEN_SRC}
  392. COMMAND ${TOOL_PATH}buildvm -m ${mode} -o ${GEN_SRC} ${ARGN}
  393. DEPENDS buildvm ${ARGN}
  394. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  395. COMMENT "Generating buildvm output: ${name}")
  396. endmacro ()
  397. # Define generated source files
  398. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)
  399. if (WIN32)
  400. set (LJVM_MODE peobj)
  401. set (LJVM_BOUT lj_vm.obj)
  402. else ()
  403. set (LJVM_BOUT lj_vm.S)
  404. enable_language (ASM)
  405. if (NATIVE_64BIT AND NOT URHO3D_64BIT) # Not the compiler native ABI, this could only happen on multilib-capable compilers
  406. set (CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -m32")
  407. endif ()
  408. if (APPLE)
  409. set (LJVM_MODE machasm)
  410. else ()
  411. set (LJVM_MODE elfasm)
  412. endif ()
  413. endif ()
  414. set (LJLIB_C src/lib_base.c src/lib_math.c src/lib_bit.c src/lib_string.c src/lib_table.c
  415. src/lib_io.c src/lib_os.c src/lib_package.c src/lib_debug.c src/lib_jit.c src/lib_ffi.c)
  416. generate_source (${LJVM_BOUT} ${LJVM_MODE})
  417. foreach (MODE bcdef ffdef libdef recdef)
  418. generate_source (lj_${MODE}.h ${MODE} ${LJLIB_C})
  419. endforeach ()
  420. generate_source (vmdef.lua vmdef ${LJLIB_C})
  421. generate_source (lj_folddef.h folddef src/lj_opt_fold.c)
  422. # Define source files
  423. if (URHO3D_LUAJIT_AMALG)
  424. set (LJCORE_C src/ljamalg.c)
  425. else ()
  426. set (LJCORE_C src/lj_gc.c src/lj_err.c src/lj_char.c src/lj_bc.c src/lj_obj.c src/lj_buf.c
  427. src/lj_str.c src/lj_tab.c src/lj_func.c src/lj_udata.c src/lj_meta.c src/lj_debug.c
  428. src/lj_state.c src/lj_dispatch.c src/lj_vmevent.c src/lj_vmmath.c src/lj_strscan.c
  429. src/lj_strfmt.c src/lj_strfmt_num.c src/lj_api.c src/lj_profile.c
  430. src/lj_lex.c src/lj_parse.c src/lj_bcread.c src/lj_bcwrite.c src/lj_load.c
  431. src/lj_ir.c src/lj_opt_mem.c src/lj_opt_fold.c src/lj_opt_narrow.c
  432. src/lj_opt_dce.c src/lj_opt_loop.c src/lj_opt_split.c src/lj_opt_sink.c
  433. src/lj_mcode.c src/lj_snap.c src/lj_record.c src/lj_crecord.c src/lj_ffrecord.c
  434. src/lj_asm.c src/lj_trace.c src/lj_gdbjit.c
  435. src/lj_ctype.c src/lj_cdata.c src/lj_cconv.c src/lj_ccall.c src/lj_ccallback.c
  436. src/lj_carith.c src/lj_clib.c src/lj_cparse.c
  437. src/lj_lib.c src/lj_alloc.c src/lib_aux.c
  438. ${LJLIB_C} src/lib_init.c)
  439. endif ()
  440. set (SOURCE_FILES ${LJCORE_C} ${GEN_SRCS})
  441. # Define dependency libs
  442. set (INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/generated)
  443. # Setup target
  444. if (XCODE)
  445. if (ARCH)
  446. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ARCHS ${ARCH})
  447. elseif (URHO3D_64BIT OR ARM)
  448. set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
  449. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH YES)
  450. if (URHO3D_64BIT AND ARM)
  451. list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ARCHS arm64) # The ARCHS_STANDARD builds armv7 first, but we have setup LuaJIT target detection to detect arm64 as the default arch so we override Xcode to build arm64 first
  452. endif ()
  453. endif ()
  454. endif ()
  455. setup_library (${EXCLUDE_FROM_ALL})
  456. if (XCODE AND NOT ARCH) # These variables are used to control the recursion as this script is recursive in nature on Xcode
  457. # Add external and custom targets to build Mach-O universal binary LuaJIT sub-library
  458. include (ExternalProject)
  459. foreach (LUAJIT_OPT LUAJIT_ENABLE_GC64 LUAJIT_DISABLE_FFI LUAJIT_ENABLE_LUA52COMPAT LUAJIT_DISABLE_JIT LUAJIT_NUMMODE LUAJIT_USE_SYSMALLOC LUAJIT_USE_VALGRIND LUAJIT_USE_GDBJIT LUA_USE_APICHECK LUA_USE_ASSERT LUAJIT_NO_STACK_PROTECTION IOS IPHONEOS_DEPLOYMENT_TARGET TVOS APPLETVOS_DEPLOYMENT_TARGET URHO3D_LUAJIT_AMALG BAKED_CMAKE_SOURCE_DIR)
  460. if (DEFINED ${LUAJIT_OPT})
  461. list (APPEND LUAJIT_PASSTHRU_OPTS -D${LUAJIT_OPT}=${${LUAJIT_OPT}})
  462. endif ()
  463. endforeach ()
  464. if (IOS OR TVOS)
  465. set (ALTERNATE_COMMAND CMAKE_COMMAND /usr/bin/env -i PATH=$ENV{PATH} CI=$ENV{CI} ${CMAKE_COMMAND})
  466. else ()
  467. set (ALTERNATE_COMMAND CMAKE_COMMAND ${CMAKE_COMMAND} -E env CI=$ENV{CI} ${CMAKE_COMMAND})
  468. endif ()
  469. # There is a CMake bug where a mere reference to a target using generator-expression would cause it to be added as dependency, we have to use a hack to workaround this bug
  470. if (IOS)
  471. ExternalProject_Add (${TARGET_NAME}_i386
  472. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  473. CMAKE_ARGS -DARCH=i386 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 ${LUAJIT_PASSTHRU_OPTS} ${ALTERNATE_COMMAND} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG> -- -sdk iphonesimulator)
  474. if (URHO3D_64BIT)
  475. # 64-bit iOS universal binaries: for iPhoneOS SDK contains arm64 and armv7 archs, and for iPhoneSimulator SDK contains x86_64 and i386 archs
  476. ExternalProject_Add (${TARGET_NAME}_x86_64
  477. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  478. CMAKE_ARGS -DARCH=x86_64 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} ${LUAJIT_PASSTHRU_OPTS} ${ALTERNATE_COMMAND} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG> -- -sdk iphonesimulator)
  479. add_custom_target (${TARGET_NAME}_universal-iphonesimulator
  480. COMMAND if [ '$(CONFIGURATION)' == 'Debug' ]\; then if [ '$(ARCHS)' == 'x86_64' ]\; then rm -f ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a && arch=x86_64\; else arch=i386\; fi && xcodebuild -target ${TARGET_NAME}_$$arch -configuration $(CONFIGURATION) && cp -p ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a{.$$arch,}\; elif lipo -info ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a 2>/dev/null |egrep -cq 'i386.*x86_64|x86_64.*i386'\; then echo Already a Mach-O universal binary library\; else for arch in _x86_64 _i386\; do xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION)\; done && lipo -create -output ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a{,.x86_64,.i386}\; fi
  481. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  482. ExternalProject_Add (${TARGET_NAME}_armv7
  483. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  484. CMAKE_ARGS -DARCH=armv7 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 ${LUAJIT_PASSTHRU_OPTS} ${ALTERNATE_COMMAND} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG>)
  485. add_custom_target (${TARGET_NAME}_universal-iphoneos
  486. COMMAND if [ '$(CONFIGURATION)' == 'Debug' ]\; then if [ '$(ARCHS)' == 'arm64' ]\; then rm -f ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a && arch=\; else arch=_armv7\; fi && xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION) && if [ $$arch ]\; then cp -p ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a{.armv7,}\; fi\; elif lipo -info ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a 2>/dev/null |egrep -cq 'armv7.*arm64|arm64.*armv7'\; then echo Already a Mach-O universal binary library\; else for arch in \"\" _armv7\; do xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION)\; done && mv ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a{,.arm64} && lipo -create -output ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a{,.arm64,.armv7}\; fi
  487. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  488. else ()
  489. # 32-bit iOS universal binary contains both armv7 (iPhoneOS) and i386 (iPhoneSimulator) archs
  490. add_custom_target (${TARGET_NAME}_universal-iphonesimulator
  491. COMMAND xcodebuild -target ${TARGET_NAME}_i386 -configuration $(CONFIGURATION) && cp -p ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a{.i386,}
  492. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  493. add_custom_target (${TARGET_NAME}_universal-iphoneos
  494. COMMAND xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION)
  495. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  496. endif ()
  497. add_custom_target (${TARGET_NAME}_universal ALL
  498. COMMAND if [ '$(CONFIGURATION)' != 'Debug' ] || echo '$(ARCHS)' |grep -cq arm\; then xcodebuild ARCHS="$(ARCHS)" -target ${TARGET_NAME}_universal-iphoneos -configuration $(CONFIGURATION)\; fi
  499. COMMAND if [ '$(CONFIGURATION)' != 'Debug' ] || echo '$(ARCHS)' |grep -cq 86\; then xcodebuild ARCHS="$(ARCHS)" -target ${TARGET_NAME}_universal-iphonesimulator -configuration $(CONFIGURATION)\; fi
  500. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  501. COMMENT "Creating Mach-O universal binary LuaJIT library")
  502. elseif (TVOS)
  503. # 64-bit tvOS universal binary contains both arm64 (AppleTVOS) and x86_64 (AppleTVSimulator) archs
  504. ExternalProject_Add (${TARGET_NAME}_x86_64
  505. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  506. CMAKE_ARGS -DARCH=x86_64 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} ${LUAJIT_PASSTHRU_OPTS} ${ALTERNATE_COMMAND} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG> -- -sdk appletvsimulator)
  507. add_custom_target (${TARGET_NAME}_universal-appletvsimulator
  508. COMMAND xcodebuild -target ${TARGET_NAME}_x86_64 -configuration $(CONFIGURATION) && cp -p ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-appletvsimulator/lib${TARGET_NAME}.a{.x86_64,}
  509. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  510. add_custom_target (${TARGET_NAME}_universal-appletvos
  511. COMMAND xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION)
  512. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  513. add_custom_target (${TARGET_NAME}_universal ALL
  514. COMMAND if [ '$(CONFIGURATION)' != 'Debug' ] || echo '$(ARCHS)' |grep -cq arm\; then xcodebuild ARCHS="$(ARCHS)" -target ${TARGET_NAME}_universal-appletvos -configuration $(CONFIGURATION)\; fi
  515. COMMAND if [ '$(CONFIGURATION)' != 'Debug' ] || echo '$(ARCHS)' |grep -cq 86\; then xcodebuild ARCHS="$(ARCHS)" -target ${TARGET_NAME}_universal-appletvsimulator -configuration $(CONFIGURATION)\; fi
  516. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  517. COMMENT "Creating Mach-O universal binary LuaJIT library")
  518. elseif (URHO3D_UNIVERSAL)
  519. # macOS universal binary contains both x86_86 and i386 archs
  520. ExternalProject_Add (${TARGET_NAME}_i386
  521. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  522. CMAKE_ARGS -DARCH=i386 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 ${LUAJIT_PASSTHRU_OPTS} ${ALTERNATE_COMMAND})
  523. add_custom_target (${TARGET_NAME}_universal ALL
  524. COMMAND if [ '$(CONFIGURATION)' == 'Debug' ]\; then if [ '$(ARCHS)' == 'x86_64' ]\; then rm -f ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>/lib${TARGET_NAME}.a && arch=\; else arch=_i386\; fi && xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION) && if [ $$arch ]\; then cp -p ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>/lib${TARGET_NAME}.a{.i386,}\; fi\; elif lipo -info ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>/lib${TARGET_NAME}.a 2>/dev/null |egrep -cq 'i386.*x86_64|x86_64.*i386'\; then echo Already a Mach-O universal binary library\; else for arch in \"\" _i386\; do xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION)\; done && mv ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>/lib${TARGET_NAME}.a{,.x86_64} && lipo -create -output ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>/lib${TARGET_NAME}.a{,.x86_64,.i386}\; fi
  525. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  526. COMMENT "Creating Mach-O universal binary LuaJIT library")
  527. endif ()
  528. elseif (INSTALL_ARCHIVE_DIR)
  529. # This is a hack as it relies on CMake internal implementation
  530. install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${INSTALL_ARCHIVE_DIR}/$<CONFIG>\${EFFECTIVE_PLATFORM_NAME} RENAME lib${TARGET_NAME}.a.${ARCH})
  531. endif ()
  532. # Install headers for building and using the Urho3D library (no direct dependencies but library user may need them)
  533. install_header_files (DIRECTORY src/ DESTINATION ${DEST_INCLUDE_DIR}/ThirdParty/LuaJIT FILES_MATCHING PATTERN *.h *.hpp) # Note: the trailing slash is significant
  534. # Setup additional Lua standalone target (this target can be transfered and executed on an embedded device, such as Raspberry Pi and Android)
  535. if (NOT CMAKE_PROJECT_NAME MATCHES ^Urho3D-ExternalProject-LuaJIT AND NOT IOS AND NOT TVOS AND NOT WEB)
  536. # Define target name for LuaJIT interpreter cum compiler
  537. set (TARGET_NAME luajit_interpreter) # Note: intended target name is 'luajit' which clashes with 'LuaJIT' library target above for case-insensitive platform
  538. # Define source files
  539. set (SOURCE_FILES src/luajit.c)
  540. # Define dependency libs
  541. if (NOT TARGET LuaJIT_universal)
  542. set (LIBS LuaJIT)
  543. endif ()
  544. if (NOT MSVC)
  545. list (APPEND LIBS m)
  546. endif ()
  547. # Setup target
  548. setup_executable (NODEPS)
  549. adjust_target_name () # Adjust to intended target output name
  550. if (TARGET LuaJIT_universal)
  551. add_dependencies (${TARGET_NAME} LuaJIT_universal)
  552. target_link_libraries (${TARGET_NAME} ${CMAKE_BINARY_DIR}/Source/ThirdParty/LuaJIT/$<CONFIG>/libLuaJIT.a) # This is a hack as CMake does not allow custom target in generator-expression, like $<TARGET_FILE:LuaJIT_universal>
  553. endif ()
  554. # Define post build steps
  555. set (LUAJIT_DEP_DIR ${CMAKE_BINARY_DIR}/bin/jit)
  556. add_custom_command (TARGET ${TARGET_NAME} POST_BUILD
  557. COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/jit ${LUAJIT_DEP_DIR}
  558. COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/generated/vmdef.lua ${LUAJIT_DEP_DIR}
  559. COMMENT "Copying dependency files for luajit standalone executable")
  560. add_make_clean_files (${LUAJIT_DEP_DIR})
  561. # Install dependency files required by luajit
  562. if (DEST_RUNTIME_DIR)
  563. install (DIRECTORY ${LUAJIT_DEP_DIR} DESTINATION ${DEST_RUNTIME_DIR})
  564. endif ()
  565. endif ()
  566. # Add directory containing the dependency files into the LuaJIT module search path
  567. set (LUA_RDIR ./) # Relative directory
  568. set (LUA_IDIR ${CMAKE_INSTALL_PREFIX}/${DEST_RUNTIME_DIR}/) # Installation directory
  569. add_definitions (-DLUA_RDIR="${LUA_RDIR}" -DLUA_IDIR="${LUA_IDIR}")