mescc: Support single-dash options on Mes too.
[mes.git] / scripts / mescc.in
index d59d8f8797a35924bead53d67b8b88c99ad84e36..d3190bc798afaf9556039fe0a06a1fe898a41c5d 100755 (executable)
 #! @BASH@
-# -*-scheme-*-
-if [ "$V" = 2 ]; then
-    set -x
-fi
-prefix=${prefix-@prefix@}
-MES_PREFIX=${MES_PREFIX-$prefix/share/mes}
-export MES_PREFIX
-mes_p=$(command -v mes)
-mescc=$(command -v $0)
 
-guile_site_dir=${guile_site_dir-@guile_site_dir@}
-GUILE_LOAD_PATH=$guile_site_dir:$GUILE_LOAD_PATH
+# GNU Mes --- Maxwell Equations of Software
+# Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+#
+# This file is part of GNU Mes.
+#
+# GNU Mes is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or (at
+# your option) any later version.
+#
+# GNU Mes is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
 
-if [ '(' -z "$mes_p" -a -z "$MES" ')' -o "$MES" = "guile" -o "$MES" = "mes.guile" ]; then
-    guile_site_ccache_dir=${guile_site_ccache_dir-@guile_site_ccache_dir@}
-    GUILE_LOAD_COMPILED_PATH=$guile_site_ccache_dir:$GUILE_LOAD_COMPILED_PATH
-    GUILE_AUTO_COMPILE=${GUILE_AUTO_COMPILE-0}
-    export GUILE_AUTO_COMPILE
-    exec ${GUILE-guile} -L $guile_site_dir -e '(mescc)' -s "$mescc" "$@"
-else
-    MES=${MES-$(dirname $0)/mes}
-    exec ${MES-mes} -e '(mescc)' -s "$mescc" "$@"
+if [ "$V" = 2 ]; then
+    set -x
 fi
-!#
 
-;;; GNU Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
-;;;
-;;; This file is part of GNU Mes.
-;;;
-;;; GNU Mes is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Mes is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+MES_ARENA=${MES_ARENA-100000000}
+export MES_ARENA
 
-(define-module (mescc)
-  #:use-module (ice-9 getopt-long)
-  #:use-module (mes misc)
-  #:use-module (mescc mescc)
-  #:export (main))
+MES_STACK=${MES_STACK-500000}
+export MES_STACK
 
-(define %prefix (or (getenv "MES_PREFIX")
-                    (if (string-prefix? "@prefix" "@prefix@")
-                        ""
-                        "@prefix@/share/mes")))
+MES_PREFIX=${MES_PREFIX-/usr/share/mes}
+export MES_PREFIX
 
-(define %version (if (string-prefix? "@VERSION" "@VERSION@") "git"
-                     "@VERSION@"))
+GUILE_LOAD_PATH=@guile_site_dir@${GUILE_LOAD_PATH+:}${GUILE_LOAD_PATH}
+export GUILE_LOAD_PATH
 
-(cond-expand
- (mes
-  (define (set-port-encoding! port encoding) #t)
-  (mes-use-module (mes guile))
-  (mes-use-module (mes misc))
-  (mes-use-module (mes getopt-long))
-  (mes-use-module (mes display))
-  (mes-use-module (mescc mescc)))
- (guile
-  (define-macro (mes-use-module . rest) #t)))
+MES=${MES-@prefix@/bin/mes}
+bindir=${bindir-@prefix@/bin/mes}
 
-(when (and=> (getenv "V") (lambda (v) (> (string->number v) 1)))
-  (format (current-error-port) "mescc[~a]...\n" %scheme))
+if [ ! -f $bindir/mescc.scm ]; then
+   bindir=$(dirname $0)
+fi
 
-(define (parse-opts args)
-  (let* ((option-spec
-          '((align)
-            (assemble (single-char #\c))
-            (base-address (value #t))
-            (compile (single-char #\S))
-            (define (single-char #\D) (value #t))
-            (debug-info (single-char #\g))
-            (dumpmachine (single-char #\d))
-            (help (single-char #\h))
-            (include (single-char #\I) (value #t))
-            (library-dir (single-char #\L) (value #t))
-            (library (single-char #\l) (value #t))
-            (machine (single-char #\m) (value #t))
-            (preprocess (single-char #\E))
-            (output (single-char #\o) (value #t))
-            (version (single-char #\V))
-            (verbose (single-char #\v))
-            (write (single-char #\w) (value #t))))
-         (single-dash-options '("-dumpmachine"))
-         (args (map (lambda (o)
-                      (if (member o single-dash-options) (string-append "-" o)
-                          o))
-                    args))
-         (options (getopt-long args option-spec))
-         (help? (option-ref options 'help #f))
-         (files (option-ref options '() '()))
-         (usage? (and (not help?) (null? files)))
-         (version? (option-ref options 'version #f)))
-    (cond ((option-ref options 'dumpmachine #f)
-           (display "x86-mes")
-           (exit 0))
-          (version? (format #t "mescc (GNU Mes) ~a\n" %version) (exit 0))
-          (else
-           (and (or help? usage?)
-                (format (or (and usage? (current-error-port)) (current-output-port)) "\
-Usage: mescc [OPTION]... FILE...
-  --align            align globals
-  -c                 preprocess, compile and assemble only; do not link
-  -dumpmachine       display the compiler's target processor
-  --base-address=ADRRESS
-                     use BaseAddress ADDRESS [0x1000000]
-  -D DEFINE[=VALUE]  define DEFINE [VALUE=1]
-  -E                 preprocess only; do not compile, assemble or link
-  -g                 add debug info [GDB, objdump] TODO: hex2 footer
-  -h, --help         display this help and exit
-  -I DIR             append DIR to include path
-  -L DIR             append DIR to library path
-  -l LIBNAME         link with LIBNAME
-  -m BITS            compile for BITS bits [32]
-  -o FILE            write output to FILE
-  -S                 preprocess and compile only; do not assemble or link
-  -v, --version      display version and exit
-  -w,--write=TYPE    dump Nyacc AST using TYPE {pretty-print,write}
+# Workaround for second getopt-long parsing by Mes' boot-0.scm.
+args=""
+for i in "$@"; do
+    case "$i" in
+        -[a-zA-Z]) args="$args $i";;
+        -D[a-zA-Z]*) args="$args -D ${i:2}";;
+        -I[a-zA-Z]*) args="$args -I ${i:2}";;
+        -L[a-zA-Z]*) args="$args -L ${i:2}";;
+        -l[a-zA-Z]*) args="$args -l ${i:2}";;
+        -dumpmachine|-fno-builtin|-nodefaultlibs|-nostartfiles|-nostdinc|-nostdlib|-std=*) args="$args -$i";;
+        *) args="$args $i";;
+    esac
+done
 
-Environment variables:
+sep=
+if [ "$(basename ${SCHEME-$MES})" = "mes" ]; then
+    sep=--
+fi
 
-  MES=BINARY         run on mes-executable BINARY {mes,guile}
-  MES_DEBUG=LEVEL    show debug output with verbosity LEVEL {0..5}
-  NYACC_TRACE=1      show Nyacc progress
-")
-                (exit (or (and usage? 2) 0)))
-           options))))
+${SCHEME-$MES} \
+    --no-auto-compile\
+    -e main\
+    -L @guile_site_dir@\
+    -C @guile_site_ccache_dir@\
+    $bindir/mescc.scm\
+    $sep\
+    "$@"
 
-(define (main args)
-  (let* ((options (parse-opts args))
-         (options (acons 'prefix %prefix options))
-         (preprocess? (option-ref options 'preprocess #f))
-         (compile? (option-ref options 'compile #f))
-         (assemble? (option-ref options 'assemble #f))
-         (verbose? (option-ref options 'verbose (getenv "MES_DEBUG"))))
-    (when verbose?
-      (setenv "NYACC_TRACE" "yes")
-      (format (current-error-port) "options=~s\n" options))
-    (cond (preprocess? (mescc:preprocess options))
-          (compile? (mescc:compile options))
-          (assemble? (mescc:assemble options))
-          (else (mescc:link options)))))
-'done
+# ..but using -- "$@" that seems no longer necessary!
+#    $args