load("@rules_cc//cc:cc_binary.bzl", "cc_binary") load("@rules_cc//cc:cc_library.bzl", "cc_library") LJLIB_SRCS = [ "src/lib_base.c", "src/lib_math.c", "src/lib_bit.c", "src/lib_string.c", "src/lib_table.c", "src/lib_io.c", "src/lib_os.c", "src/lib_package.c", "src/lib_debug.c", "src/lib_jit.c", "src/lib_ffi.c", ] LJCORE_SRCS = [ "src/lj_gc.c", "src/lj_err.c", "src/lj_char.c", "src/lj_bc.c", "src/lj_obj.c", "src/lj_str.c", "src/lj_tab.c", "src/lj_func.c", "src/lj_udata.c", "src/lj_meta.c", "src/lj_debug.c", "src/lj_state.c", "src/lj_dispatch.c", "src/lj_vmevent.c", "src/lj_vmmath.c", "src/lj_strscan.c", "src/lj_api.c", "src/lj_lex.c", "src/lj_parse.c", "src/lj_bcread.c", "src/lj_bcwrite.c", "src/lj_load.c", "src/lj_ir.c", "src/lj_opt_mem.c", "src/lj_opt_fold.c", "src/lj_opt_narrow.c", "src/lj_opt_dce.c", "src/lj_opt_loop.c", "src/lj_opt_split.c", "src/lj_opt_sink.c", "src/lj_mcode.c", "src/lj_snap.c", "src/lj_record.c", "src/lj_crecord.c", "src/lj_ffrecord.c", "src/lj_asm.c", "src/lj_trace.c", "src/lj_gdbjit.c", "src/lj_ctype.c", "src/lj_cdata.c", "src/lj_cconv.c", "src/lj_ccall.c", "src/lj_ccallback.c", "src/lj_carith.c", "src/lj_clib.c", "src/lj_cparse.c", "src/lj_lib.c", "src/lj_alloc.c", "src/lib_aux.c", ] + LJLIB_SRCS + [ "src/lib_init.c", ] cc_binary( name = "minilua", srcs = ["src/host/minilua.c"], copts = ["-w"], linkopts = select({ "@platforms//os:windows": [], "//conditions:default": ["-lm"], }), ) # DynASM flags per architecture, derived from lj_arch.h and the Makefile. # 2.0.5 has no arm64, no GC64, no mips64. x86_64 always uses vm_x86.dasc. # 2.0.5 does not use ENDIAN_LE/BE flags (only added in 2.1). # x86 32-bit gets -D SSE when SSE2 is available (assumed true for modern CPUs). genrule( name = "buildvm_arch_h", srcs = [ "src/lj_arch.h", "src/lua.h", "src/luaconf.h", ] + select({ "@platforms//cpu:armv7": ["src/vm_arm.dasc"], "@platforms//cpu:ppc": ["src/vm_ppc.dasc"], "@platforms//cpu:x86_64": ["src/vm_x86.dasc"], "//conditions:default": ["src/vm_x86.dasc"], }) + glob(["dynasm/*.lua"]), outs = ["src/host/buildvm_arch.h"], cmd = "$(execpath :minilua) $(execpath dynasm/dynasm.lua) " + select({ "@platforms//cpu:armv7": "-D JIT -D FFI -D DUALNUM -D FPU -D HFABI -D VER=70", "@platforms//cpu:ppc": "-D JIT -D FFI -D DUALNUM -D FPU -D HFABI", "@platforms//cpu:x86_64": "-D P64 -D JIT -D FFI -D FPU -D HFABI", "//conditions:default": "-D JIT -D FFI -D FPU -D HFABI -D SSE", }) + select({ "@platforms//os:windows": " -D WIN", "//conditions:default": "", }) + " -o $@ " + select({ "@platforms//cpu:armv7": "$(execpath src/vm_arm.dasc)", "@platforms//cpu:ppc": "$(execpath src/vm_ppc.dasc)", "@platforms//cpu:x86_64": "$(execpath src/vm_x86.dasc)", "//conditions:default": "$(execpath src/vm_x86.dasc)", }), cmd_bat = "$(execpath :minilua) $(execpath dynasm/dynasm.lua) -D P64 -D JIT -D FFI -D FPU -D HFABI -D WIN -o $@ $(execpath src/vm_x86.dasc)", tools = [":minilua"], ) cc_binary( name = "buildvm", srcs = [ "dynasm/dasm_proto.h", "src/host/buildvm.c", "src/host/buildvm.h", "src/host/buildvm_asm.c", "src/host/buildvm_fold.c", "src/host/buildvm_lib.c", "src/host/buildvm_peobj.c", "src/lj_arch.h", "src/lj_bc.h", "src/lj_ccall.h", "src/lj_ctype.h", "src/lj_def.h", "src/lj_dispatch.h", "src/lj_frame.h", "src/lj_gc.h", "src/lj_ir.h", "src/lj_ircall.h", "src/lj_jit.h", "src/lj_lib.h", "src/lj_obj.h", "src/lj_traceerr.h", "src/lua.h", "src/luaconf.h", "src/luajit.h", ":src/host/buildvm_arch.h", ] + select({ "@platforms//cpu:armv7": ["dynasm/dasm_arm.h"], "@platforms//cpu:ppc": ["dynasm/dasm_ppc.h"], "@platforms//cpu:x86_64": ["dynasm/dasm_x86.h"], "//conditions:default": ["dynasm/dasm_x86.h"], }), copts = [ "-fomit-frame-pointer", "-w", ], includes = [ "dynasm", "src", "src/host", ], ) genrule( name = "lj_vm_s", srcs = [], outs = ["src/lj_vm.S"], cmd = select({ "@platforms//os:ios": "$(execpath :buildvm) -m machasm -o $@", "@platforms//os:macos": "$(execpath :buildvm) -m machasm -o $@", "//conditions:default": "$(execpath :buildvm) -m elfasm -o $@", }), tools = [":buildvm"], ) # On Windows, buildvm -m peobj emits a raw COFF object, not assembly text. genrule( name = "lj_vm_obj", srcs = [], outs = ["src/lj_vm.obj"], cmd = "$(execpath :buildvm) -m peobj -o $@", cmd_bat = "$(execpath :buildvm) -m peobj -o $@", target_compatible_with = ["@platforms//os:windows"], tools = [":buildvm"], ) genrule( name = "lj_bcdef_h", srcs = LJLIB_SRCS, outs = ["src/lj_bcdef.h"], cmd = "$(execpath :buildvm) -m bcdef -o $@ $(SRCS)", cmd_bat = "$(execpath :buildvm) -m bcdef -o $@ $(SRCS)", tools = [":buildvm"], ) genrule( name = "lj_ffdef_h", srcs = LJLIB_SRCS, outs = ["src/lj_ffdef.h"], cmd = "$(execpath :buildvm) -m ffdef -o $@ $(SRCS)", cmd_bat = "$(execpath :buildvm) -m ffdef -o $@ $(SRCS)", tools = [":buildvm"], ) genrule( name = "lj_libdef_h", srcs = LJLIB_SRCS, outs = ["src/lj_libdef.h"], cmd = "$(execpath :buildvm) -m libdef -o $@ $(SRCS)", cmd_bat = "$(execpath :buildvm) -m libdef -o $@ $(SRCS)", tools = [":buildvm"], ) genrule( name = "lj_recdef_h", srcs = LJLIB_SRCS, outs = ["src/lj_recdef.h"], cmd = "$(execpath :buildvm) -m recdef -o $@ $(SRCS)", cmd_bat = "$(execpath :buildvm) -m recdef -o $@ $(SRCS)", tools = [":buildvm"], ) genrule( name = "lj_folddef_h", srcs = ["src/lj_opt_fold.c"], outs = ["src/lj_folddef.h"], cmd = "$(execpath :buildvm) -m folddef -o $@ $(execpath src/lj_opt_fold.c)", cmd_bat = "$(execpath :buildvm) -m folddef -o $@ $(execpath src/lj_opt_fold.c)", tools = [":buildvm"], ) genrule( name = "jit_vmdef_lua", srcs = LJLIB_SRCS, outs = ["src/jit/vmdef.lua"], cmd = "$(execpath :buildvm) -m vmdef -o $@ $(SRCS)", cmd_bat = "$(execpath :buildvm) -m vmdef -o $@ $(SRCS)", tools = [":buildvm"], ) cc_library( name = "luajit", srcs = LJCORE_SRCS + select({ "@platforms//os:windows": [":lj_vm_obj"], "//conditions:default": [":lj_vm_s"], }), hdrs = [ "src/lauxlib.h", "src/lj_alloc.h", "src/lj_arch.h", "src/lj_asm.h", "src/lj_asm_arm.h", "src/lj_asm_mips.h", "src/lj_asm_ppc.h", "src/lj_asm_x86.h", "src/lj_bc.h", "src/lj_bcdump.h", "src/lj_carith.h", "src/lj_ccall.h", "src/lj_ccallback.h", "src/lj_cconv.h", "src/lj_cdata.h", "src/lj_char.h", "src/lj_clib.h", "src/lj_cparse.h", "src/lj_crecord.h", "src/lj_ctype.h", "src/lj_debug.h", "src/lj_def.h", "src/lj_dispatch.h", "src/lj_emit_arm.h", "src/lj_emit_mips.h", "src/lj_emit_ppc.h", "src/lj_emit_x86.h", "src/lj_err.h", "src/lj_errmsg.h", "src/lj_ff.h", "src/lj_ffrecord.h", "src/lj_frame.h", "src/lj_func.h", "src/lj_gc.h", "src/lj_gdbjit.h", "src/lj_ir.h", "src/lj_ircall.h", "src/lj_iropt.h", "src/lj_jit.h", "src/lj_lex.h", "src/lj_lib.h", "src/lj_mcode.h", "src/lj_meta.h", "src/lj_obj.h", "src/lj_parse.h", "src/lj_record.h", "src/lj_snap.h", "src/lj_state.h", "src/lj_str.h", "src/lj_strscan.h", "src/lj_tab.h", "src/lj_target.h", "src/lj_target_arm.h", "src/lj_target_mips.h", "src/lj_target_ppc.h", "src/lj_target_x86.h", "src/lj_trace.h", "src/lj_traceerr.h", "src/lj_udata.h", "src/lj_vm.h", "src/lj_vmevent.h", "src/lua.h", "src/lua.hpp", "src/luaconf.h", "src/luajit.h", "src/lualib.h", ":lj_bcdef_h", ":lj_ffdef_h", ":lj_folddef_h", ":lj_libdef_h", ":lj_recdef_h", ], copts = [ "-fomit-frame-pointer", "-w", "-U_FORTIFY_SOURCE", ] + select({ "@platforms//cpu:x86_32": [ "-march=i686", "-msse", "-msse2", "-mfpmath=sse", ], "@platforms//cpu:x86_64": [], "//conditions:default": [], }) + select({ "@platforms//os:windows": [], "//conditions:default": ["-fno-stack-protector"], }), includes = ["src"], linkopts = select({ "@platforms//os:linux": [ "-ldl", "-lm", "-Wl,-E", ], "@platforms//os:macos": ["-lm"], "//conditions:default": ["-lm"], }), local_defines = [ "LUA_CORE", "_FILE_OFFSET_BITS=64", "_LARGEFILE_SOURCE", ] + select({ "@platforms//os:linux": ["LUAJIT_OS=LUAJIT_OS_LINUX"], "@platforms//os:macos": ["LUAJIT_OS=LUAJIT_OS_OSX"], "@platforms//os:windows": ["LUAJIT_OS=LUAJIT_OS_WINDOWS"], "//conditions:default": [], }), visibility = ["//visibility:public"], ) cc_binary( name = "bin/luajit", srcs = ["src/luajit.c"], copts = ["-w"], defines = select({ "@platforms//os:linux": ["LUAJIT_OS=LUAJIT_OS_LINUX"], "@platforms//os:macos": ["LUAJIT_OS=LUAJIT_OS_OSX"], "@platforms//os:windows": ["LUAJIT_OS=LUAJIT_OS_WINDOWS"], "//conditions:default": [], }), includes = ["src"], linkopts = select({ "@platforms//os:linux": ["-Wl,-E"], "//conditions:default": [], }), visibility = ["//visibility:public"], deps = [":luajit"], )