xmake.lua 7.9 KB

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