mescc: Merge mescc.mes and mescc.scm.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 27 Apr 2018 21:47:31 +0000 (23:47 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 27 Apr 2018 21:47:31 +0000 (23:47 +0200)
* scripts/mescc: New file.
* scripts/mescc.mes: Remove.
* guile/mescc.scm: Remove.
* guile/guix/make.scm (CC.mescc): Update.
* install.sh (TINYCC_SEED): Update.
* make.scm (bootstrap?): Update.
* test.sh (MES): Update.
* check-boot.sh: Use $GUILE to allow running without Guile.

39 files changed:
check-boot.sh
check-mescc.sh
guile/guix/make.scm
guile/mescc.scm [deleted file]
install.sh
make.scm
scripts/mes [new symlink]
scripts/mescc [new file with mode: 0755]
scripts/mescc.mes [deleted file]
test.sh
tests/base.test
tests/boot.test
tests/catch.test
tests/closure.test
tests/cwv.test
tests/display.test
tests/fluids.test
tests/getopt-long.test
tests/guile.test
tests/let-syntax.test
tests/let.test
tests/match.test
tests/math.test
tests/module.test
tests/optargs.test
tests/peg.test
tests/pmatch.test
tests/psyntax.test
tests/quasiquote.test
tests/read.test
tests/record.test
tests/scm.test
tests/srfi-1.test
tests/srfi-13.test
tests/srfi-14.test
tests/srfi-16.test
tests/srfi-43.test
tests/syntax.test
tests/vector.test

index 801a4e9247b28b1cc4597309b51033e55e7336c2..380611a01bb39ba7a9f6434e2e9a45329527c014 100755 (executable)
@@ -110,7 +110,7 @@ for i in $tests; do
         echo ' [SKIP]'
         continue;
     fi
-    guile -L guile -L . <(echo '(use-modules (mes guile))'; cat scaffold/boot/$i) >& /dev/null
+    $GUILE -L guile -L . <(echo '(use-modules (mes guile))'; cat scaffold/boot/$i) >& /dev/null
     x=$(
         if [ -z "${i/5[0-9]-*/}" ]; then
             cat scaffold/boot/$i | MES_BOOT=boot-00.scm $MES 2>&1;
index 42b783a0ded32ee7060e2dc9476961309ea441ed..598a7464a65977fd14a9edaf4472a7bf8c30d262 100755 (executable)
 # along with Mes.  If not, see <http://www.gnu.org/licenses/>.
 
 export MES=${MES-src/mes}
-export MESCC=${MESCC-scripts/mescc.mes}
+export MESCC=${MESCC-scripts/mescc}
 #export MES_ARENA=${MES_ARENA-200000000} > 12GB mem
 
 GUILE=${GUILE-guile}
 MES=${MES-src/mes}
 M1=${M1-M1}
 HEX2=${HEX2-hex2}
-MESCC=${MESCC-guile/mescc.scm}
 MES_PREFIX=${MES_PREFIX-.}
 
 # $MESCC -E -o lib/crt1.E lib/crt1.c
index 724da3b6e8e1650b066bd2cc38393b393920de67..470c920cf29f90345ee50a1ad21fd4fb4f4d102d 100644 (file)
                               "-o" ,(target-file-name t)
                               ,@input-files)))))))
 
-(define %MESCC "guile/mescc.scm")
+(define %MESCC "scripts/mescc")
 (define* (CC.mescc #:key (cc %MESCC))
   (method (name "CC.mescc")
           (build (lambda (o t)
                    (let ((input-files (map target-file-name (target-inputs t))))
                      (format #t "  ~a\t ~a -> ~a\n" (method-name o) (string-join input-files) (target-file-name t))
+                     (setenv "MES" "guile")
                      (apply system**
-                            `("guile/mescc.scm" "-c"
+                            `("scripts/mescc" "-c"
                               "-o" ,(target-file-name t)
-                              ,@input-files)))))
+                              ,@input-files))
+                     (unsetenv "MES"))))
           (inputs (list (store #:add-file "guile/language/c99/info.go")
                         (store #:add-file "guile/language/c99/compiler.go")
                         (store #:add-file "guile/mes/as-i386.go")
diff --git a/guile/mescc.scm b/guile/mescc.scm
deleted file mode 100755 (executable)
index e96cb80..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-#! /bin/sh
-# -*-scheme-*-
-GODIR=${GODIR-@GODIR@}
-GUILEDIR=${GUILEDIR-@GUILEDIR@}
-[ "$GODIR" = @"GODIR"@ ] && GODIR=$(dirname $0)
-[ "$GUILEDIR" = @"GUILEDIR"@ ] && GUILEDIR=$(dirname $0)
-export GUILE_AUTO_COMPILE=${GUILE_AUTO_COMPILE-0}
-GUILE_LOAD_COMPILED_PATH=$GODIR:$GUILE_LOAD_COMPILED_PATH
-exec ${GUILE-guile} -L $GUILEDIR -e '(mescc)' -s "$0" "$@"
-!#
-
-;;; Mes --- The Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; 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.
-;;;
-;;; 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
-
-;; The Maxwell Equations of Software -- John McCarthy page 13
-;; http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf
-
-#!
-Run with Guile-1.8:
-GUILE='~/src/guile-1.8/build/pre-inst-guile --debug -q' guile/mescc.scm
-!#
-
-(define-module (mescc)
-  #:use-module (language c99 info)
-  #:use-module (language c99 compiler)
-  #:use-module (mes elf)
-  #:use-module (mes M1)
-  #:use-module (ice-9 getopt-long)
-  #:use-module (ice-9 pretty-print)
-  #:use-module (srfi srfi-1)
-  #:use-module (srfi srfi-26)
-  #:export (main))
-
-(cond-expand
- (guile-2)
- (guile
-  (use-modules (ice-9 syncase))))
-
-(define %prefix (if (string-prefix? "@PREFIX" "@PREFIX@") (or (getenv "MES_PREFIX") "") "@PREFIX@"))
-(module-define! (resolve-module '(language c99 compiler)) '%prefix %prefix)
-
-(define (parse-opts args)
-  (let* ((option-spec
-          '((c (single-char #\c))
-            (define (single-char #\D) (value #t))
-            (E (single-char #\E))
-            (g (single-char #\g))
-            (help (single-char #\h))
-            (include (single-char #\I) (value #t))
-            (o (single-char #\o) (value #t))
-            (version (single-char #\V) (value #t))))
-         (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)))
-    (or
-     (and version?
-          (format (current-output-port) "mescc.scm (mes) ~a\n" %version))
-     (and (or help? usage?)
-          (format (or (and usage? (current-error-port)) (current-output-port)) "\
-Usage: mescc.scm [OPTION]... FILE...
-  -c                 compile and assemble, but do not link
-  -D DEFINE          define DEFINE
-  -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
-  -o FILE            write output to FILE
-  -v, --version      display version and exit
-")
-          (exit (or (and usage? 2) 0)))
-     options)))
-
-(define (read-object file)
-  (let ((char (with-input-from-file file read-char)))
-    (if (eq? char #\#) (error "hex2 format not supported:" file)))
-  (with-input-from-file file read))
-
-(define (main:ast->info file)
-  (let ((ast (with-input-from-file file read)))
-    (c99-ast->info ast)))
-
-(define (source->ast defines includes)
-  (lambda (file)
-    (with-input-from-file file
-      (lambda ()
-        (pretty-print (c99-input->ast #:defines defines #:includes includes))))))
-
-(define (source->info defines includes)
-  (lambda (file)
-    (with-input-from-file file
-      (lambda ()
-        ((c99-input->info #:defines defines #:includes includes))))))
-
-(define (ast? o)
-  (or (string-suffix? ".E" o)
-      (string-suffix? ".guile-E" o)))
-
-(define (object? o)
-  (or (string-suffix? ".o" o)
-      (string-suffix? ".guile-o" o)))
-
-(define (main args)
-  (let* ((options (parse-opts args))
-         (files (option-ref options '() '()))
-         (file (car files))
-         (preprocess? (option-ref options 'E #f))
-         (compile? (option-ref options 'c #f))
-         (debug-info? (option-ref options 'g #f))
-         (asts (filter ast? files))
-         (objects (filter object? files))
-         (sources (filter (cut string-suffix? ".c" <>) files))
-         (base (substring file (1+ (or (string-rindex file #\/) -1)) (- (string-length file) 2)))
-         (out (option-ref options 'o (cond (compile? (string-append base ".o"))
-                                           (preprocess? (string-append base ".E"))
-                                           (else "a.out"))))
-         (multi-opt (lambda (option) (lambda (o) (and (eq? (car o) option) (cdr o)))))
-         (defines (reverse (filter-map (multi-opt 'define) options)))
-         (includes (reverse (filter-map (multi-opt 'include) options))))
-    (setenv "NYACC_TRACE" "yes")
-    (when (getenv "MES_DEBUG") (format (current-error-port) "options=~s\n" options)
-          (format (current-error-port) "output: ~a\n" out))
-    (if (and (pair? sources) (pair? objects)) (error "cannot mix source and object files:" files))
-    (with-output-to-file out
-      (lambda ()
-        (if (and (not compile?)
-                 (not preprocess?)) (set-port-encoding! (current-output-port) "ISO-8859-1"))
-        (cond ((pair? objects) (let ((objects (map read-object objects)))
-                                 (if compile? (objects->M1 objects)
-                                     (objects->elf objects))))
-              ((pair? asts) (let* ((infos (map main:ast->info asts))
-                                   (objects (map info->object infos)))
-                              (if compile? (objects->M1 objects)
-                                  (objects->elf objects))))
-              ((pair? sources) (if preprocess? (map (source->ast defines includes) sources)
-                                   (let* ((infos (map (source->info defines includes) sources))
-                                          (objects (map info->object infos)))
-                                     (if compile? (objects->M1 objects)
-                                         (objects->elf objects))))))))
-    (if (and (not compile?)
-             (not preprocess?))
-        (chmod out #o755))))
index 6f5f4063db3d79ba81f536bfe921ac9360b9a021..9e60e044e93c826b7e221673b2a63bfb2f8705a8 100755 (executable)
@@ -20,11 +20,9 @@ cp crt1.hex2 $MES_PREFIX/lib/crt1.hex2
 cp libc-mes.hex2 $MES_PREFIX/lib/libc-mes.hex2
 cp libc+tcc-mes.hex2 $MES_PREFIX/lib/libc+tcc-mes.hex2
 
-cp scripts/mescc.mes $PREFIX/bin/mescc.mes
+cp scripts/mescc $PREFIX/bin/mescc
 sed -e "s,@PREFIX@,$MES_PREFIX,g" \
-    scripts/mescc.mes > $PREFIX/bin/mescc.mes
-sed -e "s,@PREFIX@,$MES_PREFIX,g" \
-    guile/mescc.scm > $PREFIX/bin/mescc.scm
+    scripts/mescc > $PREFIX/bin/mescc
 
 mkdir -p $MES_PREFIX
 tar -cf- doc guile include lib module scaffold stage0 | tar -xf- -C $MES_PREFIX
index 6bb41654c0ee36e0347719d6b7e23512632a9078..20a3ff28a39987eaf11a6d55b9c9a368e426291b 100755 (executable)
--- a/make.scm
+++ b/make.scm
@@ -507,11 +507,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
 
 (add-target (group "check-tests" #:dependencies (filter (target-prefix? "check-tests/") %targets)))
 
-;; FIXME: run tests/base.test
-(setenv "MES" "src/mes.guile")
-
-(add-target (install "guile/mescc.scm" #:dir "bin" #:substitutes #t))
-(add-target (install "scripts/mescc.mes" #:dir "bin" #:substitutes #t))
+(add-target (install "scripts/mescc" #:dir "bin" #:substitutes #t))
 (define bootstrap? #f)
 (if bootstrap?
     (add-target (install "src/mes.mes" #:dir "bin" #:installed-name "mes"))
@@ -539,7 +535,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
    "module/mes/as.mes"
    "module/mes/as.scm"
    "module/mes/base.mes"
-   "module/mes/boot-0.scm"
+   ;;"module/mes/boot-0.scm"
    "module/mes/boot-00.scm"
    "module/mes/boot-01.scm"
    "module/mes/boot-02.scm"
diff --git a/scripts/mes b/scripts/mes
new file mode 120000 (symlink)
index 0000000..2e8dd05
--- /dev/null
@@ -0,0 +1 @@
+../src/mes.gcc
\ No newline at end of file
diff --git a/scripts/mescc b/scripts/mescc
new file mode 100755 (executable)
index 0000000..eb7d4b9
--- /dev/null
@@ -0,0 +1,204 @@
+#! /bin/sh
+# -*-scheme-*-
+mes_p=$(type -p mes)
+if [ '(' -z "$mes_p" -a -z "$MES" ')' -o "$MES" = "guile" -o "$MES" = "mes.guile" ]; then
+    GODIR=${GODIR-@GODIR@}
+    GUILEDIR=${GUILEDIR-@GUILEDIR@}
+    [ "$GODIR" = @"GODIR"@ ] && GODIR=$(dirname $0)
+    [ "$GUILEDIR" = @"GUILEDIR"@ ] && GUILEDIR=$(dirname $0)/../guile
+    export GUILE_AUTO_COMPILE=${GUILE_AUTO_COMPILE-0}
+    GUILE_LOAD_COMPILED_PATH=$GODIR:$GUILE_LOAD_COMPILED_PATH
+    exec ${GUILE-guile} -L $GUILEDIR -e '(mescc)' -s "$0" "$@"
+else
+    MES=${MES-$(dirname $0)/mes}
+    PREFIX=${PREFIX-@PREFIX@}
+    MES_PREFIX=${MES_PREFIX-$PREFIX}
+    if [ "$MES_PREFIX" = @PREFIX""@ ]
+    then
+        MES_PREFIX=$(cd $(dirname $0)/.. && pwd)
+        export MES_PREFIX
+    fi
+    MES_MODULEDIR=${MES_MODULEDIR-$MES_PREFIX/"module"}
+    export MES_MODULEDIR
+    $MES -s $0 "$@"
+    exit $?
+fi
+!#
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; 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.
+;;;
+;;; 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+#!
+Run with Guile-1.8:
+GUILE='~/src/guile-1.8/build/pre-inst-guile --debug -q' scripts/mescc
+!#
+
+(define-module (mescc)
+  #:use-module (language c99 info)
+  #:use-module (language c99 compiler)
+  #:use-module (mes elf)
+  #:use-module (mes M1)
+  #:use-module (ice-9 getopt-long)
+  #:use-module (ice-9 pretty-print)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (main))
+
+(define %prefix (if (string-prefix? "@PREFIX" "@PREFIX@") (or (getenv "MES_PREFIX") "") "@PREFIX@"))
+
+(cond-expand
+ (mes
+  (define %scheme "mes"))
+ (guile-2
+  (define %scheme "guile")
+  (define-macro (mes-use-module . rest) #t)
+  (module-define! (resolve-module '(language c99 compiler)) '%prefix %prefix))
+ (guile
+  (use-modules (ice-9 syncase))
+  (define %scheme "guile")
+  (define-macro (mes-use-module . rest) #t)
+  (module-define! (resolve-module '(language c99 compiler)) '%prefix %prefix)))
+
+(define guile? (equal? %scheme "guile"))
+
+(mes-use-module (mes guile))
+(mes-use-module (mes getopt-long))
+(mes-use-module (mes pretty-print))
+(mes-use-module (language c99 info))
+(mes-use-module (language c99 compiler))
+(mes-use-module (mes display))
+(mes-use-module (mes elf))
+(mes-use-module (mes M1))
+(mes-use-module (srfi srfi-1))
+(mes-use-module (srfi srfi-26))
+
+(format (current-error-port) "mescc[~a]...\n" %scheme)
+
+(define (parse-opts args)
+  (let* ((option-spec
+          '((c (single-char #\c))
+            (define (single-char #\D) (value #t))
+            (E (single-char #\E))
+            (g (single-char #\g))
+            (help (single-char #\h))
+            (include (single-char #\I) (value #t))
+            (o (single-char #\o) (value #t))
+            (version (single-char #\V))
+            (write (single-char #\w) (value #t))))
+         (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)))
+    (or
+     (and version?
+          (format (current-output-port) "mescc (mes) ~a\n" %version))
+     (and (or help? usage?)
+          (format (or (and usage? (current-error-port)) (current-output-port)) "\
+Usage: mescc [OPTION]... FILE...
+  -c                 compile and assemble, but do not link
+  -D DEFINE          define DEFINE
+  -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
+  -o FILE            write output to FILE
+  -v, --version      display version and exit
+  -w,--write=TYPE    dump Nyacc AST using TYPE {pretty-print,write}
+
+Environment variables:
+
+  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)))
+
+(define (read-object file)
+  (let ((char (with-input-from-file file read-char)))
+    (if (eq? char #\#) (error "hex2 format not supported:" file)))
+  (with-input-from-file file read))
+
+(define (main:ast->info file)
+  (let ((ast (with-input-from-file file read)))
+    (c99-ast->info ast)))
+
+(define (source->ast write defines includes)
+  (lambda (file)
+    (with-input-from-file file
+      (lambda ()
+        (write (c99-input->ast #:defines defines #:includes includes))))))
+
+(define (source->info defines includes)
+  (lambda (file)
+    (with-input-from-file file
+      (lambda ()
+        ((c99-input->info #:defines defines #:includes includes))))))
+
+(define (ast? o)
+  (or (string-suffix? ".E" o)
+      (string-suffix? (string-append "." %scheme "-E") o)))
+
+(define (object? o)
+  (or (string-suffix? ".o" o)
+      (string-suffix? (string-append "." %scheme "-o") o)))
+
+(define (main args)
+  (let* ((options (parse-opts args))
+         (files (option-ref options '() '()))
+         (file (car files))
+         (preprocess? (option-ref options 'E #f))
+         (compile? (option-ref options 'c #f))
+         (debug-info? (option-ref options 'g #f))
+         (asts (filter ast? files))
+         (objects (filter object? files))
+         (sources (filter (cut string-suffix? ".c" <>) files))
+         (base (substring file (1+ (or (string-rindex file #\/) -1)) (- (string-length file) 2)))
+         (out (option-ref options 'o (cond (compile? (string-append base ".o"))
+                                           (preprocess? (string-append base ".E"))
+                                           (else "a.out"))))
+         (multi-opt (lambda (option) (lambda (o) (and (eq? (car o) option) (cdr o)))))
+         (defines (reverse (filter-map (multi-opt 'define) options)))
+         (includes (reverse (filter-map (multi-opt 'include) options)))
+         (pretty-print/write (string->symbol (option-ref options 'write (if guile? "pretty-print" "write"))))
+         (pretty-print/write (if (eq? pretty-print/write 'pretty-print) pretty-print write)))
+    (when (getenv "MES_DEBUG")
+      (setenv "NYACC_TRACE" "yes")
+      (format (current-error-port) "options=~s\n" options)
+      (format (current-error-port) "output: ~a\n" out))
+    (if (and (pair? sources) (pair? objects)) (error "cannot mix source and object files:" files))
+    (with-output-to-file out
+      (lambda ()
+        (if (and (not compile?)
+                 (not preprocess?)) (set-port-encoding! (current-output-port) "ISO-8859-1"))
+        (cond ((pair? objects) (let ((objects (map read-object objects)))
+                                 (if compile? (objects->M1 objects)
+                                     (objects->elf objects))))
+              ((pair? asts) (let* ((infos (map main:ast->info asts))
+                                   (objects (map info->object infos)))
+                              (if compile? (objects->M1 objects)
+                                  (objects->elf objects))))
+              ((pair? sources) (if preprocess? (map (source->ast pretty-print/write defines includes) sources)
+                                   (let* ((infos (map (source->info defines includes) sources))
+                                          (objects (map info->object infos)))
+                                     (if compile? (objects->M1 objects)
+                                         (objects->elf objects))))))))))
+
+(main (command-line))
+'done
diff --git a/scripts/mescc.mes b/scripts/mescc.mes
deleted file mode 100755 (executable)
index 66ce1e5..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-#! /bin/sh
-# -*-scheme-*-
-MES=${MES-$(dirname $0)/mes}
-PREFIX=${PREFIX-@PREFIX@}
-MES_PREFIX=${MES_PREFIX-$PREFIX}
-if [ "$MES_PREFIX" = @PREFIX""@ ]
-then
-    MES_PREFIX=$(cd $(dirname $0)/.. && pwd)
-    export MES_PREFIX
-fi
-MES_MODULEDIR=${MES_MODULEDIR-$MES_PREFIX/"module"}
-export MES_MODULEDIR
-$MES -s $0 "$@"
-exit $?
-!#
-
-;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
-;;;
-;;; This file is part of Mes.
-;;;
-;;; 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.
-;;;
-;;; 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;; mescc.mes is a proof-of-concept simplistic C compiler and linker
-
-;;; Code:
-
-;;LALR
-;;(mes-use-module (language c compiler))
-;;Nyacc
-
-(mes-use-module (mes guile))
-(mes-use-module (mes getopt-long))
-(mes-use-module (mes pretty-print))
-(mes-use-module (language c99 info))
-(mes-use-module (language c99 compiler))
-(mes-use-module (mes display))
-(mes-use-module (mes elf))
-(mes-use-module (mes M1))
-(mes-use-module (srfi srfi-1))
-(mes-use-module (srfi srfi-26))
-
-(format (current-error-port) "mescc.mes...\n")
-
-(define %prefix (if (string-prefix? "@PREFIX" "@PREFIX@") (or (getenv "MES_PREFIX") "") "@PREFIX@"))
-
-(define (parse-opts args)
-  (let* ((option-spec
-          '((c (single-char #\c))
-            (define (single-char #\D) (value #t))
-            (E (single-char #\E))
-            (g (single-char #\g))
-            (help (single-char #\h))
-            (include (single-char #\I) (value #t))
-            (o (single-char #\o) (value #t))
-            (version (single-char #\V))))
-         (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)))
-    (or
-     (and version?
-          (format (current-output-port) "mescc.scm (mes) ~a\n" %version))
-     (and (or help? usage?)
-          (format (or (and usage? (current-error-port)) (current-output-port)) "\
-Usage: mescc.mes [OPTION]... FILE...
-  -c                 compile and assemble, but do not link
-  -D DEFINE          define DEFINE
-  -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
-  -o FILE            write output to FILE
-  -v, --version      display version and exit
-")
-          (exit (or (and usage? 2) 0)))
-     options)))
-
-(define (read-object file)
-  (let ((char (with-input-from-file file read-char)))
-    (if (eq? char #\#) (error "hex2 format not supported:" file)))
-  (with-input-from-file file read))
-
-(define (main:ast->info file)
-  (let ((ast (with-input-from-file file read)))
-    (c99-ast->info ast)))
-
-(define (source->ast defines includes)
-  (lambda (file)
-    (with-input-from-file file
-      (lambda ()
-        (write (c99-input->ast #:defines defines #:includes includes))))))
-
-(define (source->info defines includes)
-  (lambda (file)
-    (with-input-from-file file
-      (lambda ()
-        ((c99-input->info #:defines defines #:includes includes))))))
-
-(define (ast? o)
-  (or (string-suffix? ".E" o)
-      (string-suffix? ".mes-E" o)))
-
-(define (object? o)
-  (or (string-suffix? ".o" o)
-      (string-suffix? ".mes-o" o)))
-
-(define (main args)
-  (let* ((options (parse-opts args))
-         (files (option-ref options '() '()))
-         (file (car files))
-         (preprocess? (option-ref options 'E #f))
-         (compile? (option-ref options 'c #f))
-         (debug-info? (option-ref options 'g #f))
-         (asts (filter ast? files))
-         (objects (filter object? files))
-         (sources (filter (cut string-suffix? ".c" <>) files))
-         (base (substring file (1+ (or (string-rindex file #\/) -1)) (- (string-length file) 2)))
-         (out (option-ref options 'o (cond (compile? (string-append base ".o"))
-                                           (preprocess? (string-append base ".E"))
-                                           (else "a.out"))))
-         (multi-opt (lambda (option) (lambda (o) (and (eq? (car o) option) (cdr o)))))
-         (defines (reverse (filter-map (multi-opt 'define) options)))
-         (includes (reverse (filter-map (multi-opt 'include) options))))
-    (setenv "NYACC_TRACE" "yes")
-    (when (getenv "MES_DEBUG") (format (current-error-port) "options=~s\n" options)
-          (format (current-error-port) "output: ~a\n" out))
-    (if (and (pair? sources) (pair? objects)) (error "cannot mix source and object files:" files))
-    (with-output-to-port (open-output-file out (if (and (not compile?)
-                                                        (not preprocess?)) S_IRWXU))
-      (lambda ()
-        (cond ((pair? objects) (let ((objects (map read-object objects)))
-                                 (if compile? (objects->M1 objects)
-                                     (objects->elf objects))))
-              ((pair? asts) (let* ((infos (map main:ast->info asts))
-                                   (objects (map info->object infos)))
-                              (if compile? (objects->M1 objects)
-                                  (objects->elf objects))))
-              ((pair? sources) (if preprocess? (map (source->ast defines includes) sources)
-                                   (let* ((infos (map (source->info defines includes) sources))
-                                          (objects (map info->object infos)))
-                                     (if compile? (objects->M1 objects)
-                                         (objects->elf objects))))))))))
-
-(main (command-line))
-'done
diff --git a/test.sh b/test.sh
index f1abf12c43c9c520b04cea15e12c93cef5cedf44..2f6c1c765ed48e75bc62d71be02a90b46f542185 100755 (executable)
--- a/test.sh
+++ b/test.sh
@@ -26,7 +26,8 @@ rm -f "$t".mes-out
 
 M1=${M1-M1}
 HEX2=${HEX2-hex2}
-MESCC=${MESCC-guile/mescc.scm}
+MES=${MES-guile}
+MESCC=${MESCC-scripts/mescc}
 
 sh $MESCC -E -o scaffold/tests/$t.E scaffold/tests/$t.c
 sh $MESCC -c -o scaffold/tests/$t.M1 scaffold/tests/$t.E
index e9942df9d73d961b6f83a115a76760bf705dc6f6..eee59548c81a20aa3f5059adbef8f4af4c5100a6 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 $MES -s $0
 exit $?
 !#
index 753f4b6c72f44ea7cebd2a1b5bca670f708a1157..121540c6a86c94b512c3c79d7e977531a6e9c5de 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 export MES_BOOT=boot-02.scm
 $MES < $0
 exit $?
index 03029424a3c49d8baf1757ebe4477f5f69ac4b24..f3390ef87c2a7c345f44191daee2e48b8839f79d 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 7ec5a7064dd580c088e921ff16051d58026095b1..11dab07d307d59d3517bfb9d5a1ec6a76f493fbc 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 0676cc5523bd726beda571da015e67589c9eee47..dfc6b7ee127c79eb7f17afd58dd5fc30434e174b 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 88d49647ed84b78cf13dbf66ed07fb74eb2c06f9..a2d244d2e3ebb69fb9fb2ef69ed8e879a98ff530 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 $MES -s $0
 exit $?
 !#
index 0ddb05c311b7d2adaed8f5d0c3f299970c6295db..ea9521cfcf4b7a22678982d56428808c6309fc8a 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index ae835c5ef96e34ae2fe44a996023d543f20fe095..525c71940e4e988c9bb403ac816ee81ef7f0d087 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 8aed9e84672798e8224eed939fc2cd7f2ce95c0d..98699a294c909cc5ad802607de52152d4a990508 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 2037a3da902d63ac06f5ccb77cff3322793111c1..b2860c354aa66a3629e0b3e69da40007a1d08f7a 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 9a6309195baff6d7460f74568c0cd8da34e3ed13..8983036a7502b877f74fd7f861aa117c5bf257e9 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 73e7876c136db88881ee60a5bf32060b5305d9c2..d65129a0d211b471e8ea9f36c049efa2a76a0249 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index f66c8c671454f9ce53550a920774d6f336765245..cdcd40fa393e2e8fabaf08e40d7c9c805840b84a 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 4659dd78c47cccccd6d311b4406f0731e396ec15..7c1c0b4c438c0bc5bb60365cca2370e3fab039ab 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 03e5ff673ca9fcbb92e93a4422cc0e0c5c515038..9fcb2e1cb083a8de71e0c6a9c4332bc28215d5bd 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 597834186bd4471eee4f878af7bdab232a66863d..9753a5a1c70cc931b48f4f56edb067d9e3710c89 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-166000000}
 $MES -s $0
 exit $?
index 247354c06f125fc9598134063801ed887fe49046..5f844def2f4e9f0b14de4d744fd3949699a673bf 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 088f9faabcc77a0a2ee6a040ac2b3c0c88627a7f..61f0ff60ad309efb2dec3988a06834fa269f9da4 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-200000}
 $MES -s $0
 exit $?
index cdeb7c3fd9a91d4031c577eb6e0a6059198366b1..6904b8b5222da5f172256e527b6a0a27b6a95dd3 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 #paredit:||
index 1b470f8a86b7575253d4bdc3f69ca7ed906131ae..25dd9faf12b17e7c2932a8b337e99a9fcd25d69e 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/sh
 # -*-scheme-*-
 # ***REMOVE THIS BLOCK COMMENT INITIALLY***
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 $MES -s $0
 exit $?
 !#
index 9b21cb5b6dd933207746f2e20fa3d0a063abe50a..342fbb9655d33ee47a31e4eb2182428eda245e06 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 6a9277bbec2bf8eb70731e02d6c943408ef8a60b..bb4c2cc4785de625e7bcab9cafd9e167d4ca7db9 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 719adfec81ffbc7d05634a3f712994947fae8bde..451494e280b16c7fa3d023cc8d26f141fef98975 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index a78246aed5b9bc06d90906cba9c0ae9f1c796760..5fc9d6891b3a0a44256805be4303b70100583e8f 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index a26823e315f6cef1570e4427d1adefa634b63581..ef2ab712086e66cd48bbcead5391e01a17b7b280 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 496cf0ee50192977f0c5d2f8e44324cdeb18ae90..957e8d77996dd79b9dd9a0c1912da83a9a4c0f4d 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index a8ddce95c7e088031607b1effbd24104fb4404a5..70a900120d5cc0c7029a6899a70f67cdb9aa1e2d 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index c8ab06275c08524d75095bc812582f593c586b80..7b26f69f8247c4803390496a458bf18c13b38a77 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?
index 73ada674c1d17b48abfabcb7f8fab4adf41787bd..84539869edc26138c36af9c5c17e099c421cf748 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
+MES=${MES-$(dirname $0)/../src/mes.gcc}
 #export MES_ARENA=${MES_ARENA-40000}
 $MES -s $0
 exit $?