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