mescc: Posixify interface.
[mes.git] / scripts / mescc
1 #! /bin/sh
2 # -*-scheme-*-
3 if [ -n "$BUILD_DEBUG" ]; then
4     set -x
5 fi
6 PREFIX=${PREFIX-@PREFIX@}
7 if [ "$PREFIX" = @PREFIX""@ -o ! -d "$PREFIX" ]
8 then
9     MES_PREFIX=${MES_PREFIX-$(cd $(dirname $0)/.. && pwd)}
10     export MES_PREFIX
11 fi
12 mes_p=$(command -v mes)
13 if [ '(' -z "$mes_p" -a -z "$MES" ')' -o "$MES" = "guile" -o "$MES" = "mes.guile" ]; then
14     GODIR=${GODIR-@GODIR@}
15     GUILEDIR=${GUILEDIR-@GUILEDIR@}
16     [ "$GODIR" = @"GODIR"@ ] && GODIR=$(dirname $0)/../guile
17     [ "$GUILEDIR" = @"GUILEDIR"@ ] && GUILEDIR=$(dirname $0)/../guile
18     export GUILE_AUTO_COMPILE=${GUILE_AUTO_COMPILE-0}
19     GUILE_LOAD_COMPILED_PATH=$GODIR:$GUILE_LOAD_COMPILED_PATH
20     exec ${GUILE-guile} -L $GUILEDIR -e '(mescc)' -s "$0" "$@"
21 else
22     MES=${MES-$(dirname $0)/mes}
23     MES_MODULEDIR=${MES_MODULEDIR-$MES_PREFIX/"module"}
24     export MES_MODULEDIR
25     exec ${MES-mes} -e '(mescc)' -s $0 "$@"
26 fi
27 !#
28
29 ;;; Mes --- Maxwell Equations of Software
30 ;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
31 ;;;
32 ;;; This file is part of Mes.
33 ;;;
34 ;;; Mes is free software; you can redistribute it and/or modify it
35 ;;; under the terms of the GNU General Public License as published by
36 ;;; the Free Software Foundation; either version 3 of the License, or (at
37 ;;; your option) any later version.
38 ;;;
39 ;;; Mes is distributed in the hope that it will be useful, but
40 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
41 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
42 ;;; GNU General Public License for more details.
43 ;;;
44 ;;; You should have received a copy of the GNU General Public License
45 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
46
47 (define-module (mescc)
48   #:use-module (ice-9 getopt-long)
49   #:use-module (mes misc)
50   #:use-module (mescc mescc)
51   #:export (main))
52
53 (define %prefix (if (string-prefix? "@PREFIX" "@PREFIX@") (or (getenv "MES_PREFIX") "") "@PREFIX@"))
54
55 (define %version (if (string-prefix? "@VERSION" "@VERSION@") "git"
56                      "@VERSION@"))
57
58 (cond-expand
59  (mes
60   (define (set-port-encoding! port encoding) #t)
61   (mes-use-module (mes guile))
62   (mes-use-module (mes misc))
63   (mes-use-module (mes getopt-long))
64   (mes-use-module (mes display))
65   (mes-use-module (mescc mescc)))
66  (guile
67   (define-macro (mes-use-module . rest) #t)))
68
69 (format (current-error-port) "mescc[~a]...\n" %scheme)
70
71 (define (parse-opts args)
72   (let* ((option-spec
73           '((assemble (single-char #\c))
74             (compile (single-char #\S))
75             (define (single-char #\D) (value #t))
76             (debug-info (single-char #\g))
77             (help (single-char #\h))
78             (include (single-char #\I) (value #t))
79             (library (single-char #\l) (value #t))
80             (preprocess (single-char #\E))
81             (output (single-char #\o) (value #t))
82             (version (single-char #\V))
83             (verbose (single-char #\v))
84             (write (single-char #\w) (value #t))))
85          (options (getopt-long args option-spec))
86          (help? (option-ref options 'help #f))
87          (files (option-ref options '() '()))
88          (usage? (and (not help?) (null? files)))
89          (version? (option-ref options 'version #f)))
90     (or
91      (and version?
92           (format (current-output-port) "mescc (mes) ~a\n" %version))
93      (and (or help? usage?)
94           (format (or (and usage? (current-error-port)) (current-output-port)) "\
95 Usage: mescc [OPTION]... FILE...
96   -c                 preprocess, compile and assemble only; do not link
97   -D DEFINE[=VALUE]  define DEFINE [VALUE=1]
98   -E                 preprocess only; do not compile, assemble or link
99   -g                 add debug info [GDB, objdump] TODO: hex2 footer
100   -h, --help         display this help and exit
101   -I DIR             append DIR to include path
102   -l LIBNAME         link with LIBNAME
103   -o FILE            write output to FILE
104   -S                 preprocess and compile only; do not assemble or link
105   -v, --version      display version and exit
106   -w,--write=TYPE    dump Nyacc AST using TYPE {pretty-print,write}
107
108 Environment variables:
109
110   MES=BINARY         run on mes-executable BINARY {mes,guile}
111   MES_DEBUG=LEVEL    show debug output with verbosity LEVEL {0..5}
112   NYACC_TRACE=1      show Nyacc progress
113 ")
114           (exit (or (and usage? 2) 0)))
115      options)))
116
117 (define (main args)
118   (let* ((options (parse-opts args))
119          (options (acons 'prefix %prefix options))
120          (preprocess? (option-ref options 'preprocess #f))
121          (compile? (option-ref options 'compile #f))
122          (assemble? (option-ref options 'assemble #f))
123          (verbose? (option-ref options 'verbose (getenv "MES_DEBUG"))))
124     (when verbose?
125       (setenv "NYACC_TRACE" "yes")
126       (format (current-error-port) "options=~s\n" options))
127     (cond (preprocess? (mescc:preprocess options))
128           (compile? (mescc:compile options))
129           (assemble? (mescc:assemble options))
130           (else (mescc:link options)))))
131 'done