Commits (3)
TODO for cl-launch as of 4.1.3
TODO for cl-launch as of 4.1.4
* When resuming from an image then dumping another, the INCLUDE_PATH
becomes a very bad variable to look for the image.
......@@ -75,3 +75,37 @@ TODO for cl-launch as of 4.1.3
and a series of (declaim (optimize (speed 0) (size 0) (debug 0)
(compilation-speed 3))) and such to speed up the cl-launch
* Fix debian packaging.
** Report by Tobias Frost <>
I see that your package has several DDs a uploaders. I'm wondering why
they don't upload it for you, if they co-maintain the package?
Did you file an RFS-Bug?
In d/changelog, there are many versions that where never in Debian,
also it reads more like an upstream changelog than an Debian changelog.
On the other side, changes to debian/* are not explained. (e.g the fact
and the resons why to update all the versions of the dependencies in
d/control). Refer to the Policy about d/changelog.
d/cl-launch.1 The manpage says "generated with Ronn/v0.7.3".
If it is autogenerated, it needs to be done at build time.
About your layout: It is not recommended to have the debian directory
in your master branch, as you cannot independently work on those.
Think of NMUs and how you would be able to integrate such changes in
your repository? (I suggest to put the debian packaging into its own
This is also the point where I point people to, if they are upstream and
maintainer at the same time.
d/rules could be transformed to short debhelper format.
(note: did not check alls details in d/copyright, so just a few things
I saw at first glance)
- The bugroff license text is missing.
- Copyright years are not up to date
......@@ -14,7 +14,7 @@ all: source
@echo "Building Lisp source code for cl-launch in current directory"
@${CL_LAUNCH} --include ${PWD} -B install_path > /dev/null
@${CL_LAUNCH} --include "$${PWD}" -B install_path > /dev/null
install: install_binary install_source install_system install_cl
......@@ -22,26 +22,26 @@ install_binary: install_binary_standalone
@echo "Installing Lisp source code for cl-launch in ${INSTALL_SOURCE}"
@mkdir -p ${INSTALL_SOURCE}/
@${CL_LAUNCH} --include ${INSTALL_SOURCE} -B install_path > /dev/null
@if [ ! $${PWD} = ${INSTALL_SOURCE} ] ; then \
@cp dispatch.lisp ${INSTALL_SOURCE}/ ; \
@mkdir -p "${INSTALL_SOURCE}/"
@${CL_LAUNCH} --include "${INSTALL_SOURCE}" -B install_path > /dev/null
@if [ ! "$${PWD}" = "${INSTALL_SOURCE}" ] ; then \
@cp dispatch.lisp "${INSTALL_SOURCE}/" ; \
install_system: install_source
@echo "Linking .asd file for cl-launch into ${INSTALL_SYSTEMS}/"
@mkdir -p ${INSTALL_SYSTEMS}/
@if [ `dirname ${INSTALL_SYSTEMS}`/source/cl-launch = ${INSTALL_SOURCE} ] ; then \
ln -sf ../source/cl-launch/cl-launch.asd ${INSTALL_SYSTEMS}/ ; \
@mkdir -p "${INSTALL_SYSTEMS}/"
@if [ "`dirname '${INSTALL_SYSTEMS}'`/source/cl-launch" = "${INSTALL_SOURCE}" ] ; then \
ln -sf ../source/cl-launch/cl-launch.asd "${INSTALL_SYSTEMS}/" ; \
else \
ln -sf ${INSTALL_SOURCE}/cl-launch.asd ${INSTALL_SYSTEMS}/ ; \
ln -sf "${INSTALL_SOURCE}/cl-launch.asd" "${INSTALL_SYSTEMS}/" ; \
@echo "Installing a standalone binary of cl-launch in ${INSTALL_BIN}/"
@sh ./ --no-include --no-rc \
--lisp '$(LISPS)' \
--output ${INSTALL_BIN}/cl-launch -B install_bin > /dev/null
--output '${INSTALL_BIN}/cl-launch' -B install_bin > /dev/null
install-with-include: install_binary_with_include install_source install_system
......@@ -79,9 +79,9 @@ reinstall:
# This might fit your system, installing from same directory
-git clean -xfd
make install_source install_binary_standalone INSTALL_SOURCE=$$PWD INSTALL_BIN=$$PWD
make install_source install_binary_standalone INSTALL_SOURCE="$${PWD}" INSTALL_BIN="$${PWD}"
./ -l "${LISPS}" -B tests
#| -- shell wrapper for Common Lisp -*- Lisp -*-
license_information () {
# Please send your improvements to the author:
......@@ -196,7 +196,7 @@ Recent Linux kernels support a script interpreter itself being a script;
BSD kernels don't and require a small C program cl-shim to be compiled and
installed as /usr/bin/cl to use cl-launch this way.
To work properly, \`cl-launch\` 4.1.3 depends on \`ASDF\` 3.1.2 or later, and
To work properly, \`cl-launch\` 4.1.4 depends on \`ASDF\` 3.1.2 or later, and
on its portability layer \`UIOP\`, to manage compilation and image life cycle.
The software is specified as the evaluation of code in several phases;
cl-launch (4.1.4-1) unstable; urgency=low
* Don't forget to install dispatch.lisp as source!
* Minor tweaks for dispatch.lisp.
* Minor documentation update.
* Update LispWorks support for LW 7.0.0
* Remove support for ASDF < 3.1.2
-- Francois-Rene Rideau <> Tue, 21 Jul 2015 23:31:13 -0400
cl-launch (4.1.3-1) unstable; urgency=low
* New options --system-main and --dispatch-system
.\" generated with Ronn/v0.7.3
.TH "CL\-LAUNCH" "1" "May 2015" "Francois-Rene Rideau" "Shell Scripting with Common Lisp"
.TH "CL\-LAUNCH" "1" "July 2015" "Francois-Rene Rideau" "Shell Scripting with Common Lisp"
.SH "Name"
cl\-launch \- shell wrapper for Common Lisp
......@@ -105,7 +105,7 @@ A suggested short\-hand name for \fBcl\-launch\fR is \fBcl\fR (you may create a
(See \fISimple cl\-launch scripts\fR below for caveats with \fB#!\fR scripts though\.) Recent Linux kernels support a script interpreter itself being a script; BSD kernels don\'t and require a small C program cl\-shim to be compiled and installed as /usr/bin/cl to use cl\-launch this way\.
To work properly, \fBcl\-launch\fR 4\.1\.3 depends on \fBASDF\fR 3\.1\.2 or later, and on its portability layer \fBUIOP\fR, to manage compilation and image life cycle\.
To work properly, \fBcl\-launch\fR 4\.1\.4 depends on \fBASDF\fR 3\.1\.2 or later, and on its portability layer \fBUIOP\fR, to manage compilation and image life cycle\.
The software is specified as the evaluation of code in several phases; the distinction matters most for creating executable binaries, but understanding the evaluation model can avoid surprises in other cases too\.
launcher.lisp cl-launch.asd build.xcvb dispatch.lisp usr/share/common-lisp/source/cl-launch/
cl-launch usr/bin
......@@ -5,8 +5,10 @@ Homepage:
Maintainer: Francois-Rene Rideau <>
Uploaders: Christoph Egger <>, Kan-Ru Chen <>, Milan Zamazal <>, Peter Van Eynde <>, Julien Danjou <>
Build-Depends: debhelper (>= 9)
Build-Depends-Indep: dh-lisp
Package: cl-launch
Architecture: all
......@@ -86,3 +86,75 @@ License: LLGPL or Bugroff
executable, you must also deliver, in accordance with the terms and
conditions of the LGPL, the source code of Library (or your derivative
thereof) that is incorporated into this executable.
The "No problem Bugroff" license.
Richard Stallman of the Free Software Foundation devised, in addition to
some marvelous software, the GNU General Public License (GPL for short).
Or the CopyLeft it is sometimes called.
It is quite a revolutionary document, using the "copyright" tool to to
protect your right to use free software.
Unfortunately using copyright to protect free software is a lot like using
a Jackal to guard the hens.
In fact, various inconveniences relating to this have resulted in
modifications such as the LGPL (Library General Public License) and more
recently the NPL (Netscape Public License)
I call these matters mere inconveniences, the real damage will occur when
the Jackal's, (sorry, I mean lawyers), actually get to test the GPL in
court for the first time.
Thus enter my version.
Its very simple.
Entirely consistent.
Completely unrestrictive.
Easy to apply.
The "No problem Bugroff" license is as follows...
The answer to any and every question relating to the copyright, patents,
legal issues of Bugroff licensed software is....
*Sure, No problem. Don't worry, be happy. Now bugger off.*
All portions of this license are important..
* "Sure, no problem." Gives you complete freedom. I mean it. Utterly
complete. A bit of a joke really. You have complete freedom anyway.
* "Don't worry, be happy." Apart from being good advice and a good song,
it also says :- No matter what anyone else says or does, you still have
complete freedom.
* Now bugger off. The only way to get rid of pushy Jackals is to ignore
them and not feed them. The GPL is just begging somebody to take it to
court. Can't you just see it. Exactly the same thing that happened when
some twit (not Linus) registered Linux as his own personal trademark.
People got upset, started a fund, and hired, off all ruddy things, a
Jackal to try and defend the chicken! Who really benefits from this
trademark / patent / copyright thing anyway? The lawyers. Who made it up
in the first place? The lawyers.
OK so the last part of the license sounds a bit harsh, but seriously
folks, if you are a :-
* Lawyer asking these legalese questions... You should go off and learn an
honest trade that will actually contribute to life instead of draining
* Programmer asking these legalese questions... You have amazingly
powerful tools in your hands and mind, use them to ask and answer the
worthwhile questions of life, the universe and everything. Stop mucking
about with such legal nonsense and get back to programming.
* User/reader asking these question... Don't worry. Go off and be happy.
Have fun. Enjoy what has been created for you.
......@@ -10,6 +10,9 @@ include_dir := $(clc-source)/$(pkg)
doc-dir := usr/share/doc/$(debpkg)
dh $@ --with lisp
configure: configure-stamp
......@@ -23,10 +26,13 @@ build-indep: build-stamp
build-stamp: configure-stamp
sh ./ \
--include /${include_dir} \
--include "/${include_dir}" \
--lisp "sbcl ccl clisp abcl cmucl ecl mkcl allegro lispworks scl gcl xcl" \
--rc \
-B generate_install_files
# To generate the manpage from source, we could do this:
# sh ./ -Ds cl-launch/release manpage
# But then we'd have to (1) package all the CL dependencies as .deb libraries (2) setup the source registry properly
touch build-stamp
......@@ -71,5 +71,9 @@ If NAME is NIL, return the value of *DEFAULT-BEHAVIOR*."
(defun dispatch-entry (argv &optional (name (get-name)))
(funcall (or (get-entry name) *default-behavior*) argv))
;; The below function is NOT exported, but you can use :import-from so -Ds works trivially with some system of yours:
(defun main (argv)
(dispatcher argv))
(when (null *image-entry-point*)
(setf *image-entry-point* #'dispatcher))
#| -*- Lisp -*-
#!/usr/bin/cl -sm cl-launch/release
exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@" ; exit
#!/usr/bin/cl -Ds cl-launch/release
exec "$(dirname $0)/" -X --dispatch-system cl-launch/release -- "$0" "$@" ; exit
(defpackage :cl-launch/release
(:use :cl :uiop :asdf :inferior-shell :optima :optima.ppcre)
(:use :cl :uiop :asdf :fare-utils :optima :optima.ppcre
:inferior-shell :cl-scripting :cl-launch/dispatch)
(:import-from :cl-launch/dispatch #:main)
;; Note: these exports are also the list of available commands.
(:export #:rep #:clean #:manpage
#:source #:quickrelease
#:get-date-from-git #:check-manual
#:debian-version #:script-version
#:debian-package #:publish-debian-package #:debian-package-all))
(in-package :cl-launch/release)
......@@ -62,7 +65,7 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(defun clean ()
(with-current-directory ((pn))
(run '(git clean -xfd)))
(defun debian-package ()
(let* ((debian-version (debian-version))
......@@ -98,7 +101,8 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(run `(pwd) :show t)
(run/interactive `(gpg -b -a (cl-launch- ,version .tar.gz)) :show t)
(run `(ln -sf (,cl-launch-version .tar.gz) cl-launch.tar.gz) :show t)
(run `(ln -sf (,cl-launch-version .tar.gz.asc) cl-launch.tar.gz.asc) :show t))))
(run `(ln -sf (,cl-launch-version .tar.gz.asc) cl-launch.tar.gz.asc) :show t)))
(defun publish-debian-package ()
(let* ((debian-version (debian-version))
......@@ -107,11 +111,12 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(with-current-directory (cldir)
(run `(dput mentors (cl-launch_ ,debian-version _ ,(debian-arch) .changes)) :show t)
(run `(rsync -av --delete ,cldir "") :show t)))
(defun source ()
(with-current-directory ((pn))
(run `(./ --include ,(getcwd) "-B" install_path))))
(run `(./ --include ,(getcwd) "-B" install_path)))
(defparameter *months* #("January" "February" "March" "April" "May" "June"
"July" "August" "September" "October" "November" "December"))
......@@ -136,7 +141,8 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(date-from-git (subseq (get-date-from-git) 0 2)))
(assert (equal date-from-manual date-from-git) ()
"Manual says it's from ~{~D-~2,'0D~} but git commit is from ~{~D-~2,'0D~}"
date-from-manual date-from-git)))
date-from-manual date-from-git))
(defun manpage ()
......@@ -146,13 +152,15 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(run `(ronn "--roff" "--manual=Shell Scripting with Common Lisp"
"--organization=Francois-Rene Rideau"
,(format nil "--date=~{~D-~2,'0D-~2,'0D~}" (get-date-from-git)) (> 2 /dev/null))))) (> 2 /dev/null))))
(defun check-manual ()
(with-current-directory ((pn))
(run `(cmp ./cl-launch.1 ./debian/cl-launch.1))))
(run `(cmp ./cl-launch.1 ./debian/cl-launch.1)))
(defun quickrelease ()
(let* ((version (script-version)) ;; no need to compare with the debian version
......@@ -171,7 +179,7 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(run `(ssh ln -sf ,tarball /project/xcvb/public_html/cl-launch/cl-launch.tar.gz))
(run `(rm -f ,link ,tarball))))
(defun debian-package-all ()
......@@ -180,11 +188,4 @@ exec "$(dirname $0)/" -X --system-main cl-launch/release -- "$0" "$@
(defun valid-commands ()
(sort (while-collecting (c) (do-external-symbols (x :cl-launch/release) (c x))) #'string<))
(defun main (argv)
(multiple-value-bind (command status)
(find-symbol (string-upcase (first argv)) :cl-launch/release)
(if (eq status :external)
(format t "~@[~{~S~^ ~}~%~]" (multiple-value-list (apply command (rest argv))))
(die 2 "~A ~:[requires a command~;doesn't recognize command ~:*~A~].~%Try one of: ~(~{~A~^ ~}~)~%"
(argv0) (first argv) (valid-commands))))
t) ;; success according to uiop:restore-image.
(register-commands :cl-launch/release)