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