mescc: Add <include>/<kernel>/<arch> to include path.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 26 Jul 2019 20:44:04 +0000 (22:44 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 26 Jul 2019 20:44:04 +0000 (22:44 +0200)
* module/mescc/preprocess.scm (c99-input->full-ast): Add
<include>/<kernel>/<arch> to include path.
* module/mescc/compile.scm (c99-input->info): Pass arch.
* module/mescc/mescc.scm (mescc:preprocess): Likewise.
(c->info): Likewise.
(c->ast): Likewise.

module/mescc/compile.scm
module/mescc/mescc.scm
module/mescc/preprocess.scm

index 1faadfe181ffee5c3d6a3d2815d4535b3f6448be..ff912566fccba4d473c18e2ce88e517401ac0ff5 100644 (file)
@@ -49,8 +49,8 @@
   (if %reduced-register-count %reduced-register-count
    (length (append (.registers info) (.allocated info)))))
 
-(define* (c99-input->info info #:key (prefix "") (defines '()) (includes '()))
-  (let ((ast (c99-input->ast #:prefix prefix #:defines defines #:includes includes)))
+(define* (c99-input->info info #:key (prefix "") (defines '()) (includes '()) (arch ""))
+  (let ((ast (c99-input->ast #:prefix prefix #:defines defines #:includes includes #:arch arch)))
     (c99-ast->info info ast)))
 
 (define* (c99-ast->info info o)
index fbb28f07a2877f34437da0762c97bf79422c387c..a9eecc00546cca3d428ceb82cd89a84bdbab23b9 100644 (file)
          (includes (cons dir includes))
          (prefix (option-ref options 'prefix ""))
          (machine (option-ref options 'machine "32"))
-         (arch (if (equal? machine "32") "__i386__=1" "__x86_64__=1"))
+         (arch (arch-get options))
          (defines (cons (arch-get-define options) defines)))
     (with-output-to-file ast-file-name
-      (lambda _ (for-each (cut c->ast prefix defines includes pretty-print/write <>) files)))))
+      (lambda _ (for-each (cut c->ast prefix defines includes arch pretty-print/write <>) files)))))
 
-(define (c->ast prefix defines includes write file-name)
+(define (c->ast prefix defines includes arch write file-name)
   (with-input-from-file file-name
-    (cut write (c99-input->ast #:prefix prefix #:defines defines #:includes includes))))
+    (cut write (c99-input->ast #:prefix prefix #:defines defines #:includes includes #:arch arch))))
 
 (define (mescc:compile options)
   (let* ((files (option-ref options '() '("a.c")))
          (dir (dirname file-name))
          (includes (cons dir includes))
          (prefix (option-ref options 'prefix ""))
-         (defines (cons (arch-get-define options) defines)))
+         (defines (cons (arch-get-define options) defines))
+         (arch (arch-get options)))
     (with-input-from-file file-name
-      (cut c99-input->info (arch-get-info options) #:prefix prefix #:defines defines #:includes includes))))
+      (cut c99-input->info (arch-get-info options) #:prefix prefix #:defines defines #:includes includes #:arch arch))))
 
 (define (E->info options file-name)
   (let ((ast (with-input-from-file file-name read)))
index 59c6fd03220845c3024557411e425cb7efc86209..935e98e351d9397c11d0fa34b903f5de03771c36 100644 (file)
 
 (define mes? (pair? (current-module)))
 
-(define* (c99-input->full-ast #:key (prefix "") (defines '()) (includes '()))
-  (let ((sys-include (if (equal? prefix "") "include" (string-append prefix "/share/include"))))
+(define* (c99-input->full-ast #:key (prefix "") (defines '()) (includes '()) (arch ""))
+  (let* ((sys-include (if (equal? prefix "") "include"
+                          (string-append prefix "/include")))
+         (kernel "linux")
+         (kernel-include (string-append sys-include "/" kernel "/" arch)))
     (parse-c99
-     #:inc-dirs (append includes (cons* sys-include "include" "lib" (or (and=> (getenv "C_INCLUDE_PATH") (cut string-split <> #\:)) '())))
+     #:inc-dirs (append
+                 includes
+                 (cons* kernel-include
+                        sys-include
+                        (append (or (and=> (getenv "CPATH")
+                                           (cut string-split <> #\:)) '())
+                                (or (and=> (getenv "C_INCLUDE_PATH")
+                                           (cut string-split <> #\:)) '()))))
      #:cpp-defs `(
                   "NULL=0"
                   "__linux__=1"
                   ,@defines)
      #:mode 'code)))
 
-(define* (c99-input->ast #:key (prefix "") (defines '()) (includes '()))
+(define* (c99-input->ast #:key (prefix "") (defines '()) (includes '()) (arch ""))
   (stderr "parsing: input\n")
-  ((compose ast-strip-const ast-strip-comment) (c99-input->full-ast #:prefix prefix #:defines defines #:includes includes)))
+  ((compose ast-strip-const ast-strip-comment) (c99-input->full-ast #:prefix prefix #:defines defines #:includes includes #:arch arch)))
 
 (define (ast-strip-comment o)
   (pmatch o