xmake.lua 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. set_xmakever("2.3.4")
  2. set_policy("build.across_targets_in_parallel", false)
  3. add_rules("mode.debug", "mode.release")
  4. if is_mode("release") then
  5. add_cflags("-fomit-frame-pointer")
  6. add_cflags("-fno-stack-protector")
  7. end
  8. option("nojit")
  9. set_default(false)
  10. set_showmenu(true)
  11. add_defines("LUAJIT_DISABLE_JIT", "LUAJIT_DISABLE_FFI")
  12. option("fpu")
  13. set_default(true)
  14. set_showmenu(true)
  15. add_defines("LJ_ARCH_HASFPU=1", "LJ_ABI_SOFTFP=0")
  16. option("gc64")
  17. set_default(false)
  18. set_showmenu(true)
  19. rule("dasc")
  20. set_extensions(".dasc")
  21. before_build_file(function(target, sourcefile)
  22. local outputdir = target:objectdir()
  23. if not os.isdir(outputdir) then
  24. os.mkdir(outputdir)
  25. end
  26. local argv = {"dynasm/dynasm.lua", "-LN"}
  27. if is_arch("x64", "x86_64", "arm64", "arm64-v8a", "mips64") then
  28. -- 64bits pointer
  29. table.insert(argv, "-D")
  30. table.insert(argv, "P64")
  31. end
  32. if target:opt("fpu") then
  33. table.insert(argv, "-D")
  34. table.insert(argv, "FPU")
  35. table.insert(argv, "-D")
  36. table.insert(argv, "HFABI")
  37. end
  38. -- jit is not supported on ios
  39. if not target:opt("nojit") and not is_plat("iphoneos", "watchos") then
  40. table.insert(argv, "-D")
  41. table.insert(argv, "JIT")
  42. table.insert(argv, "-D")
  43. table.insert(argv, "FFI")
  44. end
  45. if is_plat("windows", "mingw") then
  46. table.insert(argv, "-D")
  47. table.insert(argv, "WIN")
  48. end
  49. table.insert(argv, "-o")
  50. table.insert(argv, path.join(outputdir, "buildvm_arch.h"))
  51. table.insert(argv, sourcefile)
  52. os.vrunv(target:dep("minilua"):targetfile(), argv)
  53. target:add("includedirs", outputdir, {public = true})
  54. end)
  55. rule("buildvm")
  56. before_build_files(function (target, sourcebatch)
  57. local buildvm = target:dep("buildvm")
  58. local outputdir = buildvm:objectdir()
  59. if not os.isdir(outputdir) then
  60. os.mkdir(outputdir)
  61. end
  62. local buildvm_bin = buildvm:targetfile()
  63. local sourcefiles = sourcebatch.sourcefiles
  64. os.vrunv(buildvm_bin, {"-m", "bcdef", "-o", "src/lj_bcdef.h", unpack(sourcefiles)})
  65. os.vrunv(buildvm_bin, {"-m", "ffdef", "-o", "src/lj_ffdef.h", unpack(sourcefiles)})
  66. os.vrunv(buildvm_bin, {"-m", "libdef", "-o", "src/lj_libdef.h", unpack(sourcefiles)})
  67. os.vrunv(buildvm_bin, {"-m", "recdef", "-o", "src/lj_recdef.h", unpack(sourcefiles)})
  68. os.vrunv(buildvm_bin, {"-m", "vmdef", "-o", "src/lj_vmdef.h", unpack(sourcefiles)})
  69. os.vrunv(buildvm_bin, {"-m", "folddef", "-o", "src/lj_folddef.h", "src/lj_opt_fold.c"})
  70. if is_plat("windows", "mingw") then
  71. local lj_vm_obj = path.join(outputdir, "lj_vm.obj")
  72. os.vrunv(buildvm_bin, {"-m", "peobj", "-o", lj_vm_obj})
  73. table.join2(target:objectfiles(), lj_vm_obj)
  74. else
  75. import("core.tool.compiler")
  76. local lj_vm_asm = path.join(outputdir, "lj_vm.S")
  77. local lj_vm_obj = path.join(outputdir, "lj_vm.o")
  78. local march
  79. if is_plat("macosx", "iphoneos", "watchos") then
  80. march = "machasm"
  81. else
  82. march = "elfasm"
  83. end
  84. os.vrunv(buildvm_bin, {"-m", march, "-o", lj_vm_asm})
  85. compiler.compile(lj_vm_asm, lj_vm_obj, {target = target})
  86. table.join2(target:objectfiles(), lj_vm_obj)
  87. end
  88. end)
  89. function set_host_toolchains()
  90. -- only for cross-compliation
  91. if is_plat(os.host()) then
  92. return
  93. end
  94. local arch
  95. if is_arch("arm64", "arm64-v8a", "mips64", "x86_64") then
  96. arch = is_host("windows") and "x64" or "x86_64"
  97. else
  98. arch = is_host("windows") and "x86" or "i386"
  99. end
  100. set_plat(os.host())
  101. set_arch(arch)
  102. end
  103. target("minilua")
  104. set_kind("binary")
  105. set_default(false)
  106. add_files("src/host/minilua.c")
  107. set_host_toolchains()
  108. if is_host("windows") then
  109. add_defines("_CRT_SECURE_NO_DEPRECATE", "_CRT_STDIO_INLINE=__declspec(dllexport)__inline")
  110. end
  111. target("buildvm")
  112. set_kind("binary")
  113. set_default(false)
  114. add_deps("minilua")
  115. add_rules("dasc")
  116. add_options("nojit", "fpu")
  117. add_includedirs("src")
  118. set_host_toolchains()
  119. add_files("src/host/buildvm*.c")
  120. add_defines("LUAJIT_ENABLE_LUA52COMPAT", {public = true})
  121. if is_host("windows") then
  122. add_defines("_CRT_SECURE_NO_DEPRECATE", "_CRT_STDIO_INLINE=__declspec(dllexport)__inline")
  123. end
  124. if is_arch("x86", "i386") then
  125. add_files("src/vm_x86.dasc")
  126. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_X86", {public = true})
  127. elseif is_arch("x64", "x86_64") then
  128. if has_config("gc64") then
  129. add_defines("LUAJIT_ENABLE_GC64", {public = true})
  130. add_files("src/vm_x64.dasc")
  131. else
  132. -- @see https://github.com/xmake-io/xmake-repo/issues/1264
  133. add_files("src/vm_x86.dasc")
  134. end
  135. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_X64", {public = true})
  136. elseif is_arch("arm64", "arm64-v8a") then
  137. add_files("src/vm_arm64.dasc")
  138. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_ARM64", {public = true})
  139. elseif is_arch("arm.*") then
  140. add_files("src/vm_arm.dasc")
  141. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_ARM", {public = true})
  142. elseif is_arch("mips64") then
  143. add_files("src/vm_mips64.dasc")
  144. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_MIPS64", {public = true})
  145. elseif is_arch("mips") then
  146. add_files("src/vm_mips.dasc")
  147. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_MIPS", {public = true})
  148. elseif is_arch("ppc") then
  149. add_files("src/vm_ppc.dasc")
  150. add_defines("LUAJIT_TARGET=LUAJIT_ARCH_PPC", {public = true})
  151. end
  152. if is_plat("macosx", "iphoneos", "watchos") then
  153. add_defines("LUAJIT_OS=LUAJIT_OS_OSX", {public = true})
  154. elseif is_plat("windows") then
  155. add_defines("LUAJIT_OS=LUAJIT_OS_WINDOWS", {public = true})
  156. elseif is_plat("linux", "android") then
  157. add_defines("LUAJIT_OS=LUAJIT_OS_LINUX", {public = true})
  158. elseif is_plat("bsd") then
  159. add_defines("LUAJIT_OS=LUAJIT_OS_BSD", {public = true})
  160. else
  161. add_defines("LUAJIT_OS=LUAJIT_OS_OTHER", {public = true})
  162. end
  163. before_build("@windows", "@msys", "@cygwin", function (target)
  164. if not is_arch("x86", "x64", "mips", "mips64") then
  165. -- @note we need fix `illegal zero-sized array` errors for msvc
  166. io.gsub("src/lj_jit.h", " LJ_K32__MAX\n", " LJ_K32__MAX=1\n")
  167. io.gsub("src/lj_jit.h", " LJ_K64__MAX,\n", " LJ_K64__MAX=1\n")
  168. end
  169. end)
  170. target("luajit")
  171. set_kind("$(kind)")
  172. add_deps("buildvm")
  173. add_options("nojit", "fpu")
  174. if is_mode("debug") then
  175. add_defines("LUA_USE_ASSERT")
  176. end
  177. if is_kind("shared") and is_plat("windows") then
  178. add_defines("LUA_BUILD_AS_DLL")
  179. end
  180. add_defines("LUAJIT_ENABLE_LUA52COMPAT", {public = true})
  181. add_defines("_FILE_OFFSET_BITS=64", "LARGEFILE_SOURCE", {public = true})
  182. add_undefines("_FORTIFY_SOURCE", {public = true})
  183. add_headerfiles("src/*.h", {prefixdir = "luajit"})
  184. add_headerfiles("src/lua.hpp", {prefixdir = "luajit"})
  185. add_files("src/ljamalg.c")
  186. add_files("src/lib_base.c",
  187. "src/lib_math.c",
  188. "src/lib_bit.c",
  189. "src/lib_string.c",
  190. "src/lib_table.c",
  191. "src/lib_io.c",
  192. "src/lib_os.c",
  193. "src/lib_package.c",
  194. "src/lib_debug.c",
  195. "src/lib_jit.c",
  196. "src/lib_ffi.c",
  197. "src/lib_buffer.c", {rules = {"buildvm", override = true}})
  198. target("luajit_bin")
  199. set_kind("binary")
  200. add_deps("luajit")
  201. set_basename("luajit")
  202. add_files("src/luajit.c")
  203. add_options("nojit", "fpu")
  204. if is_plat("windows") then
  205. add_syslinks("advapi32", "shell32")
  206. if is_arch("x86") then
  207. add_ldflags("/subsystem:console,5.01")
  208. else
  209. add_ldflags("/subsystem:console,5.02")
  210. end
  211. elseif is_plat("android") then
  212. add_syslinks("m", "c")
  213. elseif is_plat("macosx") then
  214. add_ldflags("-all_load", "-pagezero_size 10000", "-image_base 100000000")
  215. elseif is_plat("mingw") then
  216. add_ldflags("-static-libgcc", {force = true})
  217. else
  218. add_syslinks("pthread", "dl", "m", "c")
  219. end