3.4 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	buildLisp.nix
This is a build system for Common Lisp, written in Nix.
It aims to offer an alternative to ASDF for users who live in a Nix-based ecosystem. This offers several advantages over ASDF:
- Simpler (logic-less) package definitions
- Easy linking of native dependencies (from Nix)
- Composability with Nix tooling for other languages
- Effective, per-system caching strategies
- Easy overriding of dependencies and whatnot
- ... and more!
The project is still in its early stages and some important restrictions should be highlighted:
- There is no separate abstraction for tests at the moment (i.e. they are built and run as programs)
- Only SBCL is supported (though the plan is to add support for at least ABCL and Clozure CL, and maybe make it extensible)
Usage
buildLisp exposes four different functions:
- 
buildLisp.library: Builds a collection of Lisp files into a library.parameter type use required? namestringName of the library yes srcslist<path>List of paths to source files yes depslist<drv>List of dependencies no nativelist<drv>List of native dependencies no The output of invoking this is a directory containing a FASL file that is the concatenated result of all compiled sources. 
- 
buildLisp.program: Builds an executable program out of Lisp files.parameter type use required? namestringName of the program yes srcslist<path>List of paths to source files yes depslist<drv>List of dependencies no nativelist<drv>List of native dependencies no mainstringEntrypoint function no The mainparameter should be the name of a function and defaults to${name}:main(i.e. the exportedmainfunction of the package named after the program).The output of invoking this is a directory containing a bin/${name}.
- 
buildLisp.bundled: Creates a virtual dependency on a built-in library.Certain libraries ship with Lisp implementations, for example UIOP/ASDF are commonly included but many implementations also ship internals (such as SBCLs various sb-*libraries).This function takes a single string argument that is the name of a built-in library and returns a "package" that simply requires this library. 
- 
buildLisp.sbclWith: Creates an SBCL pre-loaded with various dependencies.This function takes a single argument which is a list of Lisp libraries programs or programs. It creates an SBCL that is pre-loaded with all of that Lisp code and can be used as the host for e.g. Sly or SLIME. 
Example
Using buildLisp could look like this:
{ buildLisp, lispPkgs }:
let libExample = buildLisp.library {
    name = "lib-example";
    srcs = [ ./lib.lisp ];
    deps = with lispPkgs; [
      (buildLisp.bundled "sb-posix")
      iterate
      cl-ppcre
    ];
};
in buildLisp.program {
    name = "example";
    deps = [ libExample ];
    srcs = [ ./main.lisp ];
}