build: Cater for ARM.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 22 May 2019 15:55:20 +0000 (17:55 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 22 May 2019 15:55:20 +0000 (17:55 +0200)
* configure: Cater for ARM.
* configure.sh: Likewise
* build-aux/GNUmakefile.in: Likewise.
* build-aux/bootstrap.sh.in: Likewise.
* module/mescc.scm (parse-opts): Likewise.
* src/mes.c (mes_environment): Likewise.
* build-aux/build.sh.in: Likewise.
* build-aux/config.sh Likewise.
* build-aux/install.sh.in: Likewise.
* module/mes/guile.scm: Likewise.
* scripts/mescc.scm.in: Likewise.
* module/mescc/mescc.scm (arch-get): New function.
(arch-get-info): New function.
(arch-get-define): New function.
(arch-get-m1-options): New function.
(arch-get-Architecture): New function.
(mescc:preprocess c->info, E->info, M1->hex2, hex2->elf,
M1->blood-elf, arch-find): Use them.

build-aux/GNUmakefile.in
build-aux/build-scaffold.sh
configure
configure.sh
module/mes/guile.scm
module/mescc.scm
module/mescc/mescc.scm
scripts/mescc.scm.in
src/mes.c

index 1cfad1c634f9a97c376c765850307a711366b92a..af2909036adb028b704a46e85f60cb6b0e241b1c 100644 (file)
@@ -1,5 +1,5 @@
 # GNU Mes --- Maxwell Equations of Software
-# Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+# Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 #
 # This file is part of GNU Mes.
 #
@@ -28,8 +28,20 @@ cleaning-p:=$(filter clean%, $(MAKECMDGOALS))$(filter %clean, $(MAKECMDGOALS))
 
 ifndef cleaning-p
 include .config.make
+ifneq ($(prefix),)
+prefix-arg=--prefix=$(prefix)
+endif
+ifneq ($(build),)
+build-arg=--build=$(build)
+endif
+ifneq ($(host),)
+host-arg=--host=$(host)
+endif
+ifeq ($(mes_libc),system)
+--with-system-libc=system
+endif
 .config.make:
-       ${srcdir}/configure --prefix=$(prefix)
+       ${srcdir}/configure $(prefix_arg) $(host-arg) $(build-arg) $(with-system-libc)
 endif
 
 PHONY_TARGETS:=\
index 0c8897a1644ca92adecc53d4fd32059c985eac43..d42513815176dae649efce1bb0cf906b479b1164 100755 (executable)
@@ -36,6 +36,8 @@ if $courageous; then
 fi
 
 case "$mes_cpu" in
+    arm)
+        stage0_cpu=armv7l;;
     x86_64)
         stage0_cpu=amd64;;
     x86)
index 85106f38b0cd93fad2dfd90910cdbb9b14703b0b..9157e5ddab8303eff384fdf6ee5d880907aae0d9 100755 (executable)
--- a/configure
+++ b/configure
@@ -4,7 +4,7 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
 !#
 
 ;;; GNU Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; configure: This file is part of GNU Mes.
 ;;;
@@ -370,8 +370,7 @@ Some influential environment variables:
 (define (main args)
   (let* ((options (parse-opts args))
          (build-type (option-ref options 'build %host-type))
-
-         (host-type (option-ref options 'host %host-type))(prefix "/usr/local")
+         (host-type (option-ref options 'host build-type))
 
          (prefix "/usr/local")
          (prefix (option-ref options 'prefix prefix))
@@ -497,8 +496,9 @@ Some influential environment variables:
            (build-type (or (and cc (gulp-pipe* cc "-dumpmachine")) build-type))
            (build-type-list (string-split build-type #\-))
            (mes-cpu (car build-type-list))
-           (mes-cpu (if (member mes-cpu '("i386" "i486" "i586" "i686")) "x86"
-                        mes-cpu))
+           (mes-cpu (cond ((member mes-cpu '("i386" "i486" "i586" "i686")) "x86")
+                          ((member mes-cpu '("arm" "armv4" "armv7l")) "arm")
+                          (else mes-cpu)))
            (mes-bits (if (member mes-cpu '("x86_64")) "64"
                          "32"))
            (mes-libc (if system-libc? "system" "mes"))
@@ -525,8 +525,12 @@ Some influential environment variables:
                                  line pairs))
                   (loop (read-line in 'concat))))))))
 
-      (when (and (not (member mes-system '("x86-linux-mes" "x86_64-linux-mes"))) (not with-courage?))
-        (stderr "platform not supported: ~a, try --with-courage\n" mes-system)
+      (when (and (not (member mes-system '("arm-linux-mes"
+                                           "x86-linux-mes"
+                                           "x86_64-linux-mes")))
+                 (not with-courage?))
+        (stderr "platform not supported: ~a
+See \"Porting GNU Mes\" in the manual, or try --with-courage\n" mes-system)
         (exit 1))
       (when (pair? missing)
         (stderr "\nMissing dependencies: ~a\n" (string-join (map dependency-name missing)))
index 22396cebd8d5cf6d443a71be4e0b82a0f5667cf7..26f233e14688ff3dbbb80d5af6a9bfaecd7a3e71 100755 (executable)
@@ -54,6 +54,29 @@ else
     prefix=${prefix-/usr/local}
 fi
 
+# parse --build=BUILD
+p=${cmdline/ --build=/ -build=}
+if [ "$p" != "$cmdline" ]; then
+    p=${p##* -build=}
+    p=${p% *}
+    p=${p% -*}
+    build=${p-$build}
+else
+    build=$build
+fi
+
+# parse --host=HOST
+p=${cmdline/ --host=/ -host=}
+if [ "$p" != "$cmdline" ]; then
+    p=${p##* -host=}
+    p=${p% *}
+    p=${p% -*}
+    host=${p-$build}
+
+else
+    host=${host-$build}
+fi
+
 # parse --program-prefix=
 p=${cmdline/ --program-prefix=/ -program-prefix=}
 if test "$p" != "$cmdline"; then
@@ -180,6 +203,10 @@ if test "$mes_cpu" = i386\
         || test "$mes_cpu" = i686; then
     mes_cpu=x86
 fi
+if test "$mes_cpu" = armv4\
+        || test "$arch" = armv7l; then
+    mes_cpu=arm
+fi
 
 case "$host" in
     *linux-gnu|*linux)
index 26fc2cc7d0be1a7866383dc8c5b3c4191109c487..12307dcb37054e2b39837e51fc39ce2b112f5bb5 100644 (file)
@@ -32,6 +32,8 @@
             <cell:symbol>
             <cell:vector>
 
+            %arch
+            %compiler
             append2
             core:apply
             core:car
   ;;#:re-export (open-input-file open-input-string with-input-from-string)
   )
 
+(cond-expand
+ (guile-2)
+ (guile
+  (define %host-type (string-append (utsname:machine (uname)) "linux-gnu")))
+ (else))
+
 (cond-expand
  (guile
   (define pmatch-car car)
@@ -84,6 +92,8 @@
   (define <cell:string> 10)
   (define <cell:symbol> 11)
   (define <cell:vector> 15)
+  (define %arch (car (string-split %host-type #\-)))
+  (define %compiler "gnuc")
 
   (define %compiler "gnuc")
   (define keyword->string (compose symbol->string keyword->symbol))
index 1c13c82ed282b43a5fba9d18fcc877ee4f4778e1..ec8ececc48e37589f2b350e8bb78d74ec539b5c7 100644 (file)
@@ -1,5 +1,5 @@
 ;;; GNU Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Mes.
 ;;;
@@ -19,6 +19,7 @@
 (define-module (mescc)
   #:use-module (srfi srfi-1)
   #:use-module (ice-9 getopt-long)
+  #:use-module (mes guile)
   #:use-module (mes misc)
   #:use-module (mescc mescc)
   #:export (mescc:main))
@@ -35,6 +36,7 @@
  (guile
   (define-macro (mes-use-module . rest) #t)))
 
+(define %host-arch (or (getenv "%arch") %arch))
 (define %prefix (getenv "%prefix"))
 (define %version (getenv "%version"))
 
@@ -53,6 +55,7 @@
 (define (parse-opts args)
   (let* ((option-spec
           '((align)
+            (arch (value #t))
             (assemble (single-char #\c))
             (base-address (value #t))
             (compile (single-char #\S))
             (language (single-char #\x) (value #t))))
          (options (getopt-long args option-spec))
          (help? (option-ref options 'help #f))
-         (machine (option-ref options 'machine "32"))
          (files (option-ref options '() '()))
-         (usage? (and (not help?) (null? files)))
-         (version? (option-ref options 'version #f)))
-    (cond ((option-ref options 'dumpmachine #f)
-           (cond ((equal? machine "32") (display "x86-linux-mes\n"))
-                 (else (display "x86_64-linux-mes\n")))
-           (exit 0))
-          (version? (format #t "mescc (GNU Mes) ~a\n" %version) (exit 0))
+         (dumpmachine? (option-ref options 'dumpmachine #f))
+         (version? (option-ref options 'version #f))
+         (usage? (and (not dumpmachine?) (not help?) (not version?) (null? files))))
+    (cond (version? (format #t "mescc (GNU Mes) ~a\n" %version) (exit 0))
           (else
            (and (or help? usage?)
                 (format (or (and usage? (current-error-port)) (current-output-port)) "\
 Usage: mescc [OPTION]... FILE...
   --align             align globals
+  --arch=ARCH         compile for ARCH [~a]
   -dumpmachine        display the compiler's target machine
   --base-address=ADRRESS
                       use BaseAddress ADDRESS [0x1000000]
@@ -128,7 +128,7 @@ Environment variables:
 Report bugs to: bug-mes@gnu.org
 GNU Mes home page: <http://gnu.org/software/mes/>
 General help using GNU software: <http://gnu.org/gethelp/>
-")
+" %host-arch)
                 (exit (or (and usage? 2) 0)))
            options))))
 
@@ -147,6 +147,9 @@ General help using GNU software: <http://gnu.org/gethelp/>
          (args (append-map unclump-single args))
          (options (parse-opts args))
          (options (acons 'prefix %prefix options))
+         (arch (option-ref options 'arch %host-arch))
+         (options (if arch (acons 'arch arch options) options))
+         (dumpmachine? (option-ref options 'dumpmachine #f))
          (preprocess? (option-ref options 'preprocess #f))
          (compile? (option-ref options 'compile #f))
          (assemble? (option-ref options 'assemble #f))
@@ -154,7 +157,8 @@ General help using GNU software: <http://gnu.org/gethelp/>
     (when verbose?
       (setenv "NYACC_TRACE" "yes")
       (format (current-error-port) "options=~s\n" options))
-    (cond (preprocess? (mescc:preprocess options))
+    (cond (dumpmachine? (display (mescc:get-host options)))
+          (preprocess? (mescc:preprocess options))
           (compile? (mescc:compile options))
           (assemble? (mescc:assemble options))
           (else (mescc:link options)))))
index 333b05b08022d9b860e8f77187458eeea9dc1636..70adf7482495fe286b2dbf406682fda925f445a2 100644 (file)
@@ -1,5 +1,5 @@
 ;;; GNU Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Mes.
 ;;;
@@ -21,7 +21,6 @@
   #:use-module (srfi srfi-26)
   #:use-module (ice-9 pretty-print)
   #:use-module (ice-9 getopt-long)
-  #:use-module (mes guile)
   #:use-module (mes misc)
 
   #:use-module (mescc i386 info)
@@ -30,6 +29,7 @@
   #:use-module (mescc compile)
   #:use-module (mescc M1)
   #:export (mescc:preprocess
+            mescc:get-host
             mescc:compile
             mescc:assemble
             mescc:link))
@@ -54,7 +54,7 @@
          (prefix (option-ref options 'prefix ""))
          (machine (option-ref options 'machine "32"))
          (arch (if (equal? machine "32") "__i386__=1" "__x86_64__=1"))
-         (defines (cons arch defines)))
+         (defines (cons (arch-get-define options) defines)))
     (with-output-to-file ast-file-name
       (lambda _ (for-each (cut c->ast prefix defines includes write <>) files)))))
 
          (dir (dirname file-name))
          (includes (cons dir includes))
          (prefix (option-ref options 'prefix ""))
-         (machine (option-ref options 'machine "32"))
-         (info (if (equal? machine "32") (x86-info)  (x86_64-info)))
-         (arch (if (equal? machine "32") "__i386__=1" "__x86_64__=1"))
-         (defines (cons arch defines)))
+         (defines (cons (arch-get-define options) defines)))
     (with-input-from-file file-name
-      (cut c99-input->info info #:prefix prefix #:defines defines #:includes includes))))
+      (cut c99-input->info (arch-get-info options) #:prefix prefix #:defines defines #:includes includes))))
 
 (define (E->info options file-name)
-  (let* ((ast (with-input-from-file file-name read))
-         (machine (option-ref options 'machine "32"))
-         (info (if (equal? machine "32") (x86-info)  (x86_64-info))))
-    (c99-ast->info info ast)))
+  (let ((ast (with-input-from-file file-name read)))
+    (c99-ast->info (arch-get-info options) ast)))
 
 (define (mescc:assemble options)
   (let* ((files (option-ref options '() '("a.c")))
                                ((option-ref options 'assemble #f)
                                 (replace-suffix input-file-name ".o"))
                                (else (replace-suffix M1-file-name ".o"))))
-         (machine (option-ref options 'machine "32"))
-         (architecture (cond
-                        ((equal? machine "32") "x86")
-                        ((equal? machine "64") "amd64")
-                        (else "1")))
-         (m1-macros (cond
-                     ((equal? machine "32") "x86.M1")
-                     ((equal? machine "64") "x86_64.M1")
-                     (else "x86.M1")))
          (verbose? (option-ref options 'verbose #f))
          (M1 (or (getenv "M1") "M1"))
          (command `(,M1
                     "--LittleEndian"
-                    "--architecture" ,architecture
-                    "-f" ,(arch-find options m1-macros)
+                    "--architecture" ,(arch-get-architecture options)
+                    "-f" ,(arch-find options (arch-get-m1-macros options))
                     ,@(append-map (cut list "-f" <>) M1-files)
                     "-o" ,hex2-file-name)))
     (when verbose?
                               (else "a.out")))
          (verbose? (option-ref options 'verbose #f))
          (hex2 (or (getenv "HEX2") "hex2"))
-         (machine (option-ref options 'machine "32"))
-         (architecture (cond
-                         ((equal? machine "32") "x86")
-                         ((equal? machine "64") "amd64")
-                         (else "1")))
          (base-address (option-ref options 'base-address "0x1000000"))
+         (machine (arch-get-machine options))
          (elf-footer (or elf-footer
                          (arch-find options (string-append
                                              "elf" machine "-footer-single-main.hex2"))))
                               `("-f" ,(arch-find options "crt1.o"))))
          (command `(,hex2
                     "--LittleEndian"
-                    "--architecture" ,architecture
+                    "--architecture" ,(arch-get-architecture options)
                     "--BaseAddress" ,base-address
                     "-f" ,(arch-find options (string-append "elf" machine "-header.hex2"))
                     ,@start-files
          (blood-elf-footer (string-append hex2-file-name ".blood-elf"))
          (verbose? (option-ref options 'verbose #f))
          (blood-elf (or (getenv "BLOOD_ELF") "blood-elf"))
-         (machine (option-ref options 'machine "32"))
-         (m1-macros (cond
-                     ((equal? machine "32") "x86.M1")
-                     ((equal? machine "64") "x86_64.M1")
-                     (else "x86.M1")))
          (command `(,blood-elf
-                      "-f" ,(arch-find options m1-macros)
+                      "-f" ,(arch-find options (arch-get-m1-macros options))
                       ,@(append-map (cut list "-f" <>) M1-files)
                       "-o" ,M1-blood-elf-footer)))
     (when verbose?
   (let* ((parts (string-split file-name #\.))
          (base (if (pair? (cdr parts)) (drop-right parts 1)))
          (old-suffix (last parts))
-         (program-prefix (cond ((string-prefix? "x86-mes-" old-suffix) ".x86-mes-")
+         (program-prefix (cond ((string-prefix? "arm-mes-" old-suffix) ".arm-mes-")
+                               ((string-prefix? "x86-mes-" old-suffix) ".x86-mes-")
                                ((string-prefix? "x86_64-mes-" old-suffix) ".x86_64-mes-")
                                (else "."))))
     (if (string-null? suffix)
 (define* (arch-find options file-name)
   (let* ((srcdest (or (getenv "srcdest") ""))
          (srcdir-lib (string-append srcdest "lib"))
-         (machine (option-ref options 'machine "32"))
-         (arch (cond
-                ((equal? machine "32") "x86-mes")
-                ((equal? machine "64") "x86_64-mes")
-                (else "x86-mes")))
+         (arch (string-append (arch-get options) "-mes"))
          (path (cons* "."
                       srcdir-lib
                       (prefix-file options "lib")
       (exit (status:exit-val status)))
     status))
 
+(define (arch-get options)
+  (let* ((machine (option-ref options 'machine #f))
+         (arch (option-ref options 'arch #f)))
+    (if machine (cond ((member arch '("x86" "x86_64")) (cond ((equal? machine "32") "x86")
+                                                             ((equal? machine "64") "x86_64")))
+                      ((equal? arch "arm") (cond ((equal? machine "32") "arm"))))
+        arch)))
+
+(define (mescc:get-host options)
+  (let ((cpu (arch-get options))
+        (kernel "linux"))
+    (string-join (list cpu kernel "mes") "-")))
+
+(define (arch-get-info options)
+  (let ((arch (arch-get options)))
+    (cond ((equal? arch "arm") (armv4-info))
+          ((equal? arch "x86") (x86-info))
+          ((equal? arch "x86_64") (x86_64-info)))))
+
+(define (arch-get-define options)
+  (let ((arch (arch-get options)))
+    (cond ((equal? arch "arm") "__arm__=1")
+          ((equal? arch "x86") "__i386__=1")
+          ((equal? arch "x86_64") "__x86_64__=1"))))
+
+(define (arch-get-machine options)
+  (let* ((machine (option-ref options 'machine #f))
+         (arch (option-ref options 'arch #f)))
+    (or machine
+        (if (member arch '("x86_64")) "64"
+            "32"))))
+
+(define (arch-get-m1-macros options)
+  (let ((arch (arch-get options)))
+    (cond ((equal? arch "arm") "arm.M1")
+          ((equal? arch "x86") "x86.M1")
+          ((equal? arch "x86_64") "x86_64.M1"))))
+
+(define (arch-get-architecture options)
+  (let ((arch (arch-get options)))
+    (cond ((equal? arch "arm") "armv7l")
+          ((equal? arch "x86") "x86")
+          ((equal? arch "x86_64") "amd64"))))
+
 (define (multi-opt option-name) (lambda (o) (and (eq? (car o) option-name) (cdr o))))
 
 (define (.c? o) (or (string-suffix? ".c" o)
                     (string-suffix? ".M2" o)))
 (define (.E? o) (or (string-suffix? ".E" o)
                     (string-suffix? ".mes-E" o)
+                    (string-suffix? ".arm-mes-E" o)
                     (string-suffix? ".x86-mes-E" o)
                     (string-suffix? ".x86_64-mes-E" o)))
 (define (.S? o) (or (string-suffix? ".S" o)
                     (string-suffix? ".mes-S" o)
+                    (string-suffix? ".arm-mes-S" o)
                     (string-suffix? ".x86-mes-S" o)
                     (string-suffix? ".x86_64-mes-S" o)
                     (string-suffix? "S" o)
                     (string-suffix? ".M1" o)))
 (define (.o? o) (or (string-suffix? ".o" o)
                     (string-suffix? ".mes-o" o)
+                    (string-suffix? ".arm-mes-o" o)
                     (string-suffix? ".x86-mes-o" o)
                     (string-suffix? ".x86_64-mes-o" o)
                     (string-suffix? ".hex2" o)))
index 6a6a3372425ffd7de967c3742a49f7aaba9896a9..456528428df85f7cbbbc91586c69d15da397b9be 100644 (file)
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
 
+(cond-expand
+ (mes)
+ (guile
+  (define %arch (car (string-split %host-type #\-)))))
+
 (setenv "%prefix" (or (getenv "MES_PREFIX")
                       (if (string-prefix? "@prefix" "@prefix@")
                           ""
@@ -27,6 +32,9 @@
 (setenv "%version" (if (string-prefix? "@VERSION" "@VERSION@") "git"
                        "@VERSION@"))
 
+(setenv "%arch" (if (string-prefix? "@mes_cpu" "@mes_cpu@") %arch
+                       "@mes_cpu@"))
+
 (cond-expand
  (mes
   (mes-use-module (mescc))
index b676ad757a4ae6596ea903ee9e9f566cecf66157..91e958d87fc73fd348836667b018c13ae6ba7e73 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -1419,9 +1419,15 @@ mes_environment (int argc, char *argv[])
 #endif
   a = acons (cell_symbol_compiler, MAKE_STRING0 (compiler), a);
 
-  char *arch = "x86";
-#if __x86_64__
+  char *arch;
+#if __i386__
+  arch = "x86";
+#elif __arm__
+  arch = "arm";
+#elif __x86_64__
   arch = "x86_64";
+#else
+#error arch not supported
 #endif
   a = acons (cell_symbol_arch, MAKE_STRING0 (arch), a);