diff --git a/CMakeLists.txt b/CMakeLists.txt index 56dea1a34..a15ec5069 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,10 @@ add_subdirectory(lib/expat/) add_subdirectory(lib/luaexpat/) add_subdirectory(lib/md5/) +if (WIN32) + add_subdirectory(lib/luaproxy/) +endif() + # We use EXCLUDE_FROM_ALL so that only the explicit dependencies are used # (PolarSSL also has test and example programs in their CMakeLists.txt, we don't want those) diff --git a/MCServer/lua5.1.dll b/MCServer/lua5.1.dll deleted file mode 100644 index cca0bcb25..000000000 Binary files a/MCServer/lua5.1.dll and /dev/null differ 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..bda84641a --- /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() \ No newline at end of file