quicklispPackages, lispPackages: make all system-loads pass with precompilation

This commit is contained in:
Michael Raskin
2017-04-01 08:08:22 +02:00
parent a41668f441
commit 623a469653
167 changed files with 2812 additions and 533 deletions
@@ -1,7 +1,9 @@
args @ { fetchurl, ... }:
rec {
baseName = ''<% @var filename %>'';
version = ''<% @var version %>'';
version = ''<% @var version %>'';<% @if testname %>
testSystems = ["<% @var testname %>"];<% @endif %>
description = ''<% @var description %>'';
@@ -13,5 +15,14 @@ rec {
};
overrides = x: {
postInstall = ''
find "$out/lib/common-lisp/" -name '*.asd' | grep -iv '/<% @var name %>[.]asd${"$"}' |
while read f; do
CL_SOURCE_REGISTRY= \
NIX_LISP_PRELAUNCH_HOOK="nix_lisp_run_single_form '(asdf:load-system :$(basename "$f" .asd))'" \
"$out"/bin/*-lisp-launcher.sh ||
mv "$f"{,.sibling}; done || true
'';
};
}
/* <%= cl-emb-intern::topenv %> */
@@ -6,8 +6,10 @@
(ql:quickload :cl-emb)
(ql:quickload :external-program)
(ql:quickload :cl-ppcre)
(ql:quickload :md5)
(ql:quickload :alexandria)
(ql:quickload :md5)
(defvar testnames (make-hash-table :test 'equal))
(defun nix-prefetch-url (url)
(let*
@@ -45,11 +47,11 @@
(t x)))))
(defun system-data (system)
(ql:quickload system)
(let*
((asdf-system (asdf:find-system system))
(ql-system (ql-dist:find-system system))
(ql-release (ql-dist:release ql-system))
(ql-sibling-systems (ql-dist:provided-systems ql-release))
(url (ql-dist:archive-url ql-release))
(local-archive (ql-dist:local-archive-file ql-release))
(local-url (format nil "file://~a" (pathname local-archive)))
@@ -60,9 +62,18 @@
(ideal-md5 (ql-dist:archive-md5 ql-release))
(file-md5 (getf archive-data :md5))
(raw-dependencies (ql-dist:required-systems ql-system))
(dependencies (remove-if-not 'ql-dist:find-system raw-dependencies))
(deps (mapcar (lambda (x) (list :name x)) dependencies))
(name (string-downcase (format nil "~a" system)))
(ql-sibling-names
(remove name (mapcar 'ql-dist:name ql-sibling-systems)
:test 'equal))
(dependencies
(set-difference
(remove-duplicates
(remove-if-not 'ql-dist:find-system raw-dependencies)
:test 'equal)
ql-sibling-names
:test 'equal))
(deps (mapcar (lambda (x) (list :name x)) dependencies))
(description (asdf:system-description asdf-system))
(release-name (ql-dist:short-description ql-release))
(version (cl-ppcre:regex-replace-all
@@ -79,7 +90,8 @@
:filename (escape-filename name)
:deps deps
:dependencies dependencies
:version version)))
:version version
:siblings ql-sibling-names)))
(defmacro this-file ()
(or *compile-file-truename*
@@ -102,8 +114,11 @@
with res := nil
while queue
for next := (pop queue)
for deps := (getf (system-data next) :dependencies)
unless (gethash next seen) do
for old := (gethash next seen)
for data := (unless old (system-data next))
for deps := (getf data :dependencies)
for siblings := (getf data :siblings)
unless old do
(progn
(push next res)
(setf queue (append queue deps)))