diff --git a/Run-nim-source-files-like-scripts-(with-tcc-and-binfmt_misc).md b/Run-nim-source-files-like-scripts-(with-tcc-and-binfmt_misc).md new file mode 100644 index 0000000..5380b72 --- /dev/null +++ b/Run-nim-source-files-like-scripts-(with-tcc-and-binfmt_misc).md @@ -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`