#! /usr/bin/csi -script
;;;; extend-csi - Recompile `csi' with added library units - felix


(define home "")
(define cc "gcc")
(define csi-extra-units #<<EOF
-prelude "(declare (uses regex unistd))"
EOF
)
(define csi-compile-options "-optimize-level 1 -quiet -postlude \"(##csi#run)\"")

(define (usage)
  (display #<<EOF
Usage: extend-csi UNITNAME | OPTION ...

  -output-file FILENAME         generate interpreter with this name
                                (defaults to 'csi-2')

EOF
) 
  (exit 64) )

(define (invoke fstr . args)
  (let ([str (apply sprintf fstr args)])
    (print str)
    (unless (zero? (system str)) (error "shell command failed")) ) )

(let ([out "csi-2"]
      [units '()] )
  (let loop ([args (command-line-arguments)])
    (cond [(null? args)
	   (when (null? units) (usage))
	   (invoke "/usr/bin/chicken ~A/src/csi.scm ~A -prologue ~A/src/build.scm ~A -prelude \"(declare ~S)\""
		   home csi-compile-options home csi-extra-units
		   (cons 'uses (reverse (map string->symbol units))) )
	   (let ([objs (string-concatenate (map (lambda (u) (string-append u ".o")) units) " ")])
	     (invoke "~A out.c ~A `chicken-config -cflags -libs -extra-libs` -o ~A" 
		     cc objs out) 
	     (invoke "rm -f out.c") ) ]
	  [(string=? "-output-file" (car args))
	   (unless (pair? (cdr args)) (usage))
	   (set! out (cadr args))
	   (loop (cddr args)) ]
	  [else
	   (set! units (cons (car args) units))
	   (loop (cdr args)) ] ) ) )
