mim: run scripts from a specification file
authorRon Yorston <rmy@pobox.com>
Mon, 13 Jan 2020 10:33:46 +0000 (10:33 +0000)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 30 Apr 2020 15:23:08 +0000 (17:23 +0200)
mim runs scripts from a specification file which can be thought
of as an extremely limited Makefile. Neither make variables nor
dependencies are supported. By default the file 'Mimfile' is read.
An example:

   hello:
      echo hello $1

   clean:
      rm -rf *

The command 'mim' or 'mim hello' will echo 'hello'. Unlike 'make'
arguments after the first are available to the script; they don't
specify additional targets.

mim isn't enabled by default.  Enabling it increases the size of the
binary by about 500 bytes.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
applets_sh/mim [new file with mode: 0755]
miscutils/mim.c [new file with mode: 0644]

diff --git a/applets_sh/mim b/applets_sh/mim
new file mode 100755 (executable)
index 0000000..2a65c35
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/sh
+MIMFILE="Mimfile"
+if [ $# -ge 2 ] && [ "$1" = "-f" ]
+then
+       MIMFILE="$2"
+       shift 2
+fi
+exec <"$MIMFILE" || exit 1
+{
+       INCASE=false
+       while read -r REPLY
+       do
+               case $REPLY in
+               *:)
+                       if ! $INCASE
+                       then
+                               printf '[ $# -eq 0 ] && set -- "%s"
+TARGET="$1"
+shift
+case "$TARGET" in
+' "${REPLY%:}"
+                       else
+                               printf ';;\n'
+                       fi
+                       printf '%s)\n' "${REPLY%:}"
+                       INCASE=true
+                       ;;
+               "") ;;
+               *) printf '%s\n' "${REPLY##[    ]}";;
+               esac
+       done
+       $INCASE && printf ';;\n'
+       printf '*)
+echo "Unknown command $TARGET"
+exit 1
+;;
+esac
+'
+} | sh -s "$@"
diff --git a/miscutils/mim.c b/miscutils/mim.c
new file mode 100644 (file)
index 0000000..d9b4694
--- /dev/null
@@ -0,0 +1,15 @@
+//config:config MIM
+//config:      bool "mim (0.5 kb)"
+//config:      default y
+//config:      depends on FEATURE_SH_EMBEDDED_SCRIPTS
+//config:      help
+//config:      Run a script from a Makefile-like specification file.
+//config:      Unlike 'make' dependencies aren't supported.
+
+//applet:IF_MIM(APPLET_SCRIPTED(mim, scripted, BB_DIR_USR_SBIN, BB_SUID_DROP, mim))
+
+//usage:#define mim_trivial_usage
+//usage:       "[-f FILE] [SHELL_OPTIONS] [TARGET] ..."
+//usage:#define mim_full_usage "\n\n"
+//usage:       "Run a script from a Makefile-like specification file\n"
+//usage:     "\n       -f FILE         Spec file (default Mimfile)"