DetectTargetArchitecture.cmake 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # Macro for finding a substring
  2. macro (find_string find_regex input_string output_string)
  3. if (NOT DEFINED ${output_string}${ARGN})
  4. message (STATUS "Finding value for LuaJIT:${output_string}${ARGN}")
  5. string (REGEX MATCH ${find_regex} matched ${input_string})
  6. if (matched)
  7. string (REGEX MATCH "\\(.*\\)" captured ${find_regex})
  8. if (captured)
  9. string (REGEX REPLACE ${find_regex} \\1 matched ${matched})
  10. endif ()
  11. set (${output_string}${ARGN} ${matched} CACHE INTERNAL "LUAJIT INTERNAL - ${output_string}${ARGN}")
  12. message (STATUS "Finding value for LuaJIT:${output_string}${ARGN} - found (${matched})")
  13. else ()
  14. set (${output_string}${ARGN} 0 CACHE INTERNAL "LUAJIT INTERNAL - ${output_string}${ARGN}")
  15. endif ()
  16. endif ()
  17. if (${ARGC} EQUAL 4)
  18. list (GET ${output_string}${ARGN} 0 ${output_string})
  19. endif ()
  20. endmacro ()
  21. # Makefile: Architecture detection
  22. find_string ("LJ_TARGET_(X64|X86|ARM|PPC|PPCSPE|MIPS) 1" "${TARGET_TESTARCH}" TARGET_LJARCH ${VARIANT})
  23. if (TARGET_LJARCH)
  24. string (TOLOWER ${TARGET_LJARCH} TARGET_LJARCH)
  25. set (TARGET_LJARCH${VARIANT} ${TARGET_LJARCH} CACHE INTERNAL "LUAJIT INTERNAL - TARGET_LJARCH${VARIANT}")
  26. else ()
  27. message (FATAL_ERROR "Unsupported target architecture")
  28. endif ()
  29. if (TARGET_LJARCH STREQUAL mips)
  30. find_string ("MIPSEL (1)" "${TARGET_TESTARCH}" MIPSEL ${VARIANT})
  31. if (MIPSEL)
  32. set (TARGET_ARCH ${TARGET_ARCH} -D__MIPSEL__=1)
  33. endif ()
  34. endif ()
  35. find_string ("LJ_TARGET_PS3 (1)" "${TARGET_TESTARCH}" PS3 ${VARIANT})
  36. if (PS3)
  37. set (TARGET_SYS PS3)
  38. set (TARGET_ARCH ${TARGET_ARCH} -D__CELLOS_LV2__)
  39. add_definitions (-DLUAJIT_USE_SYSMALLOC)
  40. endif ()
  41. find_string ("LJ_NO_UNWIND (1)" "${TARGET_TESTARCH}" NO_UNWIND ${VARIANT})
  42. if (NO_UNWIND)
  43. set (TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_NO_UNWIND)
  44. endif ()
  45. set (TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_TARGET=LUAJIT_ARCH_${TARGET_LJARCH})
  46. # Makefile: System detection
  47. if (WIN32)
  48. set (HOST_SYS Windows)
  49. else ()
  50. execute_process (COMMAND uname -s OUTPUT_VARIABLE HOST_SYS ERROR_QUIET)
  51. endif ()
  52. if (CMAKE_CROSSCOMPILING OR IOS)
  53. if (IOS)
  54. set (TARGET_SYS iOS)
  55. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OSX)
  56. else ()
  57. if (NOT TARGET_SYS)
  58. set (TARGET_SYS ${CMAKE_SYSTEM_NAME})
  59. endif ()
  60. if (TARGET_SYS STREQUAL Windows)
  61. set (HOST_XCFLAGS ${HOST_XCFLAGS} -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS)
  62. elseif (TARGET_SYS STREQUAL Linux)
  63. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_LINUX)
  64. elseif (TARGET_SYS STREQUAL Darwin)
  65. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OSX)
  66. else ()
  67. set (HOST_XCFLAGS ${HOST_XCFLAGS} -DLUAJIT_OS=LUAJIT_OS_OTHER)
  68. endif ()
  69. endif ()
  70. else ()
  71. # Not cross compiling
  72. set (TARGET_SYS ${HOST_SYS})
  73. endif ()
  74. # Makefile: Files and pathnames
  75. set (DASM_DIR ${PROJECT_SOURCE_DIR}/ThirdParty/LuaJIT/dynasm)
  76. set (DASM_ARCH ${TARGET_LJARCH})
  77. # Below regex is a workaround for "LJ_ARCH_BITS (.*?)\\n" as CMake does not understand non-greedy quantifier
  78. find_string ("LJ_ARCH_BITS ([^\\n]*)" "${TARGET_TESTARCH}" ARCH_BITS ${VARIANT})
  79. if (ARCH_BITS EQUAL 64)
  80. set (DASM_AFLAGS ${DASM_AFLAGS} -D P64)
  81. endif ()
  82. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ARCH_BITS}")
  83. find_string ("LJ_HASJIT (1)" "${TARGET_TESTARCH}" HASJIT ${VARIANT})
  84. if (HASJIT)
  85. set (DASM_AFLAGS ${DASM_AFLAGS} -D JIT)
  86. endif ()
  87. find_string ("LJ_HASFFI (1)" "${TARGET_TESTARCH}" HASFFI ${VARIANT})
  88. if (HASFFI)
  89. set (DASM_AFLAGS ${DASM_AFLAGS} -D FFI)
  90. endif ()
  91. find_string ("LJ_DUALNUM (1)" "${TARGET_TESTARCH}" DUALNUM ${VARIANT})
  92. if (DUALNUM)
  93. set (DASM_AFLAGS ${DASM_AFLAGS} -D DUALNUM)
  94. endif ()
  95. find_string ("LJ_ARCH_HASFPU (1)" "${TARGET_TESTARCH}" ARCH_HASFPU ${VARIANT})
  96. if (ARCH_HASFPU)
  97. set (DASM_AFLAGS ${DASM_AFLAGS} -D FPU)
  98. endif ()
  99. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_HASFPU=${ARCH_HASFPU})
  100. find_string ("LJ_ABI_SOFTFP (1)" "${TARGET_TESTARCH}" ABI_SOFTFP ${VARIANT})
  101. if (NOT ABI_SOFTFP)
  102. set (DASM_AFLAGS ${DASM_AFLAGS} -D HFABI)
  103. endif ()
  104. set (TARGET_ARCH ${TARGET_ARCH} -DLJ_ABI_SOFTFP=${ABI_SOFTFP})
  105. # Below regex is a workaround for "LJ_ARCH_VERSION (.*?)\\n" as CMake does not understand non-greedy quantifier
  106. find_string ("LJ_ARCH_VERSION ([^\\n]*)" "${TARGET_TESTARCH}" ARCH_VERSION ${VARIANT})
  107. if (ARCH_VERSION)
  108. set (DASM_AFLAGS ${DASM_AFLAGS} -D VER=${ARCH_VERSION})
  109. else ()
  110. set (DASM_AFLAGS ${DASM_AFLAGS} -D VER=)
  111. endif ()
  112. if (TARGET_SYS STREQUAL Windows)
  113. set (DASM_AFLAGS ${DASM_AFLAGS} -D WIN)
  114. endif ()
  115. if (TARGET_LJARCH STREQUAL x86)
  116. find_string ("__SSE2__ (1)" "${TARGET_TESTARCH}" SSE2 ${VARIANT})
  117. if (SSE2)
  118. set (DASM_AFLAGS ${DASM_AFLAGS} -D SSE)
  119. endif ()
  120. elseif (TARGET_LJARCH STREQUAL x64)
  121. set (DASM_ARCH x86)
  122. elseif (TARGET_LJARCH STREQUAL arm)
  123. if (TARGET_SYS STREQUAL iOS)
  124. set (DASM_AFLAGS ${DASM_AFLAGS} -D IOS)
  125. endif ()
  126. elseif (TARGET_LJARCH STREQUAL ppc)
  127. find_string("LJ_ARCH_SQRT (1)" "${TARGET_TESTARCH}" ARCH_SQRT ${VARIANT})
  128. if (ARCH_SQRT)
  129. set (DASM_AFLAGS ${DASM_AFLAGS} -D SQRT)
  130. endif ()
  131. find_string("LJ_ARCH_ROUND (1)" "${TARGET_TESTARCH}" ARCH_ROUND ${VARIANT})
  132. if (ARCH_ROUND)
  133. set (DASM_AFLAGS ${DASM_AFLAGS} -D ROUND)
  134. endif ()
  135. find_string("LJ_ARCH_PPC64 (1)" "${TARGET_TESTARCH}" ARCH_PPC64 ${VARIANT})
  136. if (ARCH_PPC64)
  137. set (DASM_AFLAGS ${DASM_AFLAGS} -D GPR64)
  138. endif ()
  139. if (TARGET_SYS STREQUAL PS3)
  140. set (DASM_AFLAGS ${DASM_AFLAGS} -D PPE -D TOC)
  141. endif ()
  142. endif ()
  143. set (DASM_FLAGS ${DASM_XFLAGS} ${DASM_AFLAGS})
  144. set (DASM_DASC ${PROJECT_SOURCE_DIR}/ThirdParty/LuaJIT/src/vm_${DASM_ARCH}.dasc)