From a954bd8d5e448b32cd8517affe2607a41c7103ad Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 8 Jan 2020 02:00:54 +0000 Subject: feat(nix/buildLisp): Add initial sketch including buildLisp.library Adds a Nix function to build a Lisp library out of a specified set of Nix files. All files are combined into a single FASL. This is by design only compatible with SBCL (for now). --- nix/buildLisp/README.md | 21 +++++++++++++ nix/buildLisp/default.nix | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 nix/buildLisp/README.md create mode 100644 nix/buildLisp/default.nix (limited to 'nix/buildLisp') diff --git a/nix/buildLisp/README.md b/nix/buildLisp/README.md new file mode 100644 index 0000000000..513656f570 --- /dev/null +++ b/nix/buildLisp/README.md @@ -0,0 +1,21 @@ +buildLisp.nix +============= + +This is a build system for Common Lisp, written in Nix. + +The project is in its early stages and currently supports nothing +other than compiling a bunch of Lisp sources into a combined FASL +file. + +This is what it currently looks like: + +```nix +nix.buildLisp.library { + name = "test-lib"; + srcs = [ + ./nix/buildLisp/test-lib.lisp + ]; +} +``` + +Check back here in a few days for more information. diff --git a/nix/buildLisp/default.nix b/nix/buildLisp/default.nix new file mode 100644 index 0000000000..69fcb44ed9 --- /dev/null +++ b/nix/buildLisp/default.nix @@ -0,0 +1,76 @@ +# buildLisp provides Nix functions to build Common Lisp packages, +# targeting SBCL. +# +# buildLisp is designed to enforce conventions and do away with the +# free-for-all of existing Lisp build systems. + +{ pkgs ? { third_party = import {}; } +, ... }: + +let + inherit (builtins) map elemAt match; + inherit (pkgs.third_party) lib runCommand writeText sbcl; + + # + # Internal helper definitions + # + + # 'genCompileLisp' generates a Lisp file that instructs SBCL to + # compile the provided list of Lisp source files to $out. + genCompileLisp = srcs: writeText "compile.lisp" '' + ;; This file compiles the specified sources into the Nix build + ;; directory, creating one FASL file for each source. + (require 'sb-posix) + + (defun nix-compile-lisp (srcfile) + (let ((outfile (make-pathname :type "fasl" + :directory (or (sb-posix:getenv "NIX_BUILD_TOP") + (error "not running in a Nix build")) + :defaults srcfile))) + (compile-file srcfile :output-file outfile))) + + (let ((*compile-verbose* t) + ;; FASL files are compiled into the working directory of the + ;; build and *then* moved to the correct out location. + (pwd (sb-posix:getcwd))) + + ;; These forms were inserted by the Nix build: + ${ + lib.concatStringsSep "\n" (map (src: "(nix-compile-lisp \"${src}\")") srcs) + } + ) + ''; + + # + # Public API functions + # + + # Add an `overrideLisp` attribute to a function result that works + # similar to `overrideAttrs`, but is used specifically for the + # arguments passed to Lisp builders. + makeOverridable = f: orig: (f orig) // { + overrideLisp = new: makeOverridable f (orig // (new orig)); + }; + + # 'library' builds a list of Common Lisp files into a single FASL + # which can then be loaded into SBCL. + library = { name, srcs, deps ? [] }: runCommand "${name}-cllib" {} '' + ${sbcl}/bin/sbcl --script ${genCompileLisp srcs} + + # FASL files can be combined by simply concatenating them together: + mkdir $out + cat ./*.fasl > $out/${name}.fasl + ''; + + # 'program' creates an executable containing a dumped image of the + # specified sources and dependencies. + program = {}; + + # 'sbclWith' creates an image with the specified libraries / + # programs loaded. + sbclWith = {}; +in { + library = makeOverridable library; + program = makeOverridable program; + sbclWith = makeOverridable sbclWith; +} -- cgit 1.4.1