How to compile Lua scripts into a single executable, while still gaining the fast LuaJIT compiler?

nickb picture nickb · Jul 3, 2012 · Viewed 19.4k times · Source

How can I compile my Lua scripts into a single executable file, while also gaining the super fast performance benefits of LuaJIT?

Background:

  • My Lua scripts are for a web application I created (e.g. to host http://example.com)
  • My current technology stack is NGINX (web server), Lua/LuaJIT (language to retrieve dynamic content)
  • I have around 50+ .lua files that make up my web application (from Models/Views/Controllers)
  • FreeBSD 9 operating system

For simplicity sake in deployment, I'd like to compile down all of my .lua scripts that run my web application down to a single executable.

  1. Is this possible and how?

    It appears that Lua official comes with a library called SRLua

  2. What are the negatives to compiling down my .lua to a single executable (e.g. would performance be worse, etc)?

Answer

Mike Pall picture Mike Pall · Jul 3, 2012

Translate all of the Lua source code files to object files and put them in a static library:

for f in *.lua; do
    luajit -b $f `basename $f .lua`.o
done
ar rcus libmyluafiles.a *.o

Then link the libmyluafiles.a library into your main program using -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E.

This line forces the linker to include all object files from the archive and to export all symbols.

For example, a file named foo.lua can now be loaded with local foo = require("foo") from within your application.

Details about the -b option can be found on Running LuaJIT.