cl-brewer - Homebrew formula builder for Common Lisp applications.

CL-BREWER ASDF System Details

About

Currently there is no easy way to distribute common lisp applications. One promising way is to use roswell project however it might be to complicated for the users how just want to install an application and are not really interested in having one more package manager for that.

In Mac OS X world the most popular solution is to use brew package manager and all we need is to be able to generate formula that will handle installation proccess. Since homebrew guidelines are not really fond of using third-party managers to get dependencies, we need to generate list manually and feed it to brew.

cl-brewer uses SBCL and targets command line applications written in Common Lisp. GUI applications haven't been tested and might require additional changes.

This application is based on the awesome quicklisp-homebrew-roundup but has a purpose to make a process simplier by:

At the moment several assumptions were made:

Here is an example formula

Installation

brew tap 40ants/soft
brew install cl-brewer

Or you can install it using Roswell:

# install roswell and sbcl before
$ ros install 40ants/cl-brewer

If you want to install it to use from the REPL, then you can install this library from Quicklisp, but you want to receive updates quickly, then install it from Ultralisp.org:

(ql-dist:install-dist "http://dist.ultralisp.org/"
                      :prompt nil)
(ql:quickload :cl-brewer)

Usage

Just run:

cl-brewer <your-system-name>

This will emit <your-system-name>.rb file in current folder.

To run cl-brewer under Qlot, you'll need set SBCL_HOME variable. Otherwise sb-sys::*sbcl-homedir-pathname* variable will be reinitialized and this can cause some incompatibilities if Qlot and cl-brewer were built with different SBCL implementations.

Thus, in this case call cl-brewer like this:

qlot exec bash -c "SBCL_HOME='' cl-brewer <your-system-name>"

Building a formula for cl-brewer

To kickstart a cl-brewer and to create a formula for itself, load it in the REPL and do like that:

CL-USER> (cl-brewer:create-formula :cl-brewer)
#<BUILDAPP-FORMULA "cl-brewer" depends on 23 systems>

CL-USER> (cl-brewer:save-formula * "cl-brewer"
                                 :preload (list "quicklisp-starter"))
Downloading "https://github.com/40ants/cl-brewer/archive/v0.5.5.tar.gz" (Unknown size)
NIL

However, in most cases you can just install cl-brewer from the Homebrew. In this case, you can update cl-brewer's formula with this command:

qlot exec cl-brewer 
          --preload quicklisp-starter 
          cl-brewer

Installing From Local Formula

How to install cl-brewer (or any other project) from a local formula?

Replace url line in a formula:

url "https://github.com/40ants/cl-brewer/archive/v0.5.6.tar.gz"

with two lines like this:

url File.dirname(__FILE__), :using => :git
version "0.5.6-rc1"

Next, do this in the shell:

HOMEBREW_NO_AUTO_UPDATE=1 brew install --debug --verbose ./*.rb

it should build and install cl-brewer.

Contribute

If you are interested in using this project but your application has different requirements, please open an issue or make a pull request. Contributions are welcome!

License

All code is public domain except parts that were taken from quicklisp-homebrew-roundup which is under MIT License.

API

CL-BREWER

Classes

FORMULA

Base class for Homebrew formula definition.

Readers

Accessors

Generics

Create object based on asdf:system with a list of all dependencies

Some systems, like cl-unicode have implicit dependencies in their asdf methods: https://github.com/edicl/cl-unicode/blob/8073fc5634c9d4802888ac03abf11dfe383e16fa/cl-unicode.asd#L67-L70 use this method to provide information about such dependencies.

System name is a keyword and method should return a one keyword or a list of keywords with names of systems. Each returned system should be possible to find with ql-dist:find-system.

Functions

function
formula name &key entry-point preload

Saves Homebrew formula definition into the file with given NAME.

If ENTRY-POINT argument was given, then it might be used as entry-point, but some formula classes like cl-brewer/deploy/formula:deploy-formula might ignore this argument.

PRELOAD argument if given, should be a list of strings with ASDF system names to be preloaded before cl-brewer will build a binary.

CL-BREWER/BUILDAPP/FORMULA

Classes

BUILDAPP-FORMULA

This formula class uses Buildapp to build a binary.

CL-BREWER/DEPLOY/FORMULA

Classes

DEPLOY-FORMULA

This formula class uses Deploy to build a binary.

The core difference from cl-brewer/buildapp/formula:buildapp-formula is that this type of formula also builds and distributes all necessary dynamic libraries.

CL-BREWER/FORMULA

Generics

Some formulas might add dependencies needed to build a binary. For example, Deploy formula adds cl-brewer because it uses it's cl-brewer/deploy/hooks subsystem.

generic-function
generic-function

Macros

macro
name (asdf-system) &body body

Use this macro to define a function to guess a formula class.

The function should accept a one argument - an ASDF system and return a symbol denoting a class derived from formula class.

If guesser does not know how to create a formula for the system, then it should return a NIL value.