A script to update/install the latest versions of all the most important Common Lisp packages.
About
clbuild is a shell script helping with the download, compilation, an invocation of Common Lisp applications. It defaults to SBCL but otherwise tries to be somewhat independent of your local environment.
clbuild was originally written by Luke Gorrie. (Idea from jhbuild by James Henstridge, a Gnome hacker).
Please send patches bug reports to clbuild-devel@common-lisp.net (list information).
Adding projects
Add projects or submit corrections like this, please:
- Add new projects to clbuild/wnpp-projects. Fix clbuild/projects or clbuild/wnpp-projects for existing projects.
- Use darcs record to make the change permanent.
- Make your repository available over http. This is where others can get the change from you.
- Send a pull request to the list, so that we can pull from the patch from your repository. This means to send an email stating your repository URL and what you have changed.
FAQ
How does clbuild differ from asdf-install?
clbuild includes a list of selected libraries and applications and their well-known locations, and downloads the newest version or CVS/SVN/darcs repositories if possible. It can also build SBCL for you and includes convenient commands to start various applications.
In contrast, asdf-install can install any software listed on Cliki. It always downloads release tarballs. (It is up to the user to hunt down the trustworthy PGP keys as a protection agains malicous wiki entries.)
Yes, please see above.
We use version-controlled download mechanisms to avoid losing local changes when updating.
clbuild's source directory is meant as an area where hackers can do their work, and we wouldn't feel confident recommending it for that purpose if we had to delete and move directories or extract tarballs in there.
Instead, we have the clbuild mirror with darcs conversions of tarball-only projects.
(Future versions of clbuild might do that darcs conversion on-the-fly somewhere in a new directory clbuild/import, and then use darcs pull from that directory into clbuild/source. The downside of that approach would be that different users (and separate clbuild checkouts by the same user) would have incompatible darcs checkouts for the same project.)
You don't have to run this command when sending us patches for new projects. Anyone merging such a patch will rebuild the dependencies before comitting anyway.
This file is an educated guess and sometimes not perfect. We prefer to err on the side of too many dependencies rather than too few.
However, the following situations are not necessarily bugs:
- circular dependencies: (cffi depends on trivial-features, which depends on cffi itself. That is not a problem.
- non-transitive dependencies: (if A depends on B, which depends on C, it does not follow that A depends on C.)
Make sure to distinguish between project dependencies and system dependencies.
The following process computes the "project dependencies" of a project FOO:
- look for all files named clbuild/source/FOO/*.asd and load them. (Except for some special projects that force us to scan recursively for asd files.)
- for each system BAR that we found a file FOO/bar.asd for, compute the systems that BAR depends on. (ASDF provides no function that I am aware of to find those dependencies, so we scan the in-order-to slot to make an educated guess what those dependencies are.) As an extra exception, we sometimes add dependencies at this point, for example to force mcclim to always depend on cffi, no matter whether the caller currently has gtkairo enabled or not.
- for each such system that is a dependency, map the system back to its asd file, and if that asd file is found somewhere in clbuild/source/BAZ/, consider it to be part of project BAZ
- The projects found in the last step are the dependencies of FOO.
This process implies that dependencies between projects are not transitive.
For example, the project `babel' depends on the project `rt' because the system BABEL-TEST depends on the system RT.
But the system HUNCHENTOOT depends only on BABEL, not BABEL-TEST, so the project `hunchentoot' does not depend on the project `rt'.
Think about "clbuild update hunchentoot" as "install everything I need to use/hack all parts of hunchentoot", which doesn't include BABEL-TEST or RT. "clbuild update babel" means "install everything I need to use/hack babel", which includes BABEL-TEST and hence RT.
- Luke originally wrote clbuild as a shell script.
- clbuild is not a mere shell script. At least `recompile' and `record-dependencies' are now written in Lisp.
- We basically just call out to darcs, git, cvs, and svn anyway.
- Thanks to the shell script, we can install lisp projects before having built a clean SBCL, and without having to worry whether the Lisp in $PATH is good enough.
- Building SBCL from a shell script seems like a natural thing to do.
- Other projects have tried to explore different parts of the design space for lisp software installers. There is cl-librarian written in Lisp, clget written in Perl, and so on.
Download and Usage
clbuild is maintained in darcs.
$ darcs get http://common-lisp.net/project/clbuild/clbuild
You might want to make the shell script executable:
$ cd clbuild clbuild$ chmod +x clbuild
clbuild depends on various helper applications. Try check to make sure they are installed:
clbuild$ ./clbuild check Checking for helper applications... found /usr/bin/X11/cvs found /usr/bin/X11/svn found /usr/bin/X11/darcs found /usr/bin/X11/wget found /bin/tar found /bin/mktemp Success: All helper applications found. Checking Lisp startup... Success: Lisp starts up using "sbcl" Looking for installable systems... 0 systems definition files registered
Use list to search for projects:
clbuild$ ./clbuild list web i cl-webdav WebDAV server i closure CLIM-based web browser i hunchentoot web server formerly known as TBNL
Run update to download the userland:
clbuild$ ./clbuild update --main-projects cvs co flexichain... cvs co mcclim... ... lots of output not shown ... update complete 46 systems definition files registered
You do not have to download all default projects (and in particular, wnpp-projects are not part of the default download anyway). Instead, you can specify a particular project, and download it with its dependencies only:
clbuild$ ./clbuild update climacs clbuild update climacs climacs depends on: climacs clx flexichain mcclim slime spatial-trees include dependencies in update? (Y/n)y cvs co climacs... cvs co clx... ... lots of output not shown ...
To reduce start up times, you can dump a core file including all main projects (or the projects specified on the command line, just like with update):
clbuild$ ./clbuild climacs # slow, from fasls clbuild$ ./clbuild dumpcore climacs ... clbuild$ ./clbuild climacs # fast, using monster.core
Building SBCL
You can also download and recompile SBCL using buildsbcl or buildworld:
clbuild$ ./clbuild buildsbclCommand line arguments
For other options, see help:
clbuild$ ./clbuild help
Usage:
check check availability of all necessary helper applications
list [PATTERN] list all projects, or projects matching PATTERN
update [--dependencies|--no-dependencies] PROJECT_NAME
download/update this project
update [--resume]
download/update main projects. With --resume, consider
only projects that a previous update run failed to fetch.
skip PROJECT_NAME
mark this project as done for the purposes of update --resume
recompile [PROJECT_NAME] recompile main applications (or just PROJECT_NAME)
dumpcore [PROJECT_NAME] recompile and dump a core file for faster startup
build [PROJECT_NAME] update && dumpcore
diff show local changes (for all version-controlled projects)
check-urls compared installed repository urls agains current locations
clean-links remove broken symlinks in systems/
update-missing download only projects not present yet
register-asd PROJECT add .asd file symlinks for PROJECT
buildsbcl [XC_HOST] download/update and compile SBCL
world buildsbcl && build
clean delete all compiled object files
mrproper delete all downloaded source and fasl files
slime run the Superior Lisp Interaction Mode in a fresh Emacs
lisp run Lisp in the terminal
record-dependencies rebuild dependency information file
Starting applications:
run APPLICATION run this application
run --help show help for applications
If you do 'world' or 'buildsbcl' then SBCL will be installed in
target/ and used for future commands. If you don't run these commands
(or you remove target/) then clbuild uses the 'sbcl' in your PATH.
For configuration options (including for non-SBCL lisps), see clbuild.conf.
Application startup
clbuild$ ./clbuild run --help
clbuild run APPLICATION [ARGS...]
run listener run the McCLIM listener
run gsharp run the Gsharp score editor
run climacs run the Climacs text editor
run closure [HOME_PAGE_URL] run the CLOSURE web browser
(required Debian packages: gif2png,libjpeg-progs)
run beirc run the Beirc IRC client
run climplayer run the CLIMPlayer music player
(required Debian packages: mplayer, fileschanged, fam)
run demodemo run some random CLIM examples
run clim-alerts run CLIM alerts
run eclipse [DPY] run the eclipse window manager
run hunchentoot run the Hunchentoot web server test
run webdav DIR run the CL-WEBDAV server, serving directory DIR
(required Debian packages: libssl-dev)
run parse-xml FILENAME
check XML for well-formedness
run validate-xml FILENAME
check XML for validity
run validate-relax-ng [--compact yes] XML-FILENAME SCHEMA-FILENAME
check XML for validity against a Relax NG Schema
run html-to-xhtml HTML-FILENAME OUTPUT-FILENAME
run xhtml-to-html XML-FILENAME OUTPUT-FILENAME
convert between HTML 4 and XHTMl
run vecto-demo generate a test image using vecto