Created Run nim source files like scripts (with tcc and binfmt_misc) (markdown)

This commit is contained in:
niv 2017-02-26 15:04:44 +01:00
parent c116a15185
commit 078eee5e4e
1 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,56 @@
This is a rough guide on how to make nim source files behave like scripts. This document targets debian/ubuntu-likes; you may have to adjust for other systems.
## Prequisites
* Install tcc (optional, but recommended): `sudo apt install tcc`
* Make sure binfmt_misc support is available: `ls /proc/sys/fs/binfmt_misc/register`
## The script runner
Create `/usr/local/bin/nimtcc`, like so:
```bash
#!/bin/bash
if [[ "$#" -eq 0 ]]; then
echo "at least 1 argument required" >&2
exit 1
fi
if [[ ! -e "$1" ]]; then
echo "not found: $1" >&2
exit 1
fi
umask u+rwx
out=$(mktemp ${TMPDIR:-/tmp/}$(basename $1).XXXXXXXXXXXX)
function finish() {
rm -- "$out"
}
trap finish EXIT
nim compile \
--verbosity:0 \
'--hint[Processing]:off' \
--cc:tcc \
"-o:$out" \
-r $@
```
The script creates a temp file (in /tmp) to write the compiled program to, and immediately removes it thereafter again.
* Make sure nim is available on PATH, or change the path to the binary in the script.
* Mark it as executable: `sudo chmod +x /usr/local/bin/nimtcc`
* .. and test it: `$ nimtcc my_script.nim`. If it doesn't work, fix it.
**N.B.:**
- This still creates a `nimcache` in the current directory. I've left it in as a compromise to speed up iterative script development. If this is not desired, you will have to adjust the script to create an additional directory (with mktemp -d), pass that to the compiler; and then remove it afterwards.
- Similarily, you can get rid of the whole mktemp to write the script binary to the current directory.
## binfmt_misc
Now, optionally, make it so you can mark scripts as executable and run them directly. This requires binfmt_misc support in your kernel. Most modern kernels have this enabled by default.
* `$ echo ':nimtcc:E::nim::/usr/local/bin/nimtcc:' | sudo tee -a /proc/sys/fs/binfmt_misc/register`
* `$ chmod +x my_script.nim`
* `$ ./my_script.nim`