[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: More about packaging
- From: Diego Nehab <diego@...>
- Date: Fri, 4 Jun 2004 04:58:35 -0400 (EDT)
I am in the process of defining how LuaSocket is to be packaged.
I read the wiki entries on the subject and felt there were some gaps.
Since I am not an authority, I decided to bother you people and see if
we can reach a consensus. My three concerns are:
- namespace independency
- library-name and entrypoint-name OS dependencies
- transparent static and dynamic options
For the namespace independency, what I am doing is to return the
namespace created by the library, instead of setting it to some global.
You never know if the user will feel offended if you polutes his
globals. The require function returns whatever the chunk it loads
returned, so user code can look like this:
local socket = require("socket")
local http = require("http")
local url = require("url")
I kind of like the idea, and I don't remember if that was the obvious
way or not (probably was, otherwise why would the Lua team have require
return a the value?).
For the library-name and entrypoint name OS independence, I am using two
environment variables, and a modified loadlib function:
local _loadlib = loadlib
LUA_LIBNAME = LUA_LIBNAME or os.getenv("LUA_LIBNAME") or "?"
LUA_FUNCNAME = LUA_FUNCNAME or os.getenv("LUA_FUNCNAME") or "?"
function loadlib(a, b)
if a then a = string.gsub(LUA_LIBNAME, "%?", a) end
if b then b = string.gsub(LUA_FUNCNAME, "%?", b) end
return _loadlib(a, b)
That way, the instalation can set these variables and loadlib will work
the same way on windows, mac os and linux at least. On mac, I use
LUA_FUNCNAME="?" -- used to be "_?"
on Windows, I use
And in the smtp module, for instancce, which needs some C code, I run
local open = assert(loadlib("smtp", "luaopen_smtp"))
local smtp = assert(open())
which works fine on both systems. The luaopen_smtp leaves the namespace
table on the stack, so that the Lua code can receive it.
My question is: what if the user wants to link these things statically?
Both the smtp C part and the smtp Lua part? It would be cool to have
code that is independent of that.