DetectTargetArchitecture.cmake 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #
  2. # Copyright (c) 2008-2013 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. # Macro for finding a substring
  23. macro (find_string find_regex input_string output_string)
  24. if (NOT DEFINED ${output_string}${ARGN})
  25. message (STATUS "Finding value for LuaJIT:${output_string}${ARGN}")
  26. string (REGEX MATCH ${find_regex} matched ${input_string})
  27. if (matched)
  28. string (REGEX MATCH "\\(.*\\)" captured ${find_regex})
  29. if (captured)
  30. string (REGEX REPLACE ${find_regex} \\1 matched ${matched})
  31. endif ()
  32. set (${output_string}${ARGN} ${matched} CACHE INTERNAL "LUAJIT INTERNAL - ${output_string}${ARGN}")
  33. message (STATUS "Finding value for LuaJIT:${output_string}${ARGN} - found (${matched})")
  34. else ()
  35. set (${output_string}${ARGN} 0 CACHE INTERNAL "LUAJIT INTERNAL - ${output_string}${ARGN}")
  36. endif ()
  37. endif ()
  38. if (${ARGC} EQUAL 4)
  39. list (GET ${output_string}${ARGN} 0 ${output_string})
  40. endif ()
  41. endmacro ()
  42. # Makefile: Architecture detection
  43. find_string ("LJ_TARGET_(X64|X86|ARM|PPC|PPCSPE|MIPS) 1" "${TARGET_TESTARCH}" TARGET_LJARCH ${VARIANT})
  44. if (TARGET_LJARCH)
  45. string (TOLOWER ${TARGET_LJARCH} TARGET_LJARCH)
  46. set (TARGET_LJARCH${VARIANT} ${TARGET_LJARCH} CACHE INTERNAL "LUAJIT INTERNAL - TARGET_LJARCH${VARIANT}")
  47. if (TARGET_LJARCH STREQUAL x64 AND NOT URHO3D_64BIT)
  48. set (TARGET_LJARCH x86)
  49. endif ()
  50. else ()
  51. message (FATAL_ERROR "Unsupported target architecture")
  52. endif ()
  53. if (TARGET_LJARCH STREQUAL mips)
  54. find_string ("MIPSEL (1)" "${TARGET_TESTARCH}" MIPSEL ${VARIANT})
  55. if (MIPSEL)
  56. set (TARGET_ARCH ${TARGET_ARCH} -D__MIPSEL__=1)
  57. endif ()
  58. endif ()
  59. find_string ("LJ_TARGET_PS3 (1)" "${TARGET_TESTARCH}" PS3 ${VARIANT})
  60. if (PS3)
  61. set (TARGET_SYS PS3)
  62. set (TARGET_ARCH ${TARGET_ARCH} -D__CELLOS_LV2__)
  63. add_definitions (-DLUAJIT_USE_SYSMALLOC)
  64. endif ()
  65. find_string ("LJ_NO_UNWIND (1)" "${TARGET_TESTARCH}" NO_UNWIND ${VARIANT})
  66. if (NO_UNWIND)
  67. set (TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_NO_UNWIND)
  68. endif ()
  69. set (TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_TARGET=LUAJIT_ARCH_${TARGET_LJARCH})
  70. # Makefile: System detection
  71. if (WIN32)
  72. set (HOST_SYS Windows)
  73. else ()
  74. execute_process (COMMAND uname -s OUTPUT_VARIABLE HOST_SYS ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
  75. endif ()
  76. if (VARIANT)
  77. if (VARIANT MATCHES ios)
  78. set (TARGET_SYS iOS)
  79. elseif (VARIANT MATCHES android|raspi)
  80. set (TARGET_SYS Linux)
  81. elseif (VARIANT MATCHES mingw)
  82. set (TARGET_SYS Windows)
  83. else ()
  84. message (FATAL_ERROR "Unsupported buildvm variant: ${VARIANT}")
  85. endif ()
  86. # Makefile: ifneq ($(HOST_SYS),$(TARGET_SYS))
  87. if (TARGET_SYS STREQUAL Windows)
  88. set (HOST_XCFLAGS ${HOST_XCFLAGS} -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS)
  89. elseif (TARGET_SYS STREQUAL Linux)
  90. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_LINUX)
  91. elseif (TARGET_SYS MATCHES Darwin|iOS)
  92. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OSX)
  93. else ()
  94. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OTHER)
  95. endif ()
  96. else ()
  97. set (TARGET_SYS ${HOST_SYS})
  98. endif ()
  99. # Makefile: Files and pathnames
  100. set (DASM_DIR ${PROJECT_SOURCE_DIR}/ThirdParty/LuaJIT/dynasm)
  101. set (DASM_ARCH ${TARGET_LJARCH})
  102. # Below regex is a workaround for "LJ_ARCH_BITS (.*?)\\n" as CMake does not understand non-greedy quantifier
  103. find_string ("LJ_ARCH_BITS ([^\\n]*)" "${TARGET_TESTARCH}" ARCH_BITS ${VARIANT})
  104. if (ARCH_BITS EQUAL 64)
  105. if (URHO3D_64BIT)
  106. set (DASM_AFLAGS ${DASM_AFLAGS} -D P64)
  107. else ()
  108. set (ARCH_BITS 32)
  109. endif ()
  110. endif ()
  111. if (VARIANT)
  112. if (MSVC)
  113. message (FATAL_ERROR "MSVC is not able to build 'buildvm${VARIANT}' target at this moment, please use GCC or LLVM/Clang instead. "
  114. "To recover from this error, remove this file (generated by Android build script when LuaJIT is enabled) in ${PROJECT_ROOT_DIR}/Bin/buildvm${VARIANT}-arch.txt.")
  115. else ()
  116. string (REGEX REPLACE "-m(32|64) *" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
  117. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ARCH_BITS}")
  118. endif ()
  119. endif ()
  120. find_string ("LJ_HASJIT (1)" "${TARGET_TESTARCH}" HASJIT ${VARIANT})
  121. if (HASJIT)
  122. set (DASM_AFLAGS ${DASM_AFLAGS} -D JIT)
  123. endif ()
  124. find_string ("LJ_HASFFI (1)" "${TARGET_TESTARCH}" HASFFI ${VARIANT})
  125. if (HASFFI)
  126. set (DASM_AFLAGS ${DASM_AFLAGS} -D FFI)
  127. endif ()
  128. find_string ("LJ_DUALNUM (1)" "${TARGET_TESTARCH}" DUALNUM ${VARIANT})
  129. if (DUALNUM)
  130. set (DASM_AFLAGS ${DASM_AFLAGS} -D DUALNUM)
  131. endif ()
  132. find_string ("LJ_ARCH_HASFPU (1)" "${TARGET_TESTARCH}" ARCH_HASFPU ${VARIANT})
  133. if (ARCH_HASFPU)
  134. set (DASM_AFLAGS ${DASM_AFLAGS} -D FPU)
  135. endif ()
  136. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_HASFPU=${ARCH_HASFPU})
  137. find_string ("LJ_ABI_SOFTFP (1)" "${TARGET_TESTARCH}" ABI_SOFTFP ${VARIANT})
  138. if (NOT ABI_SOFTFP)
  139. set (DASM_AFLAGS ${DASM_AFLAGS} -D HFABI)
  140. endif ()
  141. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ABI_SOFTFP=${ABI_SOFTFP})
  142. # Below regex is a workaround for "LJ_ARCH_VERSION (.*?)\\n" as CMake does not understand non-greedy quantifier
  143. find_string ("LJ_ARCH_VERSION ([^\\n]*)" "${TARGET_TESTARCH}" ARCH_VERSION ${VARIANT})
  144. if (ARCH_VERSION)
  145. set (DASM_AFLAGS ${DASM_AFLAGS} -D VER=${ARCH_VERSION})
  146. else ()
  147. set (DASM_AFLAGS ${DASM_AFLAGS} -D VER=)
  148. endif ()
  149. if (TARGET_SYS STREQUAL Windows)
  150. set (DASM_AFLAGS ${DASM_AFLAGS} -D WIN)
  151. endif ()
  152. if (TARGET_LJARCH STREQUAL x86)
  153. find_string ("__SSE2__ (1)" "${TARGET_TESTARCH}" SSE2 ${VARIANT})
  154. if (SSE2)
  155. set (DASM_AFLAGS ${DASM_AFLAGS} -D SSE)
  156. endif ()
  157. elseif (TARGET_LJARCH STREQUAL x64)
  158. set (DASM_ARCH x86)
  159. elseif (TARGET_LJARCH STREQUAL arm)
  160. if (TARGET_SYS STREQUAL iOS)
  161. set (DASM_AFLAGS ${DASM_AFLAGS} -D IOS)
  162. endif ()
  163. elseif (TARGET_LJARCH STREQUAL ppc)
  164. find_string ("LJ_ARCH_SQRT (1)" "${TARGET_TESTARCH}" ARCH_SQRT ${VARIANT})
  165. if (ARCH_SQRT)
  166. set (DASM_AFLAGS ${DASM_AFLAGS} -D SQRT)
  167. endif ()
  168. find_string ("LJ_ARCH_ROUND (1)" "${TARGET_TESTARCH}" ARCH_ROUND ${VARIANT})
  169. if (ARCH_ROUND)
  170. set (DASM_AFLAGS ${DASM_AFLAGS} -D ROUND)
  171. endif ()
  172. find_string ("LJ_ARCH_PPC64 (1)" "${TARGET_TESTARCH}" ARCH_PPC64 ${VARIANT})
  173. if (ARCH_PPC64)
  174. set (DASM_AFLAGS ${DASM_AFLAGS} -D GPR64)
  175. endif ()
  176. if (TARGET_SYS STREQUAL PS3)
  177. set (DASM_AFLAGS ${DASM_AFLAGS} -D PPE -D TOC)
  178. endif ()
  179. endif ()
  180. set (DASM_FLAGS ${DASM_XFLAGS} ${DASM_AFLAGS})
  181. set (DASM_DASC ${PROJECT_SOURCE_DIR}/ThirdParty/LuaJIT/src/vm_${DASM_ARCH}.dasc)