From 62789da0bbec3246ba6ea399eedabf89134ea25f Mon Sep 17 00:00:00 2001 From: ziggurat29 <30310677+ziggurat29@users.noreply.github.com> Date: Sat, 23 Feb 2019 08:09:29 -0600 Subject: [PATCH] added MSVC project configuration for host-side tools (#2665) Added MSVC project configuration (@ziggurat29) and support of MinGW (@TerryE) for host-side`luac.cross` tool --- app/include/module.h | 12 + app/lua/lauxlib.c | 7 + app/lua/linit.c | 14 ++ app/lua/lrotable.c | 4 + app/lua/lrotable.h | 10 +- app/lua/luac_cross/lflashimg.c | 4 + app/lua/luac_cross/luac.c | 4 + app/lua/luac_cross/mingw32-Makefile.mak | 72 ++++++ app/lua/luaconf.h | 30 +-- app/uzlib/uzlib.h | 13 +- msvc/.gitignore | 8 + msvc/README.md | 30 +++ msvc/hosttools.sln | 31 +++ msvc/luac-cross/luac-cross.vcxproj | 255 +++++++++++++++++++++ msvc/luac-cross/luac-cross.vcxproj.filters | 237 +++++++++++++++++++ 15 files changed, 714 insertions(+), 17 deletions(-) create mode 100644 app/lua/luac_cross/mingw32-Makefile.mak create mode 100644 msvc/.gitignore create mode 100644 msvc/README.md create mode 100644 msvc/hosttools.sln create mode 100644 msvc/luac-cross/luac-cross.vcxproj create mode 100644 msvc/luac-cross/luac-cross.vcxproj.filters diff --git a/app/include/module.h b/app/include/module.h index a892f213..1af70154 100644 --- a/app/include/module.h +++ b/app/include/module.h @@ -39,7 +39,19 @@ #define MODULE_EXPAND_PASTE_(x,y) MODULE_PASTE_(x,y) #ifdef LUA_CROSS_COMPILER +#ifdef _MSC_VER +//on msvc it is necessary to go through more pre-processor hoops to get the +//section name built; string merging does not happen in the _declspecs. +//NOTE: linker magic is invoked via the magical '$' character. Caveat editor. +#define __TOKIFY(s) .rodata1$##s +#define __TOTOK(s) __TOKIFY(s) +#define __STRINGIFY(x) #x +#define __TOSTRING(x) __STRINGIFY(x) +#define __ROSECNAME(s) __TOSTRING(__TOTOK(s)) +#define LOCK_IN_SECTION(s) __declspec ( allocate( __ROSECNAME(s) ) ) +#else #define LOCK_IN_SECTION(s) __attribute__((used,unused,section(".rodata1." #s))) +#endif #else #define LOCK_IN_SECTION(s) __attribute__((used,unused,section(".lua_" #s))) #endif diff --git a/app/lua/lauxlib.c b/app/lua/lauxlib.c index e7a3a9fa..d6ee1f34 100644 --- a/app/lua/lauxlib.c +++ b/app/lua/lauxlib.c @@ -8,7 +8,14 @@ #include "lua.h" #include C_HEADER_CTYPE +#ifdef __MINGW__ +#include +#else +#ifdef _MSC_VER //msvc #defines errno, which interferes with our #include macro +#undef errno +#endif #include C_HEADER_ERRNO +#endif #include C_HEADER_STDIO #include C_HEADER_STDLIB #include C_HEADER_STRING diff --git a/app/lua/linit.c b/app/lua/linit.c index 9fd50337..3dc07692 100644 --- a/app/lua/linit.c +++ b/app/lua/linit.c @@ -47,6 +47,20 @@ extern const luaR_entry lua_rotable_base[]; #define LUA_LIBS lua_libs_core #endif +#ifdef _MSC_VER +//MSVC requires us to declare these sections before we refer to them +#pragma section(__ROSECNAME(A), read) +#pragma section(__ROSECNAME(zzzzzzzz), read) +#pragma section(__ROSECNAME(libs), read) +#pragma section(__ROSECNAME(rotable), read) + +//These help us to find the beginning and ending of the RO data. NOTE: linker +//magic is used; the section names are lexically sorted, so 'a' and 'z' are +//important to keep the other sections lexically between these two dummy +//variables. Check your mapfile output if you need to fiddle with this stuff. +const LOCK_IN_SECTION(A) int _ro_start = 0; +const LOCK_IN_SECTION(zzzzzzzz) int _ro_end = 0; +#endif static const LOCK_IN_SECTION(libs) luaL_reg LUA_LIBS[] = { {"", luaopen_base}, {LUA_LOADLIBNAME, luaopen_package}, diff --git a/app/lua/lrotable.c b/app/lua/lrotable.c index 99d3e6ef..031c6217 100644 --- a/app/lua/lrotable.c +++ b/app/lua/lrotable.c @@ -9,7 +9,11 @@ #include "lobject.h" #include "lapi.h" +#ifdef _MSC_VER +#define ALIGNED_STRING (__declspec( align( 4 ) ) char*) +#else #define ALIGNED_STRING (__attribute__((aligned(4))) char *) +#endif #define LA_LINES 16 #define LA_SLOTS 4 //#define COLLECT_STATS diff --git a/app/lua/lrotable.h b/app/lua/lrotable.h index 94a79e47..5cc334d8 100644 --- a/app/lua/lrotable.h +++ b/app/lua/lrotable.h @@ -64,13 +64,21 @@ int luaR_isrotable(void *p); */ #if defined(LUA_CROSS_COMPILER) +#if defined(_MSC_VER) +//msvc build uses these dummy vars to locate the beginning and ending addresses of the RO data +extern cons char _ro_start[], _ro_end[]; +#define IN_RODATA_AREA(p) (((const char*)(p)) >= _ro_start && ((const char *)(p)) <= _ro_end) +#else /* one of the POSIX variants */ #if defined(__CYGWIN__) #define _RODATA_END __end__ +#elif defined(__MINGW32__) +#define _RODATA_END end #else #define _RODATA_END _edata #endif extern const char _RODATA_END[]; #define IN_RODATA_AREA(p) (((const char *)(p)) < _RODATA_END) +#endif /* defined(_MSC_VER) */ #else /* xtensa tool chain for ESP target */ @@ -78,7 +86,7 @@ extern const char _irom0_text_start[]; extern const char _irom0_text_end[]; #define IN_RODATA_AREA(p) (((const char *)(p)) >= _irom0_text_start && ((const char *)(p)) <= _irom0_text_end) -#endif +#endif /* defined(LUA_CROSS_COMPILER) */ /* Return 1 if the given pointer is a rotable */ #define luaR_isrotable(p) IN_RODATA_AREA(p) diff --git a/app/lua/luac_cross/lflashimg.c b/app/lua/luac_cross/lflashimg.c index 8a2ae053..0fef0dd8 100644 --- a/app/lua/luac_cross/lflashimg.c +++ b/app/lua/luac_cross/lflashimg.c @@ -112,7 +112,11 @@ static uint *flashAddrTag = flashImage + LUA_MAX_FLASH_SIZE; #define getFlashAddrTag(v) ((flashAddrTag[_TW(v)]&_TB(v)) != 0) #define fatal luac_fatal +#ifdef _MSC_VER +extern void __declspec( noreturn ) luac_fatal( const char* message ); +#else extern void __attribute__((noreturn)) luac_fatal(const char* message); +#endif #ifdef LOCAL_DEBUG #define DBG_PRINT(...) printf(__VA_ARGS__) diff --git a/app/lua/luac_cross/luac.c b/app/lua/luac_cross/luac.c index 88c5bd5f..7853604a 100644 --- a/app/lua/luac_cross/luac.c +++ b/app/lua/luac_cross/luac.c @@ -168,6 +168,7 @@ static TString *corename(lua_State *L, const TString *filename) { const char *fn = getstr(filename)+1; const char *s = strrchr(fn, '/'); + if (!s) s = strrchr(fn, '\\'); s = s ? s + 1 : fn; while (*s == '.') s++; const char *e = strchr(s, '.'); @@ -272,6 +273,9 @@ struct Smain { char** argv; }; +#if defined(_MSC_VER) || defined(__MINGW32__) +typedef unsigned int uint; +#endif extern uint dumpToFlashImage (lua_State* L,const Proto *main, lua_Writer w, void* data, int strip, lu_int32 address, lu_int32 maxSize); diff --git a/app/lua/luac_cross/mingw32-Makefile.mak b/app/lua/luac_cross/mingw32-Makefile.mak new file mode 100644 index 00000000..b3b6b7f6 --- /dev/null +++ b/app/lua/luac_cross/mingw32-Makefile.mak @@ -0,0 +1,72 @@ +# +# This is a minimal Make file designed to be called from within a MinGW Cmd prompt. +# So if the distro ZIP file has been unpacked into C:\nodemcu-firmware then +# +# C:\nodemcu-firmware\app\lua\luac_cross> mingw32-make -f mingw32-makefile.mak +# +# will create the WinX EXE luac.cross.exe within the root C:\nodemcu-firmware folder. +# This make has been stripped down to use the basic non-graphics MinGW32 install and +# standard Windows commands available at the Cmd> prompt. This make is quite separate +# from the normal toolchain build. + +.NOTPARALLEL: + +CCFLAGS:= -I.. -I../../include -I../../libc -I../../uzlib -Wall +LDFLAGS:= -lm -Wl,-Map=mapfile +DEFINES += -DLUA_CROSS_COMPILER -DLUA_OPTIMIZE_MEMORY=2 + +CFLAGS = $(CCFLAGS) $(DEFINES) $(EXTRA_CCFLAGS) $(STD_CFLAGS) $(INCLUDES) + +TARGET = host +CC := gcc + +ifeq ($(FLAVOR),debug) + CCFLAGS += -O0 -g + TARGET_LDFLAGS += -O0 -g + DEFINES += -DLUA_DEBUG_BUILD +else + FLAVOR = release + CCFLAGS += -O2 + TARGET_LDFLAGS += -O2 +endif +# +# C files needed to compile luac.cross +# +LUACSRC := luac.c lflashimg.c liolib.c loslib.c print.c +LUASRC := lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c \ + ldo.c ldump.c lfunc.c lgc.c linit.c llex.c \ + lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c lparser.c \ + lrotable.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c \ + ltm.c lundump.c lvm.c lzio.c +LIBCSRC := c_stdlib.c +UZSRC := uzlib_deflate.c crc32.c +# +# This relies on the files being unique on the vpath +# +SRC := $(LUACSRC) $(LUASRC) $(LIBCSRC) $(UZSRC) + +vpath %.c .:..:../../libc:../../uzlib + +INCS := -I.. -I../.. -I../../libc -I../../uzlib +ODIR := .output\obj +OBJS := $(SRC:%.c=$(ODIR)/%.o) +IMAGE := ../../../luac.cross.exe + +.PHONY: test clean all + +all: $(DEPS) $(IMAGE) + +$(IMAGE) : $(OBJS) + $(CC) $(OBJS) -o $@ $(LDFLAGS) + +test : + @echo CC: $(CC) + @echo SRC: $(SRC) + @echo OBJS: $(OBJS) + +clean : + del /s /q $(ODIR) + +$(ODIR)/%.o: %.c + @mkdir $(ODIR) || echo . + $(CC) $(INCS) $(CFLAGS) -o $@ -c $< diff --git a/app/lua/luaconf.h b/app/lua/luaconf.h index 8f73081c..ca8e4b40 100644 --- a/app/lua/luaconf.h +++ b/app/lua/luaconf.h @@ -39,7 +39,7 @@ #endif -#if defined(LUA_CROSS_COMPILER) +#if defined(LUA_CROSS_COMPILER) && !defined(_MSC_VER) && !defined(__MINGW32__) #define LUA_USE_LINUX #endif @@ -264,7 +264,7 @@ #include #ifdef LUA_CROSS_COMPILER #include -else +#else #include "c_stdio.h" #endif @@ -631,7 +631,11 @@ extern int readline4lua(const char *prompt, char *buffer, int length); #define lua_str2number(s,p) c_strtoll((s), (p), 10) #endif // #if !defined LUA_INTEGRAL_LONGLONG #else +#ifdef _MSC_VER //what's wrong with stdlib strtod? +#define lua_str2number(s,p) strtod((s), (p)) +#else #define lua_str2number(s,p) c_strtod((s), (p)) +#endif #endif // #if defined LUA_NUMBER_INTEGRAL /* @@ -760,18 +764,18 @@ union luai_Cast { double l_d; long l_l; }; { if ((c)->status == 0) (c)->status = -1; } #define luai_jmpbuf int /* dummy variable */ -#elif defined(LUA_USE_ULONGJMP) -/* in Unix, try _longjmp/_setjmp (more efficient) */ -#define LUAI_THROW(L,c) _longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - #else -/* default handling with long jumps */ -#define LUAI_THROW(L,c) longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#if defined(LUA_USE_ULONGJMP) +/* in Unix, try _longjmp/_setjmp (more efficient) */ +#define LONGJMP(a,b) _longjmp(a,b) +#define SETJMP(a) _setjmp(a) +#else +#define LONGJMP(a,b) longjmp(a,b) +#define SETJMP(a) setjmp(a) +#endif +#define LUAI_THROW(L,c) LONGJMP((c)->b, 1) +#define LUAI_TRY(L,c,a) if (SETJMP((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf - #endif @@ -910,4 +914,4 @@ union luai_Cast { double l_d; long l_l; }; #error "Pipes not supported in aggresive optimization mode (LUA_OPTIMIZE_MEMORY=2)" #endif -#endif \ No newline at end of file +#endif diff --git a/app/uzlib/uzlib.h b/app/uzlib/uzlib.h index c89f5852..ae9c99ac 100644 --- a/app/uzlib/uzlib.h +++ b/app/uzlib/uzlib.h @@ -22,17 +22,24 @@ #define uz_malloc os_malloc #define uz_free os_free -#else /* POSIX */ +#else /* Host */ #include #include + extern int dbg_break(void); +#if defined(_MSC_VER) || defined(__MINGW32__) //msvc requires old name for longjmp +#define UZLIB_THROW(v) {dbg_break();longjmp(unwindAddr, (v));} +#define UZLIB_SETJMP(n) setjmp(n) +#else #define UZLIB_THROW(v) {dbg_break();_longjmp(unwindAddr, (v));} -#define UZLIB_SETJMP _setjmp +#define UZLIB_SETJMP(n) _setjmp(n) +#endif + #define uz_malloc malloc #define uz_free free -#endif +#endif /* defined(__XTENSA__) */ extern jmp_buf unwindAddr; diff --git a/msvc/.gitignore b/msvc/.gitignore new file mode 100644 index 00000000..855c76ad --- /dev/null +++ b/msvc/.gitignore @@ -0,0 +1,8 @@ +.vs/ +*/Win32/ +*/x64/ + +*.vcxproj.user + +*.lua +*.img diff --git a/msvc/README.md b/msvc/README.md new file mode 100644 index 00000000..fced341a --- /dev/null +++ b/msvc/README.md @@ -0,0 +1,30 @@ +These are MSVC (Visual Studio 2017) project files for the host-side tools, +namely 'luac.cross' and 'spiffsimg'. Some may find these convenient if they +already have MSVC instead of, say, setting up a Cygwin or MingW build +system. + +To build 'luac.cross', you must first edit app/include/user_config.h to make +some choices about the kind of cross-compiler you are generating. + +In particular, the definition of + LUA_FLASH_STORE +should be enabled if you are creating a cross-compiler for generating images +for the Lua File Storage (LFS). The specific value of this define is not +critical for luac.cross, but it's existence is if you want to be able to +generate appropriate code for LFS. + +Be aware that the codebase, as checked in, has LUA_FLASH_STORE undefined. +Since it is expected that most folks wanting a host-side luac.cross is +for LFS use, you will want to first make sure that is changed to be +defined. + +Secondly, if you are wanting to generate code that is appropriate for an +integer-only build, you should ensure that + LUA_NUMBER_INTEGRAL +is defined. + +After altering those settings, you can build using the hosttools.sln file in +the Visual Studio UI, or directly on the command line. x86 and x64 targets +are provisioned, though there isn't anything to be gained with the 64-bit +build. + diff --git a/msvc/hosttools.sln b/msvc/hosttools.sln new file mode 100644 index 00000000..30f55e26 --- /dev/null +++ b/msvc/hosttools.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.168 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "luac-cross", "luac-cross\luac-cross.vcxproj", "{78A3411A-A18F-41A4-B4A7-D76B273F0E44}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Debug|x64.ActiveCfg = Debug|x64 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Debug|x64.Build.0 = Debug|x64 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Debug|x86.ActiveCfg = Debug|Win32 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Debug|x86.Build.0 = Debug|Win32 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Release|x64.ActiveCfg = Release|x64 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Release|x64.Build.0 = Release|x64 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Release|x86.ActiveCfg = Release|Win32 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FC69D912-B682-4325-8FBC-1A887364B511} + EndGlobalSection +EndGlobal diff --git a/msvc/luac-cross/luac-cross.vcxproj b/msvc/luac-cross/luac-cross.vcxproj new file mode 100644 index 00000000..72333727 --- /dev/null +++ b/msvc/luac-cross/luac-cross.vcxproj @@ -0,0 +1,255 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {78A3411A-A18F-41A4-B4A7-D76B273F0E44} + Win32Proj + luaccross + 7.0 + + + + Application + true + v141_xp + MultiByte + + + Application + false + v141_xp + true + MultiByte + + + Application + true + v141_xp + MultiByte + + + Application + false + v141_xp + true + MultiByte + + + + + + + + + + + + + + + + + + + + + true + $(ProjectDir)$(Platform)\$(Configuration)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + luac.cross + + + true + $(ProjectDir)$(Platform)\$(Configuration)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + luac.cross + + + false + $(ProjectDir)$(Platform)\$(Configuration)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + luac.cross + + + false + $(ProjectDir)$(Platform)\$(Configuration)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + luac.cross + + + + NotUsing + Level3 + Disabled + true + LUA_CROSS_COMPILER;LUA_OPTIMIZE_MEMORY=2;_CRT_SECURE_NO_WARNINGS;_CONSOLE;LUA_DEBUG_BUILD;_DEBUG;WIN32;%(PreprocessorDefinitions) + true + pch.h + MultiThreadedDebug + $(ProjectDir)\..\..\app\lua;$(ProjectDir)\..\..\app\libc;$(ProjectDir)\..\..\app\include;$(ProjectDir)\..\..\app\uzlib + + + Console + true + true + setargv.obj;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + NotUsing + Level3 + Disabled + true + LUA_CROSS_COMPILER;LUA_OPTIMIZE_MEMORY=2;_CRT_SECURE_NO_WARNINGS;_CONSOLE;LUA_DEBUG_BUILD;_DEBUG;WIN32;%(PreprocessorDefinitions) + true + pch.h + MultiThreadedDebug + $(ProjectDir)\..\..\app\lua;$(ProjectDir)\..\..\app\libc;$(ProjectDir)\..\..\app\include;$(ProjectDir)\..\..\app\uzlib + + + Console + true + true + setargv.obj;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + NotUsing + Level3 + MaxSpeed + true + true + true + LUA_CROSS_COMPILER;LUA_OPTIMIZE_MEMORY=2;_CRT_SECURE_NO_WARNINGS;_CONSOLE;NDEBUG;WIN32;%(PreprocessorDefinitions) + true + pch.h + MultiThreaded + $(ProjectDir)\..\..\app\lua;$(ProjectDir)\..\..\app\libc;$(ProjectDir)\..\..\app\include;$(ProjectDir)\..\..\app\uzlib + + + Console + true + true + true + true + setargv.obj;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + NotUsing + Level3 + MaxSpeed + true + true + true + LUA_CROSS_COMPILER;LUA_OPTIMIZE_MEMORY=2;_CRT_SECURE_NO_WARNINGS;_CONSOLE;NDEBUG;WIN32;%(PreprocessorDefinitions) + true + pch.h + MultiThreaded + $(ProjectDir)\..\..\app\lua;$(ProjectDir)\..\..\app\libc;$(ProjectDir)\..\..\app\include;$(ProjectDir)\..\..\app\uzlib + + + Console + true + true + true + true + setargv.obj;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/msvc/luac-cross/luac-cross.vcxproj.filters b/msvc/luac-cross/luac-cross.vcxproj.filters new file mode 100644 index 00000000..20fb18c2 --- /dev/null +++ b/msvc/luac-cross/luac-cross.vcxproj.filters @@ -0,0 +1,237 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4d57c826-be1b-40a4-afb4-e4bd4a62ef06} + + + {4a6a3fe9-6e73-4ac0-a7c8-eb7cff0094cf} + + + {df9c7976-ea6e-497b-aa10-c94220b331ac} + + + {016730a9-1aa4-4f7b-a5cf-3e566e37f2b6} + + + {439d70e8-0091-42d2-919f-7e710de3867c} + + + + + app\uzlib + + + app\uzlib + + + app\lua\luac_cross + + + app\lua\luac_cross + + + app\lua\luac_cross + + + app\lua\luac_cross + + + app\lua\luac_cross + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + + + app\uzlib + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\lua + + + app\include + + + app\include + + + app\include + + + \ No newline at end of file