build: Support Debian build, install.
[mes.git] / module / mescc / mescc.scm
index 3e5b997cecdc99efdce1b60a3f8bb991c3a39f38..b384b90e7042d32c4c72450b038acd58f842ce20 100644 (file)
     hex2-file-name))
 
 (define (mescc:link options)
-  (define (library->hex2 o)
-    (prefix-file options (string-append "lib/lib" o "-mes.o")))
   (let* ((files (option-ref options '() '("a.c")))
          (source-files (filter (disjoin .c? .E?) files))
          (S-files (filter .S? files))
                                  (list (infos->hex2 options hex2-file-name infos)))))
          (libraries (filter-map (multi-opt 'library) options))
          (libraries (if (pair? libraries) libraries '("c")))
-         (hex2-libraries (map library->hex2 libraries))
+         (hex2-libraries (map (cut find-library options ".o" <>) libraries))
          (hex2-files (append hex2-files hex2-libraries))
-         (S-files (append S-files (map (cut replace-suffix <> ".S") hex2-libraries)))
+         (S-files (append S-files (map (cut find-library options ".S" <>)  libraries)))
          (debug-info? (option-ref options 'debug-info #f))
          (S-files (cons (replace-suffix input-file-name ".S") S-files))
          (elf-footer (and debug-info?
          (M1 (or (getenv "M1") "M1"))
          (command `(,M1
                     "--LittleEndian"
-                    "--Architecture=1"
-                    "-f" ,(prefix-file options "stage0/x86.M1")
+                    "--Architecture" "1"
+                    "-f" ,(arch-find options "x86.M1")
                     ,@(append-map (cut list "-f" <>) M1-files)
                     "-o" ,hex2-file-name)))
     (when verbose?
       (stderr "~a\n" (string-join command)))
-    (and (zero? (apply system* command))
+    (and (zero? (apply assert-system* command))
          hex2-file-name)))
 
 (define* (hex2->elf options hex2-files #:key elf-footer)
          (elf-file-name (cond ((option-ref options 'output #f))
                               (else (replace-suffix input-file-name ""))))
          (verbose? (option-ref options 'verbose #f))
-         (elf-footer (or elf-footer (prefix-file options "stage0/elf32-footer-single-main.hex2")))
+         (elf-footer (or elf-footer (arch-find options "elf32-footer-single-main.hex2")))
          (hex2 (or (getenv "HEX2") "hex2"))
          (command `(,hex2
                     "--LittleEndian"
-                    "--Architecture=1"
-                    "--BaseAddress=0x1000000"
-                    "-f" ,(prefix-file options "stage0/elf32-header.hex2")
-                    "-f" ,(prefix-file options "lib/crt1.o")
+                    "--Architecture" "1"
+                    "--BaseAddress" "0x1000000"
+                    "-f" ,(arch-find options "elf32-header.hex2")
+                    "-f" ,(arch-find options "crt1.o")
                     ,@(append-map (cut list "-f" <>) hex2-files)
                     "-f" ,elf-footer
                     "--exec_enable"
                     "-o" ,elf-file-name)))
     (when verbose?
-      (stderr "command=~s\n" command)
-      (format (current-error-port) "~a\n" (string-join command)))
-    (and (zero? (apply system* command))
+      (stderr "~a\n" (string-join command)))
+    (and (zero? (apply assert-system* command))
          elf-file-name)))
 
 (define (M1->blood-elf options M1-files)
          (verbose? (option-ref options 'verbose #f))
          (blood-elf (or (getenv "BLOOD_ELF") "blood-elf"))
          (command `(,blood-elf
-                      "-f" ,(prefix-file options "stage0/x86.M1")
+                      "-f" ,(arch-find options "x86.M1")
                       ,@(append-map (cut list "-f" <>) M1-files)
                       "-o" ,M1-blood-elf-footer)))
     (when verbose?
         (format (current-error-port) "~a\n" (string-join command)))
-    (and (zero? (apply system* command))
+    (and (zero? (apply assert-system* command))
          (let* ((options (acons 'compile #t options)) ; ugh
                 (options (acons 'output blood-elf-footer options)))
            (M1->hex2 options (list M1-blood-elf-footer))))))
          (base (if (pair? (cdr parts)) (drop-right parts 1))))
     (string-append (string-join base ".") suffix)))
 
+(define (find-library options ext o)
+  (arch-find options (string-append "lib" o ext)))
+
+(define* (arch-find options file-name)
+  (let* ((path (cons (prefix-file options "lib")
+                     (filter-map (multi-opt 'library-dir) options)))
+         (arch-file-name (string-append "x86-mes/" file-name))
+         (verbose? (option-ref options 'verbose #f)))
+    (when verbose?
+      (stderr "arch-find=~s\n" arch-file-name)
+      (stderr "     path=~s\n" path)
+      (stderr "  => ~s\n" (search-path path arch-file-name)))
+    (search-path path arch-file-name)))
+
 (define (prefix-file options file-name)
   (let ((prefix (option-ref options 'prefix "")))
     (define (prefix-file o)
       (if (string-null? prefix) o (string-append prefix "/" o)))
     (prefix-file file-name)))
 
+(define (assert-system* . args)
+  (let ((status (apply system* args)))
+    (when (not (zero? status))
+      (stderr "mescc: failed: ~a\n" (string-join args))
+      (exit status))
+    status))
+
 (define (multi-opt option-name) (lambda (o) (and (eq? (car o) option-name) (cdr o))))
 
 (define (.c? o) (or (string-suffix? ".c" o)