bootlj - portable luajit script bootloader
bootlj [
-J passopt...
-J] [
args...]
- dir1 -+- bootlj
+- main.lua ( require("myutil") )
+- myutil.lua
---
dir1 $ ./bootlj -h #>> luajit -- main.lua -h
dir1 $ cd ..
$ ./dir1/bootlj #>> run ./dir1/main.lua
$ cd dir1
dir1 $ rm main.lua
dir1 $ ./bootlj #>> main.lua not found
(make symbolic link to dir1/bootlj at /usr/bin etc)
home $ bootlj #>> run main.lua
- -J passopt... -J
- pass opt to luajit vm. ~$ luajit passopt...
bootlj is a wrapper of luajit runner with the followingfeatures:
- exec `main.lua` in the same directory
- add the bootlj exist dirpath to package.path and cpath
- add useful global vars
* FULL_BOOTFILE (fullpath filename, /home/abc/bootlj etc)
* BASE_BOOTFILE (filename: bootlj etc, no dirpath)
* FULL_BOOTDIR (fullpath dirname, c:\home\dir etc.)
* FULL_CWD (fullpath cwd, /home/now etc)
* DIRSEP (directory sepstr, win==\, other==/ etc)
this feature makes your app package portable, directory == app. lua and luajit
path/cpath dont have bootfile exist dirpath so causes the path search problem.
bootlj resolves it.
- dir1 -+- src.lua ( require("myutil") )
+- myutil.lua
dir1$ luajit src.lua #>> work
dir1$ cd ../
$ luajit ./dir1/src.lua #>> misses myutil.lua
the best practice for making your luajit code portable is:
- -
- use require("foo") for import foo.lua. loaded from the appdir or
other path
- -
- use package.searchpath("myutil", package.cpath) and
ffi.load(rtnstr) to load libmyutil.so etc.
- -
- use ffi.load("directX") to load major library, libdirectX.so
etc
- -
- use ffi.C.printf() if use standard C-lib funcs
- -
- place every related files(*.lua *.so *.dll) in a non-nested one directory.
dir1-+- bootlj
+- main.lua
+- main_impl.lua
+- foo.lua
+- tool.lua
+- libmyutil.so
+- xyz.dll
bootlj holds whole the orig-luajit vm. the below works almost the same.
~$ ./bootlj -h
~$ luajit -- main.lua -h
luajit vm accepts commandline options.(https://luajit.org/running.html) if you
want to run luajit with its options, put between optsep str. default optsep is
"-J".
~$ ./bootlj -J -Ohotloop=10 -joff -J -h
~$ luajit -Ohotloop=10 -joff -- main.lua -h
you can change bootfile name `main.lua` and optsep `-J` using libbootlj.a. see
bootlj.h
//basic
#include "bootlj.h"
int main(int argc, char** argv){
return bootlj_main(argc, argv);
}
//~$ cc -Wall -pedantic -static -fPIC src.c libbootlj.a -ldl -lm
//~$ ./a.out -J -Ohotloop=10 -J -h
#include "bootlj.h"
int main(int argc, char** argv){
return bootlj_main(argc, argv, "xyz.txt", "123");
}
//~$ cc src.c libbootlj.a -ldl -lm
//~$ ./a.out 123 -Ohotloop=10 123 -h #>> search xyz.txt and run
exit code depends on main.lua script and follows lua's method.
- rtn 1 if lj rtns nil/false/err at ag1. (lj)return nil >> $?=1
- rtn int if lj return num at ag1. (lj)return 8.2 >> $?=8
- rtn 1 if lj return other type at ag1. (lj)return "msg" >> $?=1
- emsg to stderr if err or str at ag2. (lj)return 0,"hw" >> $?=0 +"hw"
---concept
- make luacode/binary/library portable
- support to the powerful api, require()/ffi.load()
- files in the same directory *SHOULD* be searched/loaded
posix-2001+
Copyright 2020 momi-g, GPLv3+
2021-08-21
https://luajit.org/index.html
https://www.lua.org/manual/5.1/manual.html
luajit bases lua 5.1(+appropriate extented) syntax. avoid 5.2/5.3/5.4. orig-lua
frequently changes syntax that ignores backwards compatibility like python2
>> 3, win7 >> 10, perl5 >> 6 etc. i recommend you to use
luajit instead of orig-lua.