A luajit binding for ooc - to load and use Lua code from an ooc program. Since luajit is API-compatible to lua, we can just pretend it's a lua binding.
- Friedrich Weber
- Amos Wenger
Here are few things to keep in mind while trying to use lua-jit's FFI.
Basically, your problems are going to be that the FFI won't be able to resolve symbols in your programs. Here's how to expose them on various platforms
On Linux you need to use the linker option --export-dynamic
- if you're
using the default rock profile (-pg
- the debug profile), GCC's -rdynamic
is already used, which seems to do the trick. Just to make sure, and for it
to work, you can edit luajit.pc
to have:
Libs: -L${libdir} -l${libname} -Wl,--export-dynamic
Also, whatever you do, do not use Ubuntu's luajit packages. Debian's seem to work, Ubuntu's are just crashing away, just do yourself a favor and compile everything you need, by hand, in a clean prefix, cause that's what true scots do.
With mingw, you need to use the linker option --export-all-symbols
. If
you've compiled luajit yourself, you can simply edit luajit.pc
to have
a Libs line like this:
Libs: -L${libdir} -l${libname} -Wl,--export-all-symbols
Also, don't use a luajit build from anywhere - trust only what you build yourself. A command like this should work:
make HOST_CC="gcc -m32" CROSS=i686-w64-mingw32- TARGET_SYS=Windows BUILDMODE=dynamic
Contrary to pretty much every other library on earth that cross-compiles cleanly with mingw, luajit's a special snowflake that:
- Gets compiled to lua51.dll - because lua C extensions are linked against that name and luajit is a drop-in replacement for lua (the slower, main implementation), and so fuck logic.
- Doesn't have an equivalent liblua51.dll.a - apparently you can just go ahead and link directly with lua51.dll, because MinGW works in mysterious ways.
- Doesn't have a clean 'install' target in its Makefile when installing in a cross
environment. Just copy
src/laux*.h
andsrc/lua*.h
to $PREFIX/include, andsrc/*.dll
to $PREFIX/lib. Alsoetc/luajit.pc
to $PREFIX/lib/pkgconfig - but you'll need to edit it by hand to change the prefix in there, and also the library name.
Here's a working luajit.pc sample:
# Package information for LuaJIT to be used by pkg-config.
majver=2
minver=0
relver=2
version=${majver}.${minver}.${relver}
abiver=5.1
# NOTE - YOU WANT YOUR OWN PREFIX HERE, NOT MINE
prefix=/opt/prefixes/i686-w64-mingw32
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
libname=lua51
includedir=${prefix}/include/luajit-${majver}.${minver}
INSTALL_LMOD=${prefix}/share/lua/${abiver}
INSTALL_CMOD=${prefix}/lib/lua/${abiver}
Name: LuaJIT
Description: Just-in-time compiler for Lua
URL: http://luajit.org
Version: ${version}
Requires:
Libs: -L${libdir} -l${libname} -Wl,--export-all-symbols
Libs.private: -Wl,-E -lm -ldl
Cflags: -I${includedir}
If you're building for OSX 64-bit, you need some special compiler flags. You
may want to edit your luajit.pc
to have a Libs line that looks like this:
Libs: -L${libdir} -l${libname} -pagezero_size 10000 -image_base 100000000
Otherwise, it'll just crash. On 32-bit, it doesn't to be needed (it's harmful, even!)
Apparently, luajit is doing something funny with its memory allocator and it won't work when the default (mapping page 0 to the first 4GB of virtual memory) is applied, apparently.
With that out of the way, OSX doesn't seem to need the -Wl,--export-dynamic
option
at all. Not sure why. It just works, be happy.
If you need help compiling luajit yourself on OSX, it's always a good idea to take a look at the homebrew formula for it. It should be self-explanatory, and if it's not, look up the Formula cookbook.