Skip to content

Commit

Permalink
0.7.12.52
Browse files Browse the repository at this point in the history
	contrib support for "standalone executables" using shell script
	magic.   See sb-executable:make-executable docstring for usage

	contrib/scriptoids was a three year old mail message describing
	a similar but slightly less cool way to do the same thing
  • Loading branch information
telent committed Feb 21, 2003
1 parent 6fa4fe7 commit 5ced999
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 253 deletions.
5 changes: 5 additions & 0 deletions contrib/sb-executable/Makefile
@@ -0,0 +1,5 @@
MODULE=sb-executable
include ../vanilla-module.mk

test::
true
50 changes: 50 additions & 0 deletions contrib/sb-executable/sb-executable.lisp
@@ -0,0 +1,50 @@
(cl:defpackage :sb-executable
(:use :cl :sb-ext :sb-alien)
(:export :make-executable :copy-stream)
;; (what else should we be exporting?)
)

(cl:in-package :sb-executable)

(defvar *stream-buffer-size* 8192)
(defun copy-stream (from to)
"Copy into TO from FROM until end of the input stream, in blocks of
*stream-buffer-size*. The streams should have the same element type."
(unless (subtypep (stream-element-type to) (stream-element-type from))
(error "Incompatible streams ~A and ~A." from to))
(let ((buf (make-array *stream-buffer-size*
:element-type (stream-element-type from))))
(loop
(let ((pos (read-sequence buf from)))
(when (zerop pos) (return))
(write-sequence buf to :end pos)))))

(defvar *exec-header*
"#!/bin/sh --
exec sbcl --noinform ~{~A ~}--eval \"(with-open-file (i \\\"$0\\\" :element-type '(unsigned-byte 8)) (read-line i) (read-line i) (load i) (quit))\" --end-toplevel-options ${1+\"$@\"}
")

(defun make-executable (output-file fasls
&key (runtime-flags '("--disable-debugger"
"--userinit /dev/null"
"--sysinit /dev/null")))
"Write an executable called OUTPUT-FILE which can be run from the shell, by 'linking' together code from FASLS. Actually works by concatenating them and prepending a #! header"
(with-open-file (out output-file :direction :output
:element-type '(unsigned-byte 8))
(write-sequence (map 'vector #'char-code
(format nil *exec-header* runtime-flags)) out)
(dolist (input-file (if (listp fasls) fasls (list fasls)))
(with-open-file (in (merge-pathnames input-file
(make-pathname :type "fasl"))
:element-type '(unsigned-byte 8))
(copy-stream in out))))
(let* ((out-name (namestring output-file))
(prot (elt (multiple-value-list (sb-unix:unix-stat out-name)) 3)))
(sb-unix::void-syscall ("chmod" c-string int)
out-name
(logior prot
(if (logand prot #o400) #o100)
(if (logand prot #o40) #o10)
(if (logand prot #o4) #o1)))))


252 changes: 0 additions & 252 deletions contrib/scriptoids

This file was deleted.

2 changes: 1 addition & 1 deletion version.lisp-expr
Expand Up @@ -18,4 +18,4 @@
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)

"0.7.12.51"
"0.7.12.52"

0 comments on commit 5ced999

Please sign in to comment.