CMakeLists.txt 33 KB

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