From 26b95a90f5f76f8a726ad0954f29781bec8ccc05 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 12 Jun 2015 22:28:38 +0200 Subject: [PATCH] Add Xbox One port. --- doc/install.html | 12 +++++- doc/luajit.html | 2 +- src/lib_io.c | 4 +- src/lib_package.c | 8 ++++ src/lj_arch.h | 7 ++++ src/lj_clib.c | 8 ++++ src/xb1build.bat | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 src/xb1build.bat diff --git a/doc/install.html b/doc/install.html index 008721f0..b5df697b 100644 --- a/doc/install.html +++ b/doc/install.html @@ -124,7 +124,7 @@ operating systems, CPUs and compilers: GCC 4.x ORBIS (PS4) GCC 4.x -MSVC + SDK v7.0
WinSDK v7.0 +MSVC + SDK v7.0
WinSDK v7.0
Durango (Xbox One) ARMv5+
ARM9E+
@@ -516,6 +516,16 @@ the following commands: cd src xedkbuild +

+To cross-compile for Xbox One from a Windows host, +open a "Visual Studio .NET Command Prompt" (64 bit host compiler), +cd to the directory where you've unpacked the sources and run +the following commands: +

+
+cd src
+xb1build
+

Embedding LuaJIT

diff --git a/doc/luajit.html b/doc/luajit.html index 721f636b..8a653e2d 100644 --- a/doc/luajit.html +++ b/doc/luajit.html @@ -166,7 +166,7 @@ LuaJIT is Copyright © 2005-2015 Mike Pall, released under the EmbeddedAndroidiOS - +
PS3PS4PS VitaXbox 360
PS3PS4PS VitaXbox 360Xbox One
diff --git a/src/lib_io.c b/src/lib_io.c index 468d3275..8836d052 100644 --- a/src/lib_io.c +++ b/src/lib_io.c @@ -99,7 +99,7 @@ static int io_file_close(lua_State *L, IOFileUD *iof) int stat = -1; #if LJ_TARGET_POSIX stat = pclose(iof->fp); -#elif LJ_TARGET_WINDOWS +#elif LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE stat = _pclose(iof->fp); #else lua_assert(0); @@ -400,7 +400,7 @@ LJLIB_CF(io_open) LJLIB_CF(io_popen) { -#if LJ_TARGET_POSIX || LJ_TARGET_WINDOWS +#if LJ_TARGET_POSIX || (LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE) const char *fname = strdata(lj_lib_checkstr(L, 1)); GCstr *s = lj_lib_optstr(L, 2); const char *mode = s ? strdata(s) : "r"; diff --git a/src/lib_package.c b/src/lib_package.c index 6b6eb8f6..014cfd9e 100644 --- a/src/lib_package.c +++ b/src/lib_package.c @@ -96,9 +96,17 @@ static void setprogdir(lua_State *L) static void pusherror(lua_State *L) { DWORD error = GetLastError(); +#if LJ_TARGET_XBOXONE + wchar_t wbuffer[128]; + char buffer[128*2]; + if (FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, buffer, sizeof(wbuffer)/sizeof(wchar_t), NULL) && + WideCharToMultiByte(CP_ACP, 0, wbuffer, 128, buffer, 128*2, NULL, NULL)) +#else char buffer[128]; if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, buffer, sizeof(buffer), NULL)) +#endif lua_pushstring(L, buffer); else lua_pushfstring(L, "system error %d\n", error); diff --git a/src/lj_arch.h b/src/lj_arch.h index 96e9a99e..e705a3b2 100644 --- a/src/lj_arch.h +++ b/src/lj_arch.h @@ -120,6 +120,13 @@ #define LJ_TARGET_CONSOLE 1 #endif +#ifdef _DURANGO +#define LJ_TARGET_XBOXONE 1 +#define LJ_TARGET_CONSOLE 1 +#define LJ_TARGET_GC64 1 +#define LoadLibraryA(name) LoadLibraryExA((name), NULL, 0) +#endif + #define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */ #define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */ #define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */ diff --git a/src/lj_clib.c b/src/lj_clib.c index 6bdad67f..74b4b001 100644 --- a/src/lj_clib.c +++ b/src/lj_clib.c @@ -172,9 +172,17 @@ LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, const char *name) { DWORD err = GetLastError(); +#if LJ_TARGET_XBOXONE + wchar_t wbuf[128]; + char buf[128*2]; + if (!FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, + NULL, err, 0, buf, sizeof(wbuf)/sizeof(wchar_t), NULL) || + !WideCharToMultiByte(CP_ACP, 0, wbuf, 128, buf, 128*2, NULL, NULL)) +#else char buf[128]; if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, sizeof(buf), NULL)) +#endif buf[0] = '\0'; lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, buf)); } diff --git a/src/xb1build.bat b/src/xb1build.bat new file mode 100644 index 00000000..847e84a5 --- /dev/null +++ b/src/xb1build.bat @@ -0,0 +1,101 @@ +@rem Script to build LuaJIT with the Xbox One SDK. +@rem Donated to the public domain. +@rem +@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler) +@rem Then cd to this directory and run this script. + +@if not defined INCLUDE goto :FAIL +@if not defined DurangoXDK goto :FAIL + +@setlocal +@echo ---- Host compiler ---- +@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /DLUAJIT_ENABLE_GC64 +@set LJLINK=link /nologo +@set LJMT=mt /nologo +@set DASMDIR=..\dynasm +@set DASM=%DASMDIR%\dynasm.lua +@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c + +%LJCOMPILE% host\minilua.c +@if errorlevel 1 goto :BAD +%LJLINK% /out:minilua.exe minilua.obj +@if errorlevel 1 goto :BAD +if exist minilua.exe.manifest^ + %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe + +@rem Error out for 64 bit host compiler +@minilua +@if not errorlevel 8 goto :FAIL + +@set DASMFLAGS=-D WIN -D FFI -D P64 +minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x64.dasc +@if errorlevel 1 goto :BAD + +%LJCOMPILE% /I "." /I %DASMDIR% /D_DURANGO host\buildvm*.c +@if errorlevel 1 goto :BAD +%LJLINK% /out:buildvm.exe buildvm*.obj +@if errorlevel 1 goto :BAD +if exist buildvm.exe.manifest^ + %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe + +buildvm -m peobj -o lj_vm.obj +@if errorlevel 1 goto :BAD +buildvm -m bcdef -o lj_bcdef.h %ALL_LIB% +@if errorlevel 1 goto :BAD +buildvm -m ffdef -o lj_ffdef.h %ALL_LIB% +@if errorlevel 1 goto :BAD +buildvm -m libdef -o lj_libdef.h %ALL_LIB% +@if errorlevel 1 goto :BAD +buildvm -m recdef -o lj_recdef.h %ALL_LIB% +@if errorlevel 1 goto :BAD +buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB% +@if errorlevel 1 goto :BAD +buildvm -m folddef -o lj_folddef.h lj_opt_fold.c +@if errorlevel 1 goto :BAD + +@echo ---- Cross compiler ---- + +@set CWD=%cd% +@call "%DurangoXDK%\xdk\DurangoVars.cmd" XDK +@cd /D "%CWD%" +@shift + +@set LJCOMPILE="cl" /nologo /c /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /D_LIB /D_UNICODE /D_DURANGO +@set LJLIB="lib" /nologo + +@if "%1"=="debug" ( + @shift + @set LJCOMPILE=%LJCOMPILE% /Zi /MDd /Od + @set LJLINK=%LJLINK% /debug +) else ( + @set LJCOMPILE=%LJCOMPILE% /MD /O2 /DNDEBUG +) + +@if "%1"=="amalg" goto :AMALG +%LJCOMPILE% /DLUA_BUILD_AS_DLL lj_*.c lib_*.c +@if errorlevel 1 goto :BAD +%LJLIB% /OUT:luajit.lib lj_*.obj lib_*.obj +@if errorlevel 1 goto :BAD +@goto :NOAMALG +:AMALG +%LJCOMPILE% /DLUA_BUILD_AS_DLL ljamalg.c +@if errorlevel 1 goto :BAD +%LJLIB% /OUT:luajit.lib ljamalg.obj lj_vm.obj +@if errorlevel 1 goto :BAD +:NOAMALG + +@del *.obj *.manifest minilua.exe buildvm.exe +@echo. +@echo === Successfully built LuaJIT for Xbox One === + +@goto :END +:BAD +@echo. +@echo ******************************************************* +@echo *** Build FAILED -- Please check the error messages *** +@echo ******************************************************* +@goto :END +:FAIL +@echo To run this script you must open a "Visual Studio .NET Command Prompt" +@echo (64 bit host compiler). The Xbox One SDK must be installed, too. +:END
GCCCLANG
LLVM
MSVC