From 67b2a5eef2b815d3ab1f459e7f75374f2deeb59a Mon Sep 17 00:00:00 2001 From: matiasvlevi Date: Mon, 30 Sep 2024 19:48:46 -0400 Subject: [PATCH] wasm build --- .gitignore | 2 + linit.c | 2 + makefile | 204 ++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 143 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index ae2899e0..d5ed783b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ *.so *.o *.a +*.o.wasm +*.a.wasm manual/manual.html diff --git a/linit.c b/linit.c index 69808f84..4658bd8d 100644 --- a/linit.c +++ b/linit.c @@ -44,8 +44,10 @@ static const luaL_Reg loadedlibs[] = { {LUA_LOADLIBNAME, luaopen_package}, {LUA_COLIBNAME, luaopen_coroutine}, {LUA_TABLIBNAME, luaopen_table}, +#ifndef LUA_WASM {LUA_IOLIBNAME, luaopen_io}, {LUA_OSLIBNAME, luaopen_os}, +#endif {LUA_STRLIBNAME, luaopen_string}, {LUA_MATHLIBNAME, luaopen_math}, {LUA_UTF8LIBNAME, luaopen_utf8}, diff --git a/makefile b/makefile index 38e21f1f..085fd008 100644 --- a/makefile +++ b/makefile @@ -2,6 +2,30 @@ # see luaconf.h for further customization # == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= +PLATFORM ?= linux +RM= rm -f + +ifeq ($(PLATFORM), wasm) +# Wasm settings + +# Path to the WASI SDK +WASI_SDK_PATH ?= /opt/wasi-sdk-24 +CC = $(WASI_SDK_PATH)/bin/clang +AR = $(WASI_SDK_PATH)/bin/llvm-ar +AR_OPT=rcs +RANLIB = $(WASI_SDK_PATH)/bin/llvm-ranlib +CFLAGS =\ + -mllvm -wasm-enable-sjlj\ + --target=wasm32-wasi\ + --sysroot=$(WASI_SDK_PATH)/share/wasi-sysroot\ + -I$(WASI_SDK_PATH)/share/wasi-sysroot/include\ + -D_WASI_EMULATED_SIGNAL\ + -D_WASI_EMULATED_PROCESS_CLOCKS\ + -DLUA_USE_C89\ + -DLUA_WASM\ + +else +# Native settings # Warnings valid for both C and C++ CWARNSCPP= \ @@ -13,16 +37,7 @@ CWARNSCPP= \ -Wredundant-decls \ -Wdisabled-optimization \ -Wdouble-promotion \ - -Wmissing-declarations \ - # the next warnings might be useful sometimes, - # but usually they generate too much noise - # -Werror \ - # -pedantic # warns if we use jump tables \ - # -Wconversion \ - # -Wsign-conversion \ - # -Wstrict-overflow=2 \ - # -Wformat=2 \ - # -Wcast-qual \ + -Wmissing-declarations # Warnings for gcc, not valid for clang @@ -39,53 +54,21 @@ CWARNSC= -Wdeclaration-after-statement \ -Wc++-compat \ -Wold-style-definition \ - CWARNS= $(CWARNSCPP) $(CWARNSC) $(CWARNGCC) -# Some useful compiler options for internal tests: -# -DLUAI_ASSERT turns on all assertions inside Lua. -# -DHARDSTACKTESTS forces a reallocation of the stack at every point where -# the stack can be reallocated. -# -DHARDMEMTESTS forces a full collection at all points where the collector -# can run. -# -DEMERGENCYGCTESTS forces an emergency collection at every single allocation. -# -DEXTERNMEMCHECK removes internal consistency checking of blocks being -# deallocated (useful when an external tool like valgrind does the check). -# -DMAXINDEXRK=k limits range of constants in RK instruction operands. -# -DLUA_COMPAT_5_3 - -# -pg -malign-double -# -DLUA_USE_CTYPE -DLUA_USE_APICHECK - -# The following options help detect "undefined behavior"s that seldom -# create problems; some are only available in newer gcc versions. To -# use some of them, we also have to define an environment variable -# ASAN_OPTIONS="detect_invalid_pointer_pairs=2". -# -fsanitize=undefined -# -fsanitize=pointer-subtract -fsanitize=address -fsanitize=pointer-compare -# TESTS= -DLUA_USER_H='"ltests.h"' -O0 -g - - -LOCAL = $(TESTS) $(CWARNS) - - -# enable Linux goodies -MYCFLAGS= $(LOCAL) -std=c99 -DLUA_USE_LINUX -DLUA_USE_READLINE -MYLDFLAGS= $(LOCAL) -Wl,-E +MYCFLAGS= $(CWARNS) -std=c99 -DLUA_USE_LINUX -DLUA_USE_READLINE +MYLDFLAGS= $(CWARNS) -Wl,-E MYLIBS= -ldl -lreadline - CC= gcc CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common -march=native -AR= ar rc +AR= ar +AR_OPT=rc RANLIB= ranlib -RM= rm -f - - +endif # == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= - LIBS = -lm CORE_T= liblua.a @@ -93,54 +76,144 @@ CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \ lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \ ltm.o lundump.o lvm.o lzio.o ltests.o AUX_O= lauxlib.o -LIB_O= lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o \ +LIB_O= lbaselib.o ldblib.o lmathlib.o ltablib.o lstrlib.o \ lutf8lib.o loadlib.o lcorolib.o linit.o -LUA_T= lua -LUA_O= lua.o +ifeq ($(PLATFORM), wasm) +# Append .wasm extention to objects +CORE_O := $(CORE_O:.o=.o.wasm) +AUX_O := $(AUX_O:.o=.o.wasm) +LIB_O := $(LIB_O:.o=.o.wasm) +CORE_T := $(CORE_T:.a=.a.wasm) -ALL_T= $(CORE_T) $(LUA_T) -ALL_O= $(CORE_O) $(LUA_O) $(AUX_O) $(LIB_O) +# implicit rule for .wasm objects +%.o.wasm: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +%.wat: %.o.wasm + wasm2wat --enable-all $^ -o $@ + +else + +# Add os related libs +LIB_O += liolib.o loslib.o + +endif + +ALL_O= $(CORE_O) $(AUX_O) $(LIB_O) +ALL_WAT=$(ALL_O:.o.wasm=.wat) ALL_A= $(CORE_T) -all: $(ALL_T) + +all: $(ALL_A) touch all o: $(ALL_O) + @echo $(ALL_O) a: $(ALL_A) + @echo $(ALL_A) -$(CORE_T): $(CORE_O) $(AUX_O) $(LIB_O) - $(AR) $@ $? +$(CORE_T): $(ALL_O) + $(AR) $(AR_OPT) $@ $? $(RANLIB) $@ -$(LUA_T): $(LUA_O) $(CORE_T) - $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(CORE_T) $(LIBS) $(MYLIBS) $(DL) - - clean: - $(RM) $(ALL_T) $(ALL_O) + $(RM) $(ALL_O) $(ALL_WAT) $(ALL_A) + +ifeq ($(PLATFORM), wasm) + +wat: $(ALL_WAT) + @echo $(ALL_WAT) +depend: + @$(CC) $(CFLAGS) -MM *.c > .d + @sed -e 's/\.o:/.o.wasm:/' .d +else depend: @$(CC) $(CFLAGS) -MM *.c +endif echo: @echo "CC = $(CC)" @echo "CFLAGS = $(CFLAGS)" @echo "AR = $(AR)" + @echo "AR_OPT = $(AR_OPT)" @echo "RANLIB = $(RANLIB)" @echo "RM = $(RM)" - @echo "MYCFLAGS = $(MYCFLAGS)" - @echo "MYLDFLAGS = $(MYLDFLAGS)" - @echo "MYLIBS = $(MYLIBS)" - @echo "DL = $(DL)" $(ALL_O): makefile ltests.h # DO NOT EDIT # automatically made with 'gcc -MM l*.c' - +ifeq ($(PLATFORM), wasm) +lapi.o.wasm: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ + ltable.h lundump.h lvm.h +lauxlib.o.wasm: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h +lbaselib.o.wasm: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lcode.o.wasm: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lgc.h lstring.h ltable.h lvm.h +lcorolib.o.wasm: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lctype.o.wasm: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h +ldblib.o.wasm: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ldebug.o.wasm: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ + ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h +ldo.o.wasm: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ + lparser.h lstring.h ltable.h lundump.h lvm.h +ldump.o.wasm: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lundump.h +lfunc.o.wasm: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h +lgc.o.wasm: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h +linit.o.wasm: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h +liolib.o.wasm: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +llex.o.wasm: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ + lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ + lstring.h ltable.h +lmathlib.o.wasm: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lmem.o.wasm: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h +loadlib.o.wasm: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lobject.o.wasm: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ + ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ + lvm.h +lopcodes.o.wasm: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h +loslib.o.wasm: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lparser.o.wasm: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lfunc.h lstring.h lgc.h ltable.h +lstate.o.wasm: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ + lstring.h ltable.h +lstring.o.wasm: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h +lstrlib.o.wasm: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltable.o.wasm: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +ltablib.o.wasm: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltests.o.wasm: ltests.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lauxlib.h lcode.h llex.h lopcodes.h \ + lparser.h lctype.h ldebug.h ldo.h lfunc.h lopnames.h lstring.h lgc.h \ + ltable.h lualib.h +ltm.o.wasm: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +lua.o.wasm: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lundump.o.wasm: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ + lundump.h +lutf8lib.o.wasm: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lvm.o.wasm: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ + ltable.h lvm.h ljumptab.h +lzio.o.wasm: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ + lobject.h ltm.h lzio.h +else lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ ltable.h lundump.h lvm.h @@ -206,5 +279,6 @@ lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ ltable.h lvm.h ljumptab.h lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ lobject.h ltm.h lzio.h +endif # (end of Makefile)