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