summaryrefslogtreecommitdiffstats
path: root/lib/luaproxy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/luaproxy')
-rw-r--r--lib/luaproxy/CMakeLists.txt58
-rw-r--r--lib/luaproxy/Dummy.c4
-rw-r--r--lib/luaproxy/lua5.1.def115
-rw-r--r--lib/luaproxy/lua5.1.lua140
4 files changed, 317 insertions, 0 deletions
diff --git a/lib/luaproxy/CMakeLists.txt b/lib/luaproxy/CMakeLists.txt
new file mode 100644
index 000000000..f115036e1
--- /dev/null
+++ b/lib/luaproxy/CMakeLists.txt
@@ -0,0 +1,58 @@
+
+# This project adds a Lua Proxy DLL on Windows
+# By an unfortunate choice in the popular LuaBinaries distribution, there are two names for the Lua DLL on Windows: lua51.dll and lua5.1.dll.
+# Some binary Lua packages are built for one, the others for the other. Messy!
+# In order to support both package flavors, we create a "proxy DLL":
+# Basically the lua5.1.dll has its PE Exports section manipulated so that it points each exported function to its lua51.dll implementation.
+# Effectively, this forwards all calls from lua5.1.dll to lua51.dll without any performance costs (the forwarding is done in the Windows PE loader on app start).
+
+# This project creates the proxy DLL by using a specially crafted .DEF file that is used to link the Proxy DLL.
+# Note that it has been tested only on MSVC, it might not work with other compilers.
+# The initial implementation was taken from http://lua-users.org/wiki/LuaProxyDllFour , but adapted to MSVC
+
+
+
+
+if (WIN32)
+
+ if (MSVC)
+ # Tell the linker to use the DEF file to generate the proxy:
+ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NOENTRY /DEF:lua5.1.def /MANIFEST:NO")
+ set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /NOENTRY /DEF:lua5.1.def /MANIFEST:NO")
+ set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /NOENTRY /DEF:lua5.1.def /MANIFEST:NO")
+ set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NOENTRY /DEF:lua5.1.def /MANIFEST:NO")
+ set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NOENTRY /DEF:lua5.1.def /MANIFEST:NO")
+ set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} /NOENTRY /DEF:lua5.1.def /MANIFEST:NO")
+ else()
+ message ("This code has not been tested on your compiler. Please report your success or failure in the forum.")
+ endif()
+
+ add_library(luaproxy SHARED "lua5.1.def" "Dummy.c")
+ set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/MCServer)
+ set_target_properties(luaproxy PROPERTIES
+ OUTPUT_NAME "lua5.1"
+ )
+ target_link_libraries(luaproxy lua)
+
+ # Output the executable into the $/MCServer folder, so that MCServer can find it:
+ set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/MCServer)
+ SET_TARGET_PROPERTIES(luaproxy PROPERTIES
+ ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/MCServer
+ ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/MCServer
+ ARCHIVE_OUTPUT_DIRECTORY_DEBUGPROFILE ${CMAKE_SOURCE_DIR}/MCServer
+ ARCHIVE_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_SOURCE_DIR}/MCServer
+ LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/MCServer
+ LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/MCServer
+ LIBRARY_OUTPUT_DIRECTORY_DEBUGPROFILE ${CMAKE_SOURCE_DIR}/MCServer
+ LIBRARY_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_SOURCE_DIR}/MCServer
+ RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/MCServer
+ RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/MCServer
+ RUNTIME_OUTPUT_DIRECTORY_DEBUGPROFILE ${CMAKE_SOURCE_DIR}/MCServer
+ RUNTIME_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_SOURCE_DIR}/MCServer
+ )
+
+else()
+
+ message (FATAL_ERROR "This project is needed only for Windows, modify your cmake file not to include it on Linux")
+
+endif()
diff --git a/lib/luaproxy/Dummy.c b/lib/luaproxy/Dummy.c
new file mode 100644
index 000000000..4018d8392
--- /dev/null
+++ b/lib/luaproxy/Dummy.c
@@ -0,0 +1,4 @@
+
+// Dummy.c
+
+// Because the MSVC compiler needs at least one C file to compile the project
diff --git a/lib/luaproxy/lua5.1.def b/lib/luaproxy/lua5.1.def
new file mode 100644
index 000000000..42986d22f
--- /dev/null
+++ b/lib/luaproxy/lua5.1.def
@@ -0,0 +1,115 @@
+EXPORTS
+ luaL_addlstring=lua51.luaL_addlstring
+ luaL_addstring=lua51.luaL_addstring
+ luaL_addvalue=lua51.luaL_addvalue
+ luaL_argerror=lua51.luaL_argerror
+ luaL_buffinit=lua51.luaL_buffinit
+ luaL_callmeta=lua51.luaL_callmeta
+ luaL_checkany=lua51.luaL_checkany
+ luaL_checkinteger=lua51.luaL_checkinteger
+ luaL_checklstring=lua51.luaL_checklstring
+ luaL_checknumber=lua51.luaL_checknumber
+ luaL_checkoption=lua51.luaL_checkoption
+ luaL_checkstack=lua51.luaL_checkstack
+ luaL_checktype=lua51.luaL_checktype
+ luaL_checkudata=lua51.luaL_checkudata
+ luaL_error=lua51.luaL_error
+ luaL_findtable=lua51.luaL_findtable
+ luaL_getmetafield=lua51.luaL_getmetafield
+ luaL_gsub=lua51.luaL_gsub
+ luaL_loadbuffer=lua51.luaL_loadbuffer
+ luaL_loadfile=lua51.luaL_loadfile
+ luaL_loadstring=lua51.luaL_loadstring
+ luaL_newmetatable=lua51.luaL_newmetatable
+ luaL_newstate=lua51.luaL_newstate
+ luaL_openlib=lua51.luaL_openlib
+ luaL_openlibs=lua51.luaL_openlibs
+ luaL_optinteger=lua51.luaL_optinteger
+ luaL_optlstring=lua51.luaL_optlstring
+ luaL_optnumber=lua51.luaL_optnumber
+ luaL_prepbuffer=lua51.luaL_prepbuffer
+ luaL_pushresult=lua51.luaL_pushresult
+ luaL_ref=lua51.luaL_ref
+ luaL_register=lua51.luaL_register
+ luaL_typerror=lua51.luaL_typerror
+ luaL_unref=lua51.luaL_unref
+ luaL_where=lua51.luaL_where
+ lua_atpanic=lua51.lua_atpanic
+ lua_call=lua51.lua_call
+ lua_checkstack=lua51.lua_checkstack
+ lua_close=lua51.lua_close
+ lua_concat=lua51.lua_concat
+ lua_cpcall=lua51.lua_cpcall
+ lua_createtable=lua51.lua_createtable
+ lua_dump=lua51.lua_dump
+ lua_equal=lua51.lua_equal
+ lua_error=lua51.lua_error
+ lua_gc=lua51.lua_gc
+ lua_getallocf=lua51.lua_getallocf
+ lua_getfenv=lua51.lua_getfenv
+ lua_getfield=lua51.lua_getfield
+ lua_gethook=lua51.lua_gethook
+ lua_gethookcount=lua51.lua_gethookcount
+ lua_gethookmask=lua51.lua_gethookmask
+ lua_getinfo=lua51.lua_getinfo
+ lua_getlocal=lua51.lua_getlocal
+ lua_getmetatable=lua51.lua_getmetatable
+ lua_getstack=lua51.lua_getstack
+ lua_gettable=lua51.lua_gettable
+ lua_gettop=lua51.lua_gettop
+ lua_getupvalue=lua51.lua_getupvalue
+ lua_insert=lua51.lua_insert
+ lua_iscfunction=lua51.lua_iscfunction
+ lua_isnumber=lua51.lua_isnumber
+ lua_isstring=lua51.lua_isstring
+ lua_isuserdata=lua51.lua_isuserdata
+ lua_lessthan=lua51.lua_lessthan
+ lua_load=lua51.lua_load
+ lua_newstate=lua51.lua_newstate
+ lua_newthread=lua51.lua_newthread
+ lua_newuserdata=lua51.lua_newuserdata
+ lua_next=lua51.lua_next
+ lua_objlen=lua51.lua_objlen
+ lua_pcall=lua51.lua_pcall
+ lua_pushboolean=lua51.lua_pushboolean
+ lua_pushcclosure=lua51.lua_pushcclosure
+ lua_pushfstring=lua51.lua_pushfstring
+ lua_pushinteger=lua51.lua_pushinteger
+ lua_pushlightuserdata=lua51.lua_pushlightuserdata
+ lua_pushlstring=lua51.lua_pushlstring
+ lua_pushnil=lua51.lua_pushnil
+ lua_pushnumber=lua51.lua_pushnumber
+ lua_pushstring=lua51.lua_pushstring
+ lua_pushthread=lua51.lua_pushthread
+ lua_pushvalue=lua51.lua_pushvalue
+ lua_pushvfstring=lua51.lua_pushvfstring
+ lua_rawequal=lua51.lua_rawequal
+ lua_rawget=lua51.lua_rawget
+ lua_rawgeti=lua51.lua_rawgeti
+ lua_rawset=lua51.lua_rawset
+ lua_rawseti=lua51.lua_rawseti
+ lua_remove=lua51.lua_remove
+ lua_replace=lua51.lua_replace
+ lua_resume=lua51.lua_resume
+ lua_setallocf=lua51.lua_setallocf
+ lua_setfenv=lua51.lua_setfenv
+ lua_setfield=lua51.lua_setfield
+ lua_sethook=lua51.lua_sethook
+ lua_setlocal=lua51.lua_setlocal
+ lua_setmetatable=lua51.lua_setmetatable
+ lua_settable=lua51.lua_settable
+ lua_settop=lua51.lua_settop
+ lua_setupvalue=lua51.lua_setupvalue
+ lua_status=lua51.lua_status
+ lua_toboolean=lua51.lua_toboolean
+ lua_tocfunction=lua51.lua_tocfunction
+ lua_tointeger=lua51.lua_tointeger
+ lua_tolstring=lua51.lua_tolstring
+ lua_tonumber=lua51.lua_tonumber
+ lua_topointer=lua51.lua_topointer
+ lua_tothread=lua51.lua_tothread
+ lua_touserdata=lua51.lua_touserdata
+ lua_type=lua51.lua_type
+ lua_typename=lua51.lua_typename
+ lua_xmove=lua51.lua_xmove
+ lua_yield=lua51.lua_yield
diff --git a/lib/luaproxy/lua5.1.lua b/lib/luaproxy/lua5.1.lua
new file mode 100644
index 000000000..b826e12d0
--- /dev/null
+++ b/lib/luaproxy/lua5.1.lua
@@ -0,0 +1,140 @@
+
+-- lua5.1.lua
+-- Generates the lua5.1.def file from the list of Lua symbols below
+
+
+
+
+
+local symbols =
+{
+ "luaL_addlstring",
+ "luaL_addstring",
+ "luaL_addvalue",
+ "luaL_argerror",
+ "luaL_buffinit",
+ "luaL_callmeta",
+ "luaL_checkany",
+ "luaL_checkinteger",
+ "luaL_checklstring",
+ "luaL_checknumber",
+ "luaL_checkoption",
+ "luaL_checkstack",
+ "luaL_checktype",
+ "luaL_checkudata",
+ "luaL_error",
+ "luaL_findtable",
+ "luaL_getmetafield",
+ "luaL_gsub",
+ "luaL_loadbuffer",
+ "luaL_loadfile",
+ "luaL_loadstring",
+ "luaL_newmetatable",
+ "luaL_newstate",
+ "luaL_openlib",
+ "luaL_openlibs",
+ "luaL_optinteger",
+ "luaL_optlstring",
+ "luaL_optnumber",
+ "luaL_prepbuffer",
+ "luaL_pushresult",
+ "luaL_ref",
+ "luaL_register",
+ "luaL_typerror",
+ "luaL_unref",
+ "luaL_where",
+ "lua_atpanic",
+ "lua_call",
+ "lua_checkstack",
+ "lua_close",
+ "lua_concat",
+ "lua_cpcall",
+ "lua_createtable",
+ "lua_dump",
+ "lua_equal",
+ "lua_error",
+ "lua_gc",
+ "lua_getallocf",
+ "lua_getfenv",
+ "lua_getfield",
+ "lua_gethook",
+ "lua_gethookcount",
+ "lua_gethookmask",
+ "lua_getinfo",
+ "lua_getlocal",
+ "lua_getmetatable",
+ "lua_getstack",
+ "lua_gettable",
+ "lua_gettop",
+ "lua_getupvalue",
+ "lua_insert",
+ "lua_iscfunction",
+ "lua_isnumber",
+ "lua_isstring",
+ "lua_isuserdata",
+ "lua_lessthan",
+ "lua_load",
+ "lua_newstate",
+ "lua_newthread",
+ "lua_newuserdata",
+ "lua_next",
+ "lua_objlen",
+ "lua_pcall",
+ "lua_pushboolean",
+ "lua_pushcclosure",
+ "lua_pushfstring",
+ "lua_pushinteger",
+ "lua_pushlightuserdata",
+ "lua_pushlstring",
+ "lua_pushnil",
+ "lua_pushnumber",
+ "lua_pushstring",
+ "lua_pushthread",
+ "lua_pushvalue",
+ "lua_pushvfstring",
+ "lua_rawequal",
+ "lua_rawget",
+ "lua_rawgeti",
+ "lua_rawset",
+ "lua_rawseti",
+ "lua_remove",
+ "lua_replace",
+ "lua_resume",
+ "lua_setallocf",
+ "lua_setfenv",
+ "lua_setfield",
+ "lua_sethook",
+ "lua_setlocal",
+ "lua_setmetatable",
+ "lua_settable",
+ "lua_settop",
+ "lua_setupvalue",
+ "lua_status",
+ "lua_toboolean",
+ "lua_tocfunction",
+ "lua_tointeger",
+ "lua_tolstring",
+ "lua_tonumber",
+ "lua_topointer",
+ "lua_tothread",
+ "lua_touserdata",
+ "lua_type",
+ "lua_typename",
+ "lua_xmove",
+ "lua_yield",
+ -- "luaopen_base",
+ -- "luaopen_debug",
+ -- "luaopen_io",
+ -- "luaopen_math",
+ -- "luaopen_os",
+ -- "luaopen_package",
+ -- "luaopen_string",
+ -- "luaopen_table",
+}
+
+local def = io.open("lua5.1.def", "w")
+def:write("EXPORTS\n")
+for _,symbol in ipairs(symbols) do
+ def:write("\t" .. symbol .. "=lua51." .. symbol .. "\n")
+end
+def:close()