lua-users home
lua-l archive

An update on the LEM Project

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


 A few weeks have gone by since I announced the project, which has some
mild support. I've been working on it since then, and I have made some
progress, or at the very least, gained some new information.
 First off, I wrote the following modules [1]:
	org.conman.zip
	org.conman.zip.read
	org.conman.zip.write
 Those, with the addition of lzlib (and possibly with something like LFS or
org.conman.fsys) means we can read and write about 95% of all ZIP files. 
There is some stuff I don't support (encryption, any of the documented file
extra data, or the 64-bit extensions) but for now, what I have works.
 Now, the modules listed are low level routines, where knowledge of the ZIP
file format is required, but they're all written in straight Lua, with no
other dependencies since these modules don't bother with the
deflating/inflating or even reading/writing data. Nope, these modules just
deal with the ZIP file format.
 I also wrote a lem module [4], which allows you to specify a LEM file and
it will load modules out of said file (or files---you can add multiple LEM
files). There are, however, still some issues.
 First off, a sample LEM file:
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.base64
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.crc
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 5.1 MODULES/org.conman.env
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 5.1 MODULES/org.conman.errno
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.fsys
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.hash
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 1.1 MODULES/org.conman.iconv
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 5.1 MODULES/org.conman.math
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.net
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.pollset
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.process
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.strcore
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 1.0.0 MODULES/org.conman.sys
SunOS sparcv9 LGPL3+ Lua 5.1 5.1 5.1 MODULES/org.conman.syslog
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.base64
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.crc
Linux x86 LGPL3+ Lua 5.1 5.1 1.0.0 MODULES/org.conman.env
Linux x86 LGPL3+ Lua 5.1 5.1 1.0.0 MODULES/org.conman.errno
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.fsys
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.fsys.magic
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.hash
Linux x86 LGPL3+ Lua 5.1 5.1 1.1.1 MODULES/org.conman.iconv
Linux x86 LGPL3+ Lua 5.1 5.1 5.1 MODULES/org.conman.math
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.net
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.net.ipacl
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.pollset
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.process
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.strcore
Linux x86 LGPL3+ Lua 5.1 5.1 1.2.0 MODULES/org.conman.sys
Linux x86 LGPL3+ Lua 5.1 5.1 1.0.2 MODULES/org.conman.syslog
Linux x86 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.tcc
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.cc
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.date
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.debug
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.dns.resolv
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.getopt
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.string
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.table
 LGPL3+ Lua 5.1 5.1 MODULES/org.conman.unix
 MIT Lua 5.1 5.1 0.10 MODULES/lpeg
 MIT Lua 5.1 5.1 0.10 MODULES/re
Linux x86 MIT Lua 5.1 5.1 0.12 MODULES/lpeg
Linux x86 MIT Lua 5.2 5.2 0.12 MODULES/lpeg
 MIT Lua 5.1 5.2 0.12 MODULES/re
Linux x86 MIT/X11 Lua 5.1 5.1 0.4.work3 MODULES/zlib
 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket
Linux x86 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket.core
 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket.ftp
 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket.http
 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket.smtp
 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket.tp
 MIT/X11 Lua 5.1 5.1 2.0.2 MODULES/socket.url
 MIT/X11 Lua 5.1 5.1 1.0.1 MODULES/ltn12
 FILES/APPNOTE.TXT
 FILES/COPYING
 FILES/README
 FILES/Miscellaneous Things About Nothing
The Good: I still support multiple architectures, and modules written in Lua
can be loaded directly from the LEM file. Also, only those modules that
match the OS, CPU and Lua versions are loaded, otherwise, they're ignored. 
I also include the version of the module, as well as the license.
The Bad: the modules written in C (so, a DLL or a shared object) *have* to
be written to disk before using. There is no way, short of writing my own
version of dlopen(), to support that. The limitiation is due, I suspect,
mainly due to "oh, we didn't think of that" with a minority of sysadmins
shouting from the wings "IT'S A @#$@#@#$@#$ SECURITY NIGHTMARE! DON'T ALLOW
IT!" [2]. So don't exepect that to change any time soon (Or ever).
The Ugly: I ended up monkey patching loadfile() and dofile(). That came up
as I was packaging LuaRocks into a LEM file:
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.add
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.admin_remove
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.build
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.build.builtin
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.build.cmake
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.build.command
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.build.make
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.cache
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.cfg
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.command_line
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.deps
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.dir
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.doc
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.download
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch.cvs
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch.git
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch.git_file
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch.hg
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch.sscm
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fetch.svn
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fs
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fs.lua
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fs.unix
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fs.unix.tools
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fs.win32
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.fs.win32.tools
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.help
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.index
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.install
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.lint
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.list
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.loader
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.make
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.make_manifest
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.manif
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.manif_core
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.new_version
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.pack
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.path
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.persist
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.purge
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.refresh_cache
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.remove
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.repos
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.require
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.search
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.show
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.site_config
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.tools.patch
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.tools.tar
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.tools.zip
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.type_check
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.unpack
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.util
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.validate
 MIT/X11 Lua 5.1 5.2 2.1.2 MODULES/luarocks.write_rockspec
 MIT/X11 Lua 5.1 5.2 2.1.2 APP/luarocks-admin
 MIT/X11 Lua 5.1 5.2 2.1.2 APP/luarocks
 Lua 5.1 5.1 SCRIPTS/config-5.1.lua
 Lua 5.1 5.2 SCRIPTS/config.lua
 LuaRocks looks for config-VERSION.lua and config.lua, and to get around
that, I had to do the aforementioned monkeypatching. Well, had dofile() not
called the C version of loadfile(), I could have minimized the monkey
patching to just loadfile(), but seeing how dofile() uses the C API, I also
needed to override that function as well.
 But I'm lucky in that LuaRocks only reads these files, and can run quite
nicely from the LEM file [3]:
[spc]lucy:~/projects/LEM>./tstapp.lua search zlib
Search results:
===============
Rockspecs and source rocks:
---------------------------
lzlib
 0.4.work3-1 (rockspec) - http://rocks.moonscript.org
 0.4.work3-1 (src) - http://rocks.moonscript.org
 0.4.work3-1 (rockspec) - http://luarocks.org/repositories/rocks
 0.4.work3-1 (src) - http://luarocks.org/repositories/rocks
 0.4-1 (rockspec) - http://rocks.moonscript.org
 0.4-1 (src) - http://rocks.moonscript.org
 0.4-1 (rockspec) - http://luarocks.org/repositories/rocks
 0.4-1 (src) - http://luarocks.org/repositories/rocks
 0.3-3 (rockspec) - http://rocks.moonscript.org
 0.3-3 (src) - http://rocks.moonscript.org
 0.3-3 (rockspec) - http://luarocks.org/repositories/rocks
 0.3-3 (src) - http://luarocks.org/repositories/rocks
 0.3-2 (rockspec) - http://rocks.moonscript.org
 0.3-2 (src) - http://rocks.moonscript.org
 0.3-2 (rockspec) - http://luarocks.org/repositories/rocks
 0.3-2 (src) - http://luarocks.org/repositories/rocks
 0.3-1 (rockspec) - http://rocks.moonscript.org
 0.3-1 (src) - http://rocks.moonscript.org
 0.3-1 (rockspec) - http://luarocks.org/repositories/rocks
 0.3-1 (src) - http://luarocks.org/repositories/rocks
 Had LuaRocks written to any of the files, then what? And that's where I'm
stuck right now. Running Lua modules directly (for various values of
"direct") works, but trying to run a Lua application from a LEM file might
be asking too much, especially if there are persistent files. As a
distribution format, it's not bad, and perhaps if there was a command to
extract the various modules, scripts and files and write them to appropriate
places that would be the direction to go in.
 One other thing to mention: the meta data, the OS, CPU, license, versions
and what not, aren't stored in a separate file, but are, instead, stored
using an extention method described in the ZIP file format. This extra data
isn't Lua specific and it could be used for other scripting languages. The
fields of this extended file data are:
	version		- version number of the file
	license		- license 
	language	- language (perhaps application, like WoW?)
	lvmin		- minimum version of the language required
	lvmax		- maximum version of the language required
	cpu		- architecture required (for C-based modules)
	os		- operating system required
	osver		- operating system version
 The fields are free-form strings, not longer than 255 characters. You
could easily throw in scripts in other languages, and while I didn't start
out with a universal scripting language application distribution format,
there's nothing in the format that restricts it to just Lua.
 -spc (As always, comments and questions are welcome ... )
[1]	No rockspec yet, as this is still somewhat in flux, but
	https://github.com/spc476/lua-conmanorg/blob/master/lua/zip.lua
	https://github.com/spc476/lua-conmanorg/blob/master/lua/zip/read.lua
	https://github.com/spc476/lua-conmanorg/blob/master/lua/zip/write.lua
[2]	To which I reply, "the computer is running. Game over."
[3]	The code in question:
		lem = require "lem"
		-- ******************************************************
		-- Any module loaded past this point *WILL* come from the
		-- supplied LEM file. No ands, ifs or buts about it.
		-- ******************************************************
		package.path = ""
		package.cpath = ""
		local luarocks,err = lem("luarocks.lem","luarocks")
		if not luarocks then
		 io.stderr:write("luarocks: ",err)
		 os.exit(1)
		end
		luarocks(unpack(arg))
[4]	https://github.com/spc476/LEM/blob/master/lem.lua

AltStyle によって変換されたページ (->オリジナル) /