|  | @@ -0,0 +1,65 @@
 | 
	
		
			
				|  |  | +;;; Stub that takes lisp source file as an argument and generates an executable
 | 
	
		
			
				|  |  | +;;; for it. Assumes entry point is main.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(ql:quickload "unix-opts")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun file-test (filename)
 | 
	
		
			
				|  |  | +  (if (probe-file filename) filename))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun get-fn-str (filename)
 | 
	
		
			
				|  |  | +  (if (stringp filename) filename))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(opts:define-opts
 | 
	
		
			
				|  |  | +  (:name :help
 | 
	
		
			
				|  |  | +   :description "Print this text"
 | 
	
		
			
				|  |  | +   :short #\h
 | 
	
		
			
				|  |  | +   :long "help")
 | 
	
		
			
				|  |  | +  (:name :output-file
 | 
	
		
			
				|  |  | +   :description "File to write executable to"
 | 
	
		
			
				|  |  | +   :short #\f
 | 
	
		
			
				|  |  | +   :long "output-file"
 | 
	
		
			
				|  |  | +   :arg-parser #'get-fn-str)
 | 
	
		
			
				|  |  | +  (:name :entry-point
 | 
	
		
			
				|  |  | +   :description "Entry point for saved binary"
 | 
	
		
			
				|  |  | +   :short #\e
 | 
	
		
			
				|  |  | +   :long "entry-point"
 | 
	
		
			
				|  |  | +   :arg-parser #'read-from-string)
 | 
	
		
			
				|  |  | +  (:name :input-file
 | 
	
		
			
				|  |  | +   :description "File to load and save"
 | 
	
		
			
				|  |  | +   :short #\l
 | 
	
		
			
				|  |  | +   :long "load"
 | 
	
		
			
				|  |  | +   :arg-parser #'file-test))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +;; See: https://github.com/libre-man/unix-opts/blob/master/example/example.lisp
 | 
	
		
			
				|  |  | +(defmacro when-option ((options opt) &body body)
 | 
	
		
			
				|  |  | +  `(let ((it (getf ,options ,opt)))
 | 
	
		
			
				|  |  | +     (when it
 | 
	
		
			
				|  |  | +       ,@body)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +;;(defun saver (filename entry-point)
 | 
	
		
			
				|  |  | +;;  (sb-ext:save-lisp-and-die filename :toplevel (function entry-point) :executable t :compression t))
 | 
	
		
			
				|  |  | +(defmacro saver (filename entry-point)
 | 
	
		
			
				|  |  | +  `(sb-ext:save-lisp-and-die ,filename :toplevel ,entry-point :executable t :compression t))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun display-help ()
 | 
	
		
			
				|  |  | +  (progn
 | 
	
		
			
				|  |  | +    (opts:describe
 | 
	
		
			
				|  |  | +     :prefix "save.bin - Load and then save lisp files. Script over sb-ext:save-lisp-and-die"
 | 
	
		
			
				|  |  | +     :usage-of "save.bin"
 | 
	
		
			
				|  |  | +     :args "[FREE-ARGS]")
 | 
	
		
			
				|  |  | +    (quit)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun builder ()
 | 
	
		
			
				|  |  | +  (if (uiop:command-line-arguments) (display-help))
 | 
	
		
			
				|  |  | +  ;;; Get and process args
 | 
	
		
			
				|  |  | +  (let ((matches (opts:get-opts)))
 | 
	
		
			
				|  |  | +    (progn
 | 
	
		
			
				|  |  | +      (format t "~a ~%" matches)
 | 
	
		
			
				|  |  | +      (when-option (matches :help)
 | 
	
		
			
				|  |  | +		   (display-help))
 | 
	
		
			
				|  |  | +      (if (second matches) (display-help))
 | 
	
		
			
				|  |  | +      ;; Load program
 | 
	
		
			
				|  |  | +      (load (getf matches :input-file))
 | 
	
		
			
				|  |  | +      (print "Loaded file")
 | 
	
		
			
				|  |  | +      ;; Save program
 | 
	
		
			
				|  |  | +      (saver (getf matches :output-file) (getf matches :entry-point)))))
 |