roswell.roswell/lisp/build-ros.lisp

43 lines
1.7 KiB
Common Lisp

(defpackage :roswell.build.ros
(:use :cl))
(in-package :roswell.build.ros)
(defun parse-argv (argv)
(let* ((header "exec ros")
(hl (length header)))
(and (equal header (subseq argv 0 (length header)))
(loop for last = nil then c
for i from 0
for c across argv
when (and (equal #\- last)
(equal #\- c))
do (return (subseq argv hl (1- i)))))))
(defun ros (&rest argv)
(let (opts
impl-argv
dump-argv)
(dolist (l (rest argv))
(if (find #\= l)
(push l impl-argv)
(push l dump-argv)))
(setf impl-argv (nreverse impl-argv)
dump-argv (nreverse dump-argv))
(with-open-file (in (first argv))
(loop repeat 4
for line = (read-line in)
when (ignore-errors (string= line "exec" :end1 4))
do (setf opts (parse-argv line))))
(let ((impl (or (ros:opt "*lisp")
(ros:opt "default.lisp"))))
(roswell:roswell `(,@(when (roswell:verbose) '("-v"))
,@impl-argv
,@(cond ((find impl '("sbcl" "sbcl-bin" "sbcl32" "sbcl-head") :test 'equal)
(append (if (ros:opt "dynamic-space-size")
(list (format nil "dynamic-space-size=~A" (ros:opt "dynamic-space-size"))))
(if (ros:opt "control-stack-size")
(list (format nil "control-stack-size=~A" (ros:opt "control-stack-size")))))))
,opts "-L" ,impl
"dump" ,@dump-argv "executable" ,(first argv))
:interactive nil))))