lisp-modules: init
From https://github.com/Uthar/nix-cl Commit ebeb76057abf01029067f1ebe0ae6fae90848bfe
This commit is contained in:
18
pkgs/development/lisp-modules/builder.lisp
Normal file
18
pkgs/development/lisp-modules/builder.lisp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
(defpackage :nix-cl-user
|
||||||
|
(:use :cl))
|
||||||
|
|
||||||
|
(in-package :nix-cl-user)
|
||||||
|
|
||||||
|
(load "@asdf@")
|
||||||
|
|
||||||
|
(defun load-systems ()
|
||||||
|
(handler-case
|
||||||
|
(let ((systems (uiop:getenv "systems")))
|
||||||
|
(dolist (s (uiop:split-string systems :separator " "))
|
||||||
|
(asdf:load-system s)))
|
||||||
|
(error (c)
|
||||||
|
(format t "BUILD FAILED: ~A~%" c)
|
||||||
|
(uiop:quit 1)))
|
||||||
|
(uiop:quit 0))
|
||||||
|
|
||||||
|
(load-systems)
|
||||||
18
pkgs/development/lisp-modules/import/api.lisp
Normal file
18
pkgs/development/lisp-modules/import/api.lisp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
(defpackage org.lispbuilds.nix/api
|
||||||
|
(:documentation "Public interface of org.lispbuilds.nix")
|
||||||
|
(:use :cl)
|
||||||
|
(:export
|
||||||
|
:import-lisp-packages
|
||||||
|
:database->nix-expression))
|
||||||
|
|
||||||
|
(in-package org.lispbuilds.nix/api)
|
||||||
|
|
||||||
|
(defgeneric import-lisp-packages (repository database)
|
||||||
|
(:documentation
|
||||||
|
"Import Lisp packages (ASDF systems) from repository (Quicklisp,
|
||||||
|
Ultralisp etc.) into a package database."))
|
||||||
|
|
||||||
|
(defgeneric database->nix-expression (database outfile)
|
||||||
|
(:documentation
|
||||||
|
"Generate a nix expression from the package database and write it
|
||||||
|
into outfile."))
|
||||||
176
pkgs/development/lisp-modules/import/database/sqlite.lisp
Normal file
176
pkgs/development/lisp-modules/import/database/sqlite.lisp
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
(defpackage org.lispbuilds.nix/database/sqlite
|
||||||
|
(:use :cl)
|
||||||
|
(:import-from :str)
|
||||||
|
(:import-from :sqlite)
|
||||||
|
(:import-from :alexandria :read-file-into-string)
|
||||||
|
(:import-from :alexandria-2 :line-up-first)
|
||||||
|
(:import-from :arrow-macros :->>)
|
||||||
|
(:import-from
|
||||||
|
:org.lispbuilds.nix/util
|
||||||
|
:replace-regexes)
|
||||||
|
(:import-from
|
||||||
|
:org.lispbuilds.nix/nix
|
||||||
|
:nix-eval
|
||||||
|
:nixify-symbol
|
||||||
|
:system-master
|
||||||
|
:make-pname
|
||||||
|
:*nix-attrs-depth*)
|
||||||
|
(:import-from
|
||||||
|
:org.lispbuilds.nix/api
|
||||||
|
:database->nix-expression)
|
||||||
|
(:export :sqlite-database :init-db)
|
||||||
|
(:local-nicknames
|
||||||
|
(:json :com.inuoe.jzon)))
|
||||||
|
|
||||||
|
(in-package org.lispbuilds.nix/database/sqlite)
|
||||||
|
|
||||||
|
(defclass sqlite-database ()
|
||||||
|
((url :initarg :url
|
||||||
|
:reader database-url
|
||||||
|
:initform (error "url required"))
|
||||||
|
(init-file :initarg :init-file
|
||||||
|
:reader init-file
|
||||||
|
:initform (error "init file required"))))
|
||||||
|
|
||||||
|
(defun init-db (db init-file)
|
||||||
|
(let ((statements (->> (read-file-into-string init-file)
|
||||||
|
(replace-regexes '(".*--.*") '(""))
|
||||||
|
(substitute #\Space #\Newline)
|
||||||
|
(str:collapse-whitespaces)
|
||||||
|
(str:split #\;)
|
||||||
|
(mapcar #'str:trim)
|
||||||
|
(remove-if #'str:emptyp))))
|
||||||
|
(sqlite:with-transaction db
|
||||||
|
(dolist (s statements)
|
||||||
|
(sqlite:execute-non-query db s)))))
|
||||||
|
|
||||||
|
|
||||||
|
;; Writing Nix
|
||||||
|
|
||||||
|
(defparameter prelude "
|
||||||
|
# This file was auto-generated by nix-quicklisp.lisp
|
||||||
|
|
||||||
|
{ runCommand, pkgs, lib, fetchzip, build-asdf-system, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
inherit (builtins) getAttr;
|
||||||
|
|
||||||
|
# Ensures that every non-slashy `system` exists in a unique .asd file.
|
||||||
|
# (Think cl-async-base being declared in cl-async.asd upstream)
|
||||||
|
#
|
||||||
|
# This is required because we're building and loading a system called
|
||||||
|
# `system`, not `asd`, so otherwise `system` would not be loadable
|
||||||
|
# without building and loading `asd` first.
|
||||||
|
#
|
||||||
|
createAsd = { url, sha256, asd, system }:
|
||||||
|
let
|
||||||
|
src = fetchzip { inherit url sha256; };
|
||||||
|
in
|
||||||
|
if asd == system
|
||||||
|
then src
|
||||||
|
else runCommand \"source\" {} ''
|
||||||
|
mkdir -pv $out
|
||||||
|
cp -r ${src}/* $out
|
||||||
|
find $out -name \"${asd}.asd\" | while read f; do mv -fv $f $(dirname $f)/${system}.asd || true; done
|
||||||
|
'';
|
||||||
|
in lib.makeScope pkgs.newScope (self: {")
|
||||||
|
|
||||||
|
;; Random compilation errors
|
||||||
|
(defparameter +broken-packages+
|
||||||
|
(list
|
||||||
|
;; no dispatch function defined for #\t
|
||||||
|
"hu.dwim.logger"
|
||||||
|
"hu.dwim.serializer"
|
||||||
|
"hu.dwim.quasi-quote"
|
||||||
|
;; Tries to write in $HOME
|
||||||
|
"ubiquitous"
|
||||||
|
"math"
|
||||||
|
;; Upstream bad packaging, multiple systems in clml.blas.asd
|
||||||
|
"clml.blas.hompack"
|
||||||
|
;; Fails on SBCL due to heap exhaustion
|
||||||
|
"magicl"
|
||||||
|
;; Probably missing dependency in QL data
|
||||||
|
"mcclim-bezier"
|
||||||
|
;; Missing dependency on c2ffi cffi extension
|
||||||
|
"hu.dwim.zlib"
|
||||||
|
;; Missing libgvc.so native library
|
||||||
|
"hu.dwim.graphviz"
|
||||||
|
;; These require libRmath.so, but I don't know where to get it from
|
||||||
|
"cl-random"
|
||||||
|
"cl-random-tests"
|
||||||
|
))
|
||||||
|
|
||||||
|
(defmethod database->nix-expression ((database sqlite-database) outfile)
|
||||||
|
(sqlite:with-open-database (db (database-url database))
|
||||||
|
(with-open-file (f outfile
|
||||||
|
:direction :output
|
||||||
|
:if-exists :supersede)
|
||||||
|
|
||||||
|
;; Fix known problematic packages before dumping the nix file.
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"create temp table fixed_systems as select * from system_view")
|
||||||
|
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"alter table fixed_systems add column systems")
|
||||||
|
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"update fixed_systems set systems = json_array(name)")
|
||||||
|
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"alter table fixed_systems add column asds")
|
||||||
|
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"update fixed_systems set asds = json_array(name)")
|
||||||
|
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"delete from fixed_systems where name in ('asdf', 'uiop')")
|
||||||
|
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"delete from fixed_systems where instr(name, '/')")
|
||||||
|
|
||||||
|
(format f prelude)
|
||||||
|
|
||||||
|
(dolist (p (sqlite:execute-to-list db "select * from fixed_systems"))
|
||||||
|
(destructuring-bind (name version asd url sha256 deps systems asds) p
|
||||||
|
(format f "~% ")
|
||||||
|
(let ((*nix-attrs-depth* 1))
|
||||||
|
(format
|
||||||
|
f
|
||||||
|
"~a = ~a;"
|
||||||
|
(nix-eval `(:symbol ,name))
|
||||||
|
(nix-eval
|
||||||
|
`(:funcall
|
||||||
|
"build-asdf-system"
|
||||||
|
(:attrs
|
||||||
|
("pname" (:string ,(make-pname name)))
|
||||||
|
("version" (:string ,version))
|
||||||
|
("asds" (:list
|
||||||
|
,@(mapcar (lambda (asd)
|
||||||
|
`(:string ,(system-master asd)))
|
||||||
|
(coerce (json:parse asds) 'list))))
|
||||||
|
("src" (:funcall
|
||||||
|
"createAsd"
|
||||||
|
(:attrs
|
||||||
|
("url" (:string ,url))
|
||||||
|
("sha256" (:string ,sha256))
|
||||||
|
("system" (:string ,(system-master name)))
|
||||||
|
("asd" (:string ,asd)))))
|
||||||
|
("systems" (:list
|
||||||
|
,@(mapcar (lambda (sys)
|
||||||
|
`(:string ,sys))
|
||||||
|
(coerce (json:parse systems) 'list))))
|
||||||
|
("lispLibs" (:list
|
||||||
|
,@(mapcar (lambda (dep)
|
||||||
|
`(:funcall
|
||||||
|
"getAttr"
|
||||||
|
(:string ,(nixify-symbol dep))
|
||||||
|
(:symbol "self")))
|
||||||
|
(line-up-first
|
||||||
|
(str:split-omit-nulls #\, deps)
|
||||||
|
(set-difference '("asdf" "uiop") :test #'string=)
|
||||||
|
(sort #'string<)))))
|
||||||
|
,@(when (or (find #\/ name)
|
||||||
|
(find name +broken-packages+ :test #'string=))
|
||||||
|
'(("meta" (:attrs ("broken" (:symbol "true")))))))))))))
|
||||||
|
(format f "~%})"))))
|
||||||
41
pkgs/development/lisp-modules/import/init.sql
Normal file
41
pkgs/development/lisp-modules/import/init.sql
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS sha256 (
|
||||||
|
id integer PRIMARY KEY AUTOINCREMENT,
|
||||||
|
url text UNIQUE,
|
||||||
|
hash text NOT NULL,
|
||||||
|
created real DEFAULT (julianday('now'))
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS system (
|
||||||
|
id integer PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name text NOT NULL,
|
||||||
|
version text NOT NULL,
|
||||||
|
asd text NOT NULL,
|
||||||
|
created real DEFAULT (julianday('now')),
|
||||||
|
UNIQUE(name, version)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS dep (
|
||||||
|
system_id integer NOT NULL REFERENCES system(id),
|
||||||
|
dep_id integer NOT NULL REFERENCES system(id),
|
||||||
|
PRIMARY KEY (system_id, dep_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS src (
|
||||||
|
sha256_id integer REFERENCES sha256(id),
|
||||||
|
system_id integer UNIQUE REFERENCES system(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
DROP VIEW IF EXISTS system_view;
|
||||||
|
CREATE VIEW IF NOT EXISTS system_view AS
|
||||||
|
SELECT
|
||||||
|
sys.name,
|
||||||
|
sys.version,
|
||||||
|
sys.asd,
|
||||||
|
sha.url,
|
||||||
|
sha.hash,
|
||||||
|
group_concat((SELECT name FROM system WHERE id = dep.dep_id)) as deps
|
||||||
|
FROM system sys
|
||||||
|
JOIN src ON src.system_id = sys.id
|
||||||
|
JOIN sha256 sha ON sha.id = src.sha256_id
|
||||||
|
LEFT JOIN dep ON dep.system_id = sys.id
|
||||||
|
GROUP BY sys.name;
|
||||||
42
pkgs/development/lisp-modules/import/main.lisp
Normal file
42
pkgs/development/lisp-modules/import/main.lisp
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
(defpackage org.lispbuilds.nix/main
|
||||||
|
(:use :common-lisp
|
||||||
|
:org.lispbuilds.nix/database/sqlite
|
||||||
|
:org.lispbuilds.nix/repository/quicklisp
|
||||||
|
:org.lispbuilds.nix/api))
|
||||||
|
|
||||||
|
(in-package org.lispbuilds.nix/main)
|
||||||
|
|
||||||
|
(defun resource (name type)
|
||||||
|
(make-pathname
|
||||||
|
:defaults (asdf:system-source-directory :org.lispbuilds.nix)
|
||||||
|
:name name
|
||||||
|
:type type))
|
||||||
|
|
||||||
|
(defvar *sqlite*
|
||||||
|
(make-instance
|
||||||
|
'sqlite-database
|
||||||
|
:init-file (resource "init" "sql")
|
||||||
|
:url "packages.sqlite"))
|
||||||
|
|
||||||
|
;; Check http://beta.quicklisp.org/dist/quicklisp.txt for updates
|
||||||
|
(defvar *quicklisp*
|
||||||
|
(make-instance
|
||||||
|
'quicklisp-repository
|
||||||
|
:dist-url
|
||||||
|
"https://beta.quicklisp.org/dist/quicklisp/2023-02-15/"))
|
||||||
|
|
||||||
|
(defun run-importers ()
|
||||||
|
(ignore-errors (delete-file "packages.sqlite"))
|
||||||
|
(import-lisp-packages *quicklisp* *sqlite*)
|
||||||
|
(format t "Imported packages from quicklisp to ~A~%"
|
||||||
|
(truename "packages.sqlite")))
|
||||||
|
|
||||||
|
(defun gen-nix-file ()
|
||||||
|
(database->nix-expression *sqlite* "imported.nix")
|
||||||
|
(format t "Dumped nix file to ~a~%"
|
||||||
|
(truename "imported.nix")))
|
||||||
|
|
||||||
|
(defun main ()
|
||||||
|
(format t "~%")
|
||||||
|
(run-importers)
|
||||||
|
(gen-nix-file))
|
||||||
81
pkgs/development/lisp-modules/import/nix.lisp
Normal file
81
pkgs/development/lisp-modules/import/nix.lisp
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
(defpackage org.lispbuilds.nix/nix
|
||||||
|
(:documentation "Utilities for generating Nix code")
|
||||||
|
(:use :cl)
|
||||||
|
(:import-from :str)
|
||||||
|
(:import-from :ppcre)
|
||||||
|
(:import-from :arrow-macros :->>)
|
||||||
|
(:import-from :org.lispbuilds.nix/util :replace-regexes)
|
||||||
|
(:export
|
||||||
|
:nix-eval
|
||||||
|
:nixify-symbol
|
||||||
|
:system-master
|
||||||
|
:make-pname
|
||||||
|
:*nix-attrs-depth*))
|
||||||
|
|
||||||
|
(in-package org.lispbuilds.nix/nix)
|
||||||
|
|
||||||
|
;; Path names are alphanumeric and can include the symbols +-._?= and
|
||||||
|
;; must not begin with a period.
|
||||||
|
(defun make-pname (string)
|
||||||
|
(replace-regexes '("^[.]" "[^a-zA-Z0-9+-._?=]")
|
||||||
|
'("_" "_")
|
||||||
|
string))
|
||||||
|
|
||||||
|
(defun system-master (system)
|
||||||
|
(first (str:split "/" system)))
|
||||||
|
|
||||||
|
;;;; Nix generation
|
||||||
|
|
||||||
|
(defun nix-eval (exp)
|
||||||
|
(assert (consp exp))
|
||||||
|
(ecase (car exp)
|
||||||
|
(:string (nix-string (cadr exp)))
|
||||||
|
(:list (apply #'nix-list (rest exp)))
|
||||||
|
(:funcall (apply #'nix-funcall (rest exp)))
|
||||||
|
(:attrs (nix-attrs (cdr exp)))
|
||||||
|
(:merge (apply #'nix-merge (cdr exp)))
|
||||||
|
(:symbol (nix-symbol (cadr exp)))))
|
||||||
|
|
||||||
|
(defun nix-string (object)
|
||||||
|
(format nil "\"~a\"" object))
|
||||||
|
|
||||||
|
(defun nixify-symbol (string)
|
||||||
|
(flet ((fix-special-chars (str)
|
||||||
|
(replace-regexes '("[+]$" "[+][/]" "[+]" "[.]" "[/]")
|
||||||
|
'("_plus" "_plus/" "_plus_" "_dot_" "_slash_")
|
||||||
|
str)))
|
||||||
|
(if (ppcre:scan "^[0-9]" string)
|
||||||
|
(str:concat "_" (fix-special-chars string))
|
||||||
|
(fix-special-chars string))))
|
||||||
|
|
||||||
|
|
||||||
|
(defun nix-symbol (object)
|
||||||
|
(nixify-symbol (format nil "~a" object)))
|
||||||
|
|
||||||
|
(defun nix-list (&rest things)
|
||||||
|
(format nil "[ ~{~A~^ ~} ]" (mapcar 'nix-eval things)))
|
||||||
|
(defvar *nix-attrs-depth* 0)
|
||||||
|
|
||||||
|
(defun nix-attrs (keyvals)
|
||||||
|
(let ((*nix-attrs-depth* (1+ *nix-attrs-depth*)))
|
||||||
|
(format
|
||||||
|
nil
|
||||||
|
(->> "{~%*depth*~{~{~A = ~A;~}~^~%*depth*~}~%*depth-1*}"
|
||||||
|
(str:replace-all "*depth*" (str:repeat *nix-attrs-depth* " "))
|
||||||
|
(str:replace-all "*depth-1*" (str:repeat (1- *nix-attrs-depth*) " ")))
|
||||||
|
(mapcar (lambda (keyval)
|
||||||
|
(let ((key (car keyval))
|
||||||
|
(val (cadr keyval)))
|
||||||
|
(list (nix-symbol key)
|
||||||
|
(nix-eval val))))
|
||||||
|
keyvals))))
|
||||||
|
|
||||||
|
(defun nix-funcall (fun &rest args)
|
||||||
|
(format nil "(~a ~{~a~^ ~})"
|
||||||
|
(nixify-symbol fun)
|
||||||
|
(mapcar 'nix-eval args)))
|
||||||
|
|
||||||
|
(defun nix-merge (a b)
|
||||||
|
(format nil "(~a // ~b)"
|
||||||
|
(nix-eval a)
|
||||||
|
(nix-eval b)))
|
||||||
28
pkgs/development/lisp-modules/import/org.lispbuilds.nix.asd
Normal file
28
pkgs/development/lisp-modules/import/org.lispbuilds.nix.asd
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
(defsystem org.lispbuilds.nix
|
||||||
|
:class :package-inferred-system
|
||||||
|
:description "Utilities for importing ASDF systems into Nix"
|
||||||
|
:depends-on (
|
||||||
|
:alexandria
|
||||||
|
:str
|
||||||
|
:cl-ppcre
|
||||||
|
:sqlite
|
||||||
|
:dexador
|
||||||
|
:arrow-macros
|
||||||
|
:com.inuoe.jzon
|
||||||
|
:org.lispbuilds.nix/api
|
||||||
|
:org.lispbuilds.nix/repository/quicklisp
|
||||||
|
:org.lispbuilds.nix/database/sqlite
|
||||||
|
))
|
||||||
|
|
||||||
|
|
||||||
|
(register-system-packages
|
||||||
|
"cl-ppcre"
|
||||||
|
'(:ppcre))
|
||||||
|
|
||||||
|
(register-system-packages
|
||||||
|
"dexador"
|
||||||
|
'(:dex))
|
||||||
|
|
||||||
|
(register-system-packages
|
||||||
|
"alexandria"
|
||||||
|
'(:alexandria :alexandria-2))
|
||||||
199
pkgs/development/lisp-modules/import/repository/quicklisp.lisp
Normal file
199
pkgs/development/lisp-modules/import/repository/quicklisp.lisp
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
(defpackage org.lispbuilds.nix/repository/quicklisp
|
||||||
|
(:use :cl)
|
||||||
|
(:import-from :dex)
|
||||||
|
(:import-from :alexandria :read-file-into-string :ensure-list)
|
||||||
|
(:import-from :arrow-macros :->>)
|
||||||
|
(:import-from :str)
|
||||||
|
(:import-from
|
||||||
|
:org.lispbuilds.nix/database/sqlite
|
||||||
|
:sqlite-database
|
||||||
|
:init-db
|
||||||
|
:database-url
|
||||||
|
:init-file)
|
||||||
|
(:import-from
|
||||||
|
:org.lispbuilds.nix/api
|
||||||
|
:import-lisp-packages)
|
||||||
|
(:import-from
|
||||||
|
:org.lispbuilds.nix/util
|
||||||
|
:replace-regexes)
|
||||||
|
(:export :quicklisp-repository)
|
||||||
|
(:local-nicknames
|
||||||
|
(:json :com.inuoe.jzon)))
|
||||||
|
|
||||||
|
(in-package org.lispbuilds.nix/repository/quicklisp)
|
||||||
|
|
||||||
|
(defclass quicklisp-repository ()
|
||||||
|
((dist-url :initarg :dist-url
|
||||||
|
:reader dist-url
|
||||||
|
:initform (error "dist url required"))))
|
||||||
|
|
||||||
|
(defun clear-line ()
|
||||||
|
(write-char #\Return *error-output*)
|
||||||
|
(write-char #\Escape *error-output*)
|
||||||
|
(write-char #\[ *error-output*)
|
||||||
|
(write-char #\K *error-output*))
|
||||||
|
|
||||||
|
(defun status (&rest format-args)
|
||||||
|
(clear-line)
|
||||||
|
(apply #'format (list* *error-output* format-args))
|
||||||
|
(force-output *error-output*))
|
||||||
|
|
||||||
|
;; TODO: This should not know about the imported.nix file.
|
||||||
|
(defun init-tarball-hashes (database)
|
||||||
|
(status "no packages.sqlite - will pre-fill tarball hashes from ~A to save time~%"
|
||||||
|
(truename "imported.nix"))
|
||||||
|
(let* ((lines (uiop:read-file-lines "imported.nix"))
|
||||||
|
(lines (remove-if-not
|
||||||
|
(lambda (line)
|
||||||
|
(let ((trimmed (str:trim-left line)))
|
||||||
|
(or (str:starts-with-p "url = " trimmed)
|
||||||
|
(str:starts-with-p "sha256 = " trimmed))))
|
||||||
|
lines))
|
||||||
|
(lines (mapcar
|
||||||
|
(lambda (line)
|
||||||
|
(multiple-value-bind (whole groups)
|
||||||
|
(ppcre:scan-to-strings "\"\(.*\)\"" line)
|
||||||
|
(declare (ignore whole))
|
||||||
|
(svref groups 0)))
|
||||||
|
lines)))
|
||||||
|
(sqlite:with-open-database (db (database-url database))
|
||||||
|
(init-db db (init-file database))
|
||||||
|
(sqlite:with-transaction db
|
||||||
|
(loop while lines do
|
||||||
|
(sqlite:execute-non-query db
|
||||||
|
"insert or ignore into sha256(url,hash) values (?,?)"
|
||||||
|
(prog1 (first lines) (setf lines (rest lines)))
|
||||||
|
(prog1 (first lines) (setf lines (rest lines))))))
|
||||||
|
(status "OK, imported ~A hashes into DB.~%"
|
||||||
|
(sqlite:execute-single db
|
||||||
|
"select count(*) from sha256")))))
|
||||||
|
|
||||||
|
(defmethod import-lisp-packages ((repository quicklisp-repository)
|
||||||
|
(database sqlite-database))
|
||||||
|
|
||||||
|
;; If packages.sqlite is missing, we should populate the sha256
|
||||||
|
;; table to speed things up.
|
||||||
|
(unless (probe-file (database-url database))
|
||||||
|
(init-tarball-hashes database))
|
||||||
|
|
||||||
|
(let* ((db (sqlite:connect (database-url database)))
|
||||||
|
(systems-url (str:concat (dist-url repository) "systems.txt"))
|
||||||
|
(releases-url (str:concat (dist-url repository) "releases.txt"))
|
||||||
|
(systems-lines (rest (butlast (str:split #\Newline (dex:get systems-url)))))
|
||||||
|
(releases-lines (rest (butlast (str:split #\Newline (dex:get releases-url))))))
|
||||||
|
|
||||||
|
(flet ((sql-query (sql &rest params)
|
||||||
|
(apply #'sqlite:execute-to-list (list* db sql params))))
|
||||||
|
|
||||||
|
;; Ensure database schema
|
||||||
|
(init-db db (init-file database))
|
||||||
|
|
||||||
|
;; Prepare temporary tables for efficient access
|
||||||
|
(sql-query "create temp table if not exists quicklisp_system
|
||||||
|
(project, asd, name unique, deps)")
|
||||||
|
|
||||||
|
(sql-query "create temp table if not exists quicklisp_release
|
||||||
|
(project unique, url, size, md5, sha1, prefix not null, asds)")
|
||||||
|
|
||||||
|
(sqlite:with-transaction db
|
||||||
|
(dolist (line systems-lines)
|
||||||
|
(destructuring-bind (project asd name &rest deps)
|
||||||
|
(str:words line)
|
||||||
|
(sql-query
|
||||||
|
"insert or ignore into quicklisp_system values(?,?,?,?)"
|
||||||
|
project asd name (json:stringify (coerce deps 'vector))))))
|
||||||
|
|
||||||
|
(sqlite:with-transaction db
|
||||||
|
(dolist (line releases-lines)
|
||||||
|
(destructuring-bind (project url size md5 sha1 prefix &rest asds)
|
||||||
|
(str:words line)
|
||||||
|
(sql-query
|
||||||
|
"insert or ignore into quicklisp_release values(?,?,?,?,?,?,?)"
|
||||||
|
project url size md5 sha1 prefix (json:stringify (coerce
|
||||||
|
asds
|
||||||
|
'vector))))))
|
||||||
|
|
||||||
|
(sqlite:with-transaction db
|
||||||
|
;; Should these be temp tables, that then get queried by
|
||||||
|
;; system name? This looks like it uses a lot of memory.
|
||||||
|
(let ((systems
|
||||||
|
(sql-query
|
||||||
|
"with pkg as (
|
||||||
|
select
|
||||||
|
name, asd, url, deps,
|
||||||
|
ltrim(replace(prefix, r.project, ''), '-_') as version
|
||||||
|
from quicklisp_system s, quicklisp_release r
|
||||||
|
where s.project = r.project
|
||||||
|
)
|
||||||
|
select
|
||||||
|
name, version, asd, url,
|
||||||
|
(select json_group_array(
|
||||||
|
json_array(value, (select version from pkg where name=value))
|
||||||
|
)
|
||||||
|
from json_each(deps)) as deps
|
||||||
|
from pkg"
|
||||||
|
)))
|
||||||
|
|
||||||
|
;; First pass: insert system and source tarball informaton.
|
||||||
|
;; Can't insert dependency information, because this works
|
||||||
|
;; on system ids in the database and they don't exist
|
||||||
|
;; yet. Could it be better to just base dependencies on
|
||||||
|
;; names? But then ACID is lost.
|
||||||
|
(dolist (system systems)
|
||||||
|
(destructuring-bind (name version asd url deps) system
|
||||||
|
(declare (ignore deps))
|
||||||
|
(status "importing system '~a-~a'" name version)
|
||||||
|
(let ((hash (nix-prefetch-tarball url db)))
|
||||||
|
(sql-query
|
||||||
|
"insert or ignore into system(name,version,asd) values (?,?,?)"
|
||||||
|
name version asd)
|
||||||
|
(sql-query
|
||||||
|
"insert or ignore into sha256(url,hash) values (?,?)"
|
||||||
|
url hash)
|
||||||
|
(sql-query
|
||||||
|
"insert or ignore into src values
|
||||||
|
((select id from sha256 where url=?),
|
||||||
|
(select id from system where name=? and version=?))"
|
||||||
|
url name version))))
|
||||||
|
|
||||||
|
;; Second pass: connect the in-database systems with
|
||||||
|
;; dependency information
|
||||||
|
(dolist (system systems)
|
||||||
|
(destructuring-bind (name version asd url deps) system
|
||||||
|
(declare (ignore asd url))
|
||||||
|
(dolist (dep (coerce (json:parse deps) 'list))
|
||||||
|
(destructuring-bind (dep-name dep-version) (coerce dep 'list)
|
||||||
|
(if (eql dep-version 'NULL)
|
||||||
|
(warn "Bad data in Quicklisp: ~a has no version" dep-name)
|
||||||
|
(sql-query
|
||||||
|
"insert or ignore into dep values
|
||||||
|
((select id from system where name=? and version=?),
|
||||||
|
(select id from system where name=? and version=?))"
|
||||||
|
name version
|
||||||
|
dep-name dep-version))))))))))
|
||||||
|
|
||||||
|
(write-char #\Newline *error-output*))
|
||||||
|
|
||||||
|
(defun shell-command-to-string (cmd)
|
||||||
|
;; Clearing the library path is needed to prevent a bug, where the
|
||||||
|
;; called subprocess uses a different glibc than the SBCL process
|
||||||
|
;; is. In that case, the call to execve attempts to load the
|
||||||
|
;; libraries used by SBCL from LD_LIBRARY_PATH using a different
|
||||||
|
;; glibc than they expect, which errors out.
|
||||||
|
(let ((ld-library-path (uiop:getenv "LD_LIBRARY_PATH")))
|
||||||
|
(setf (uiop:getenv "LD_LIBRARY_PATH") "")
|
||||||
|
(unwind-protect
|
||||||
|
(uiop:run-program cmd :output '(:string :stripped t))
|
||||||
|
(setf (uiop:getenv "LD_LIBRARY_PATH") ld-library-path))))
|
||||||
|
|
||||||
|
(defun nix-prefetch-tarball (url db)
|
||||||
|
(restart-case
|
||||||
|
(compute-sha256 url db)
|
||||||
|
(try-again ()
|
||||||
|
:report "Try downloading again"
|
||||||
|
(nix-prefetch-tarball url db))))
|
||||||
|
|
||||||
|
(defun compute-sha256 (url db)
|
||||||
|
(or (sqlite:execute-single db "select hash from sha256 where url=?" url)
|
||||||
|
(let ((sha256 (shell-command-to-string (str:concat "nix-prefetch-url --unpack " url))))
|
||||||
|
sha256)))
|
||||||
16
pkgs/development/lisp-modules/import/util.lisp
Normal file
16
pkgs/development/lisp-modules/import/util.lisp
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
(defpackage org.lispbuilds.nix/util
|
||||||
|
(:use :cl)
|
||||||
|
(:import-from :ppcre)
|
||||||
|
(:export
|
||||||
|
:replace-regexes))
|
||||||
|
|
||||||
|
(in-package org.lispbuilds.nix/util)
|
||||||
|
|
||||||
|
(defun replace-regexes (from to str)
|
||||||
|
(assert (= (length from) (length to)))
|
||||||
|
(if (null from)
|
||||||
|
str
|
||||||
|
(replace-regexes
|
||||||
|
(rest from)
|
||||||
|
(rest to)
|
||||||
|
(ppcre:regex-replace-all (first from) str (first to)))))
|
||||||
58916
pkgs/development/lisp-modules/imported.nix
Normal file
58916
pkgs/development/lisp-modules/imported.nix
Normal file
File diff suppressed because it is too large
Load Diff
293
pkgs/development/lisp-modules/nix-cl.nix
Normal file
293
pkgs/development/lisp-modules/nix-cl.nix
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
# TODO:
|
||||||
|
# - faster build by using lisp with preloaded asdf?
|
||||||
|
# - dont include java libs unless abcl?
|
||||||
|
# - dont use build-asdf-system to build lispWithPackages?
|
||||||
|
# - make the lisp packages overridable? (e.g. buildInputs glibc->musl)
|
||||||
|
# - build asdf with nix and use that instead of one shipped with impls
|
||||||
|
# (e.g. to fix build with clisp - does anyone use clisp?)
|
||||||
|
# - claspPackages ? (gotta package clasp with nix first)
|
||||||
|
# - hard one: remove unrelated sources ( of systems not being built)
|
||||||
|
# - figure out a less awkward way to patch sources
|
||||||
|
# (have to build from src directly for SLIME to work, so can't just patch sources in place)
|
||||||
|
|
||||||
|
{ pkgs
|
||||||
|
, lib
|
||||||
|
, stdenv
|
||||||
|
, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
inherit (lib)
|
||||||
|
length
|
||||||
|
filter
|
||||||
|
foldl
|
||||||
|
unique
|
||||||
|
id
|
||||||
|
concat
|
||||||
|
concatMap
|
||||||
|
mutuallyExclusive
|
||||||
|
findFirst
|
||||||
|
remove
|
||||||
|
setAttr
|
||||||
|
getAttr
|
||||||
|
hasAttr
|
||||||
|
attrNames
|
||||||
|
attrValues
|
||||||
|
filterAttrs
|
||||||
|
mapAttrs
|
||||||
|
splitString
|
||||||
|
concatStringsSep
|
||||||
|
concatMapStringsSep
|
||||||
|
replaceStrings
|
||||||
|
removeSuffix
|
||||||
|
hasInfix
|
||||||
|
optionalString
|
||||||
|
makeBinPath
|
||||||
|
makeLibraryPath
|
||||||
|
makeSearchPath
|
||||||
|
recurseIntoAttrs
|
||||||
|
;
|
||||||
|
|
||||||
|
inherit (builtins)
|
||||||
|
head
|
||||||
|
tail
|
||||||
|
elem
|
||||||
|
split
|
||||||
|
storeDir;
|
||||||
|
|
||||||
|
inherit (pkgs)
|
||||||
|
substituteAll;
|
||||||
|
|
||||||
|
# Stolen from python-packages.nix
|
||||||
|
# Actually no idea how this works
|
||||||
|
makeOverridableLispPackage = f: origArgs:
|
||||||
|
let
|
||||||
|
ff = f origArgs;
|
||||||
|
overrideWith = newArgs: origArgs // (if pkgs.lib.isFunction newArgs then newArgs origArgs else newArgs);
|
||||||
|
in
|
||||||
|
if builtins.isAttrs ff then (ff // {
|
||||||
|
overrideLispAttrs = newArgs: makeOverridableLispPackage f (overrideWith newArgs);
|
||||||
|
})
|
||||||
|
else if builtins.isFunction ff then {
|
||||||
|
overrideLispAttrs = newArgs: makeOverridableLispPackage f (overrideWith newArgs);
|
||||||
|
__functor = self: ff;
|
||||||
|
}
|
||||||
|
else ff;
|
||||||
|
|
||||||
|
buildAsdf = { asdf, pkg, program, flags, faslExt }:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
inherit (asdf) pname version;
|
||||||
|
dontUnpack = true;
|
||||||
|
buildPhase = ''
|
||||||
|
cp -v ${asdf}/lib/common-lisp/asdf/build/asdf.lisp asdf.lisp
|
||||||
|
${pkg}/bin/${program} ${flags} < <(echo '(compile-file "asdf.lisp")')
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp -v asdf.${faslExt} $out
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Wrapper around stdenv.mkDerivation for building ASDF systems.
|
||||||
|
#
|
||||||
|
build-asdf-system = makeOverridableLispPackage (
|
||||||
|
{ pname,
|
||||||
|
version,
|
||||||
|
src ? null,
|
||||||
|
patches ? [],
|
||||||
|
|
||||||
|
# Native libraries, will be appended to the library path
|
||||||
|
nativeLibs ? [],
|
||||||
|
|
||||||
|
# Java libraries for ABCL, will be appended to the class path
|
||||||
|
javaLibs ? [],
|
||||||
|
|
||||||
|
# Lisp dependencies
|
||||||
|
# these should be packages built with `build-asdf-system`
|
||||||
|
# TODO(kasper): use propagatedBuildInputs
|
||||||
|
lispLibs ? [],
|
||||||
|
|
||||||
|
# Derivation containing the CL implementation package
|
||||||
|
pkg,
|
||||||
|
|
||||||
|
# Name of the Lisp exectable
|
||||||
|
program ? pkg.pname,
|
||||||
|
|
||||||
|
# General flags to the Lisp executable
|
||||||
|
flags ? "",
|
||||||
|
|
||||||
|
# Extension for implementation-dependent FASL files
|
||||||
|
faslExt,
|
||||||
|
|
||||||
|
# ASDF amalgamation file to use
|
||||||
|
# Created in build/asdf.lisp by `make` in ASDF source tree
|
||||||
|
asdf,
|
||||||
|
|
||||||
|
# Some libraries have multiple systems under one project, for
|
||||||
|
# example, cffi has cffi-grovel, cffi-toolchain etc. By
|
||||||
|
# default, only the `pname` system is build.
|
||||||
|
#
|
||||||
|
# .asd's not listed in `systems` are removed in
|
||||||
|
# installPhase. This prevents asdf from referring to uncompiled
|
||||||
|
# systems on run time.
|
||||||
|
#
|
||||||
|
# Also useful when the pname is differrent than the system name,
|
||||||
|
# such as when using reverse domain naming.
|
||||||
|
systems ? [ pname ],
|
||||||
|
|
||||||
|
# The .asd files that this package provides
|
||||||
|
# TODO(kasper): remove
|
||||||
|
asds ? systems,
|
||||||
|
|
||||||
|
# Other args to mkDerivation
|
||||||
|
...
|
||||||
|
} @ args:
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
inherit
|
||||||
|
pname version nativeLibs javaLibs lispLibs systems asds
|
||||||
|
pkg program flags faslExt
|
||||||
|
;
|
||||||
|
|
||||||
|
# When src is null, we are building a lispWithPackages and only
|
||||||
|
# want to make use of the dependency environment variables
|
||||||
|
# generated by build-asdf-system
|
||||||
|
dontUnpack = src == null;
|
||||||
|
|
||||||
|
# Portable script to build the systems.
|
||||||
|
#
|
||||||
|
# `lisp` must evaluate this file then exit immediately. For
|
||||||
|
# example, SBCL's --script flag does just that.
|
||||||
|
#
|
||||||
|
# NOTE:
|
||||||
|
# Every other library worked fine with asdf:compile-system in
|
||||||
|
# buildScript.
|
||||||
|
#
|
||||||
|
# cl-syslog, for some reason, signals that CL-SYSLOG::VALID-SD-ID-P
|
||||||
|
# is undefined with compile-system, but works perfectly with
|
||||||
|
# load-system. Strange.
|
||||||
|
|
||||||
|
# TODO(kasper) portable quit
|
||||||
|
asdfFasl = buildAsdf { inherit asdf pkg program flags faslExt; };
|
||||||
|
|
||||||
|
buildScript = substituteAll {
|
||||||
|
src = ./builder.lisp;
|
||||||
|
asdf = "${asdfFasl}/asdf.${faslExt}";
|
||||||
|
};
|
||||||
|
|
||||||
|
preConfigure = ''
|
||||||
|
source ${./setup-hook.sh}
|
||||||
|
buildAsdfPath
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = optionalString (src != null) ''
|
||||||
|
export CL_SOURCE_REGISTRY=$CL_SOURCE_REGISTRY:$src//
|
||||||
|
export ASDF_OUTPUT_TRANSLATIONS="$src:$(pwd):${storeDir}:${storeDir}"
|
||||||
|
${pkg}/bin/${program} ${flags} < $buildScript
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Copy compiled files to store
|
||||||
|
#
|
||||||
|
# Make sure to include '$' in regex to prevent skipping
|
||||||
|
# stuff like 'iolib.asdf.asd' for system 'iolib.asd'
|
||||||
|
#
|
||||||
|
# Same with '/': `local-time.asd` for system `cl-postgres+local-time.asd`
|
||||||
|
installPhase =
|
||||||
|
let
|
||||||
|
mkSystemsRegex = systems:
|
||||||
|
concatMapStringsSep "\\|" (replaceStrings ["." "+"] ["[.]" "[+]"]) systems;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
mkdir -pv $out
|
||||||
|
cp -r * $out
|
||||||
|
|
||||||
|
# Remove all .asd files except for those in `systems`.
|
||||||
|
find $out -name "*.asd" \
|
||||||
|
| grep -v "/\(${mkSystemsRegex systems}\)\.asd$" \
|
||||||
|
| xargs rm -fv || true
|
||||||
|
'';
|
||||||
|
|
||||||
|
dontPatchShebangs = true;
|
||||||
|
|
||||||
|
# Not sure if it's needed, but caused problems with SBCL
|
||||||
|
# save-lisp-and-die binaries in the past
|
||||||
|
dontStrip = true;
|
||||||
|
|
||||||
|
} // (args // {
|
||||||
|
src = if builtins.length (args.patches or []) > 0
|
||||||
|
then pkgs.applyPatches { inherit (args) src patches; }
|
||||||
|
else args.src;
|
||||||
|
patches = [];
|
||||||
|
propagatedBuildInputs = args.propagatedBuildInputs or []
|
||||||
|
++ lispLibs ++ javaLibs ++ nativeLibs;
|
||||||
|
})));
|
||||||
|
|
||||||
|
# Build the set of lisp packages using `lisp`
|
||||||
|
# These packages are defined manually for one reason or another:
|
||||||
|
# - The library is not in quicklisp
|
||||||
|
# - The library that is in quicklisp is broken
|
||||||
|
# - Special build procedure such as cl-unicode, asdf
|
||||||
|
#
|
||||||
|
# They can use the auto-imported quicklisp packages as dependencies,
|
||||||
|
# but some of those don't work out of the box.
|
||||||
|
#
|
||||||
|
# E.g if a QL package depends on cl-unicode it won't build out of
|
||||||
|
# the box.
|
||||||
|
commonLispPackagesFor = spec:
|
||||||
|
let
|
||||||
|
build-asdf-system' = body: build-asdf-system (body // spec);
|
||||||
|
in pkgs.callPackage ./packages.nix {
|
||||||
|
inherit spec quicklispPackagesFor;
|
||||||
|
build-asdf-system = build-asdf-system';
|
||||||
|
};
|
||||||
|
|
||||||
|
# Build the set of packages imported from quicklisp using `lisp`
|
||||||
|
quicklispPackagesFor = spec:
|
||||||
|
let
|
||||||
|
build-asdf-system' = body: build-asdf-system (body // spec);
|
||||||
|
in pkgs.callPackage ./ql.nix {
|
||||||
|
build-asdf-system = build-asdf-system';
|
||||||
|
};
|
||||||
|
|
||||||
|
# Creates a lisp wrapper with `packages` installed
|
||||||
|
#
|
||||||
|
# `packages` is a function that takes `clpkgs` - a set of lisp
|
||||||
|
# packages - as argument and returns the list of packages to be
|
||||||
|
# installed
|
||||||
|
# TODO(kasper): assert each package has the same lisp and asdf?
|
||||||
|
lispWithPackages = clpkgs: packages:
|
||||||
|
let first = head (lib.attrValues clpkgs); in
|
||||||
|
(build-asdf-system {
|
||||||
|
inherit (first) pkg program flags faslExt asdf;
|
||||||
|
# See dontUnpack in build-asdf-system
|
||||||
|
src = null;
|
||||||
|
pname = first.pkg.pname;
|
||||||
|
version = "with-packages";
|
||||||
|
lispLibs = packages clpkgs;
|
||||||
|
systems = [];
|
||||||
|
}).overrideAttrs(o: {
|
||||||
|
nativeBuildInputs = [ pkgs.makeBinaryWrapper ];
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -pv $out/bin
|
||||||
|
makeWrapper \
|
||||||
|
${o.pkg}/bin/${o.program} \
|
||||||
|
$out/bin/${o.program} \
|
||||||
|
--add-flags "${o.flags}" \
|
||||||
|
--set ASDF "${o.asdfFasl}/asdf.${o.faslExt}" \
|
||||||
|
--prefix CL_SOURCE_REGISTRY : "$CL_SOURCE_REGISTRY" \
|
||||||
|
--prefix ASDF_OUTPUT_TRANSLATIONS : "$(echo $CL_SOURCE_REGISTRY | sed s,//:,::,g):" \
|
||||||
|
--prefix LD_LIBRARY_PATH : "$LD_LIBRARY_PATH" \
|
||||||
|
--prefix DYLD_LIBRARY_PATH : "$DYLD_LIBRARY_PATH" \
|
||||||
|
--prefix CLASSPATH : "$CLASSPATH" \
|
||||||
|
--prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
|
||||||
|
--prefix PATH : "${makeBinPath (o.propagatedBuildInputs or [])}"
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
in {
|
||||||
|
inherit commonLispPackagesFor;
|
||||||
|
inherit lispWithPackages;
|
||||||
|
inherit build-asdf-system;
|
||||||
|
}
|
||||||
502
pkgs/development/lisp-modules/packages.nix
Normal file
502
pkgs/development/lisp-modules/packages.nix
Normal file
@@ -0,0 +1,502 @@
|
|||||||
|
{ build-asdf-system, spec, quicklispPackagesFor, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
inherit (pkgs.lib)
|
||||||
|
head
|
||||||
|
makeLibraryPath
|
||||||
|
makeSearchPath
|
||||||
|
setAttr
|
||||||
|
hasAttr
|
||||||
|
optionals
|
||||||
|
hasSuffix
|
||||||
|
splitString
|
||||||
|
remove
|
||||||
|
;
|
||||||
|
|
||||||
|
# Used by builds that would otherwise attempt to write into storeDir.
|
||||||
|
#
|
||||||
|
# Will run build two times, keeping all files created during the
|
||||||
|
# first run, exept the FASL's. Then using that directory tree as the
|
||||||
|
# source of the second run.
|
||||||
|
#
|
||||||
|
# E.g. cl-unicode creating .txt files during compilation
|
||||||
|
build-with-compile-into-pwd = args:
|
||||||
|
let
|
||||||
|
build = (build-asdf-system (args // { version = args.version + "-build"; }))
|
||||||
|
.overrideAttrs(o: {
|
||||||
|
buildPhase = with builtins; ''
|
||||||
|
mkdir __fasls
|
||||||
|
export ASDF_OUTPUT_TRANSLATIONS="$(pwd):$(pwd)/__fasls:${storeDir}:${storeDir}"
|
||||||
|
export CL_SOURCE_REGISTRY=$CL_SOURCE_REGISTRY:$(pwd)//
|
||||||
|
${o.pkg}/bin/${o.program} ${o.flags or ""} < ${o.buildScript}
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -pv $out
|
||||||
|
rm -rf __fasls
|
||||||
|
cp -r * $out
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
in build-asdf-system (args // {
|
||||||
|
# Patches are already applied in `build`
|
||||||
|
patches = [];
|
||||||
|
src = build;
|
||||||
|
});
|
||||||
|
|
||||||
|
# A little hacky
|
||||||
|
isJVM = spec.pkg.pname == "abcl";
|
||||||
|
|
||||||
|
# Makes it so packages imported from Quicklisp can be re-used as
|
||||||
|
# lispLibs ofpackages in this file.
|
||||||
|
ql = quicklispPackagesFor spec;
|
||||||
|
|
||||||
|
packages = ql.overrideScope' (self: super: {
|
||||||
|
|
||||||
|
cffi = let
|
||||||
|
jna = pkgs.fetchMavenArtifact {
|
||||||
|
groupId = "net.java.dev.jna";
|
||||||
|
artifactId = "jna";
|
||||||
|
version = "5.9.0";
|
||||||
|
sha256 = "0qbis8acv04fi902qzak1mbagqaxcsv2zyp7b8y4shs5nj0cgz7a";
|
||||||
|
};
|
||||||
|
in build-asdf-system {
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "http://beta.quicklisp.org/archive/cffi/2021-04-11/cffi_0.24.1.tgz";
|
||||||
|
sha256 = "17ryim4xilb1rzxydfr7595dnhqkk02lmrbkqrkvi9091shi4cj3";
|
||||||
|
};
|
||||||
|
version = "0.24.1";
|
||||||
|
pname = "cffi";
|
||||||
|
lispLibs = with super; [
|
||||||
|
alexandria
|
||||||
|
babel
|
||||||
|
trivial-features
|
||||||
|
];
|
||||||
|
javaLibs = optionals isJVM [ jna ];
|
||||||
|
};
|
||||||
|
|
||||||
|
cffi-libffi = build-asdf-system {
|
||||||
|
inherit (super.cffi-libffi) pname version asds lispLibs nativeLibs nativeBuildInputs;
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/cffi/cffi/archive/3f842b92ef808900bf20dae92c2d74232c2f6d3a.tar.gz";
|
||||||
|
sha256 = "1jilvmbbfrmb23j07lwmkbffc6r35wnvas5s4zjc84i856ccclm2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-unicode = build-with-compile-into-pwd {
|
||||||
|
pname = "cl-unicode";
|
||||||
|
version = "0.1.6";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/edicl/cl-unicode/archive/refs/tags/v0.1.6.tar.gz";
|
||||||
|
sha256 = "0ykx2s9lqfl74p1px0ik3l2izd1fc9jd1b4ra68s5x34rvjy0hza";
|
||||||
|
};
|
||||||
|
systems = [ "cl-unicode" ];
|
||||||
|
lispLibs = with super; [
|
||||||
|
cl-ppcre
|
||||||
|
flexi-streams
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
jzon = build-asdf-system {
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/Zulu-Inuoe/jzon/archive/6b201d4208ac3f9721c461105b282c94139bed29.tar.gz";
|
||||||
|
sha256 = "01d4a78pjb1amx5amdb966qwwk9vblysm1li94n3g26mxy5zc2k3";
|
||||||
|
};
|
||||||
|
version = "0.0.0-20210905-6b201d4208";
|
||||||
|
pname = "jzon";
|
||||||
|
lispLibs = [
|
||||||
|
super.closer-mop
|
||||||
|
];
|
||||||
|
systems = [ "com.inuoe.jzon" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-notify = build-asdf-system {
|
||||||
|
pname = "cl-notify";
|
||||||
|
version = "20080904-138ca7038";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://repo.or.cz/cl-notify.git/snapshot/138ca703861f4a1fbccbed557f92cf4d213668a1.tar.gz";
|
||||||
|
sha256 = "0k6ns6fzvjcbpsqgx85r4g5m25fvrdw9481i9vyabwym9q8bbqwx";
|
||||||
|
};
|
||||||
|
lispLibs = [
|
||||||
|
self.cffi
|
||||||
|
];
|
||||||
|
nativeLibs = [
|
||||||
|
pkgs.libnotify
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-liballegro-nuklear = build-with-compile-into-pwd {
|
||||||
|
inherit (super.cl-liballegro-nuklear) pname version src;
|
||||||
|
nativeBuildInputs = [ pkgs.allegro5 ];
|
||||||
|
nativeLibs = [ pkgs.allegro5 ];
|
||||||
|
lispLibs = super.cl-liballegro-nuklear.lispLibs ++ [ super.cl-liballegro ];
|
||||||
|
patches = [ ./patches/cl-liballegro-nuklear-missing-dll.patch ];
|
||||||
|
};
|
||||||
|
|
||||||
|
tuple = build-asdf-system {
|
||||||
|
pname = "tuple";
|
||||||
|
version = "b74bd067d";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://fossil.galkowski.xyz/tuple/tarball/b74bd067d4533ac0/tuple.tar.gz";
|
||||||
|
sha256 = "0dk356vkv6kwwcmc3j08x7143549m94rd66rpkzq8zkb31cg2va8";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-tar-file = build-asdf-system {
|
||||||
|
pname = "cl-tar-file";
|
||||||
|
version = "v0.2.1";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = let
|
||||||
|
rev = "0c10bc82f14702c97a26dc25ce075b5d3a2347d1";
|
||||||
|
in "https://gitlab.common-lisp.net/cl-tar/cl-tar-file/-/archive/${rev}/cl-tar-file-${rev}.tar.gz";
|
||||||
|
sha256 = "0i8j05fkgdqy4c4pqj0c68sh4s3klpx9kc5wp73qwzrl3xqd2svy";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
alexandria
|
||||||
|
babel
|
||||||
|
trivial-gray-streams
|
||||||
|
_40ants-doc
|
||||||
|
salza2
|
||||||
|
chipz
|
||||||
|
flexi-streams
|
||||||
|
parachute
|
||||||
|
];
|
||||||
|
systems = [ "tar-file" "tar-file/test" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-tar = build-asdf-system {
|
||||||
|
pname = "cl-tar";
|
||||||
|
version = "v0.2.1";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = let
|
||||||
|
rev = "7c6e07a10c93d9e311f087b5f6328cddd481669a";
|
||||||
|
in "https://gitlab.common-lisp.net/cl-tar/cl-tar/-/archive/${rev}/cl-tar-${rev}.tar.gz";
|
||||||
|
sha256 = "0wp23cs3i6a89dibifiz6559la5nk58d1n17xvbxq4nrl8cqsllf";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
alexandria
|
||||||
|
babel
|
||||||
|
local-time
|
||||||
|
split-sequence
|
||||||
|
_40ants-doc
|
||||||
|
parachute
|
||||||
|
osicat
|
||||||
|
] ++ [ self.cl-tar-file ];
|
||||||
|
systems = [
|
||||||
|
"tar"
|
||||||
|
"tar/common-extract"
|
||||||
|
"tar/simple-extract"
|
||||||
|
"tar/extract"
|
||||||
|
"tar/create"
|
||||||
|
"tar/docs"
|
||||||
|
"tar/test"
|
||||||
|
"tar/create-test"
|
||||||
|
"tar/extract-test"
|
||||||
|
"tar/simple-extract-test"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
lessp = build-asdf-system {
|
||||||
|
pname = "lessp";
|
||||||
|
version = "0.2-f8a9e4664";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/facts-db/cl-lessp/archive/632217602b85b679e8d420654a0aa39e798ca3b5.tar.gz";
|
||||||
|
sha256 = "0i3ia14dzqwjpygd0zn785ff5vqnnmkn75psfpyx0ni3jr71lkq9";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
rollback = build-asdf-system {
|
||||||
|
pname = "rollback";
|
||||||
|
version = "0.1-5d3f21fda";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/facts-db/cl-rollback/archive/5d3f21fda8f04f35c5e9d20ee3b87db767915d15.tar.gz";
|
||||||
|
sha256 = "12dpxsbm2al633y87i8p784k2dn4bbskz6sl40v9f5ljjmjqjzxf";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
facts = build-asdf-system {
|
||||||
|
pname = "facts";
|
||||||
|
version = "0.1-632217602";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/facts-db/cl-lessp/archive/632217602b85b679e8d420654a0aa39e798ca3b5.tar.gz";
|
||||||
|
sha256 = "09z1vwzjm7hlb529jl3hcjnfd11gh128lmdg51im7ar4jv4746iw";
|
||||||
|
};
|
||||||
|
lispLibs = [ self.lessp self.rollback ] ++ [ super.local-time ];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-fuse = build-with-compile-into-pwd {
|
||||||
|
inherit (super.cl-fuse) pname version src lispLibs;
|
||||||
|
nativeBuildInputs = [ pkgs.fuse ];
|
||||||
|
nativeLibs = [ pkgs.fuse ];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-containers = build-asdf-system {
|
||||||
|
inherit (super.cl-containers) pname version src;
|
||||||
|
lispLibs = super.cl-containers.lispLibs ++ [ super.moptilities ];
|
||||||
|
systems = [ "cl-containers" "cl-containers/with-moptilities" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
swank = build-with-compile-into-pwd {
|
||||||
|
inherit (super.swank) pname version src lispLibs;
|
||||||
|
patches = [ ./patches/swank-pure-paths.patch ];
|
||||||
|
postConfigure = ''
|
||||||
|
substituteAllInPlace swank-loader.lisp
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
clx-truetype = build-asdf-system {
|
||||||
|
pname = "clx-truetype";
|
||||||
|
version = "20160825-git";
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "http://beta.quicklisp.org/archive/clx-truetype/2016-08-25/clx-truetype-20160825-git.tgz";
|
||||||
|
sha256 = "079hyp92cjkdfn6bhkxsrwnibiqbz4y4af6nl31lzw6nm91j5j37";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
alexandria bordeaux-threads cl-aa cl-fad cl-paths cl-paths-ttf
|
||||||
|
cl-store cl-vectors clx trivial-features zpb-ttf
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
mathkit = build-asdf-system {
|
||||||
|
inherit (super.mathkit) pname version src asds ;
|
||||||
|
lispLibs = super.mathkit.lispLibs ++ [ super.sb-cga ];
|
||||||
|
};
|
||||||
|
|
||||||
|
nyxt-gtk = build-asdf-system {
|
||||||
|
inherit (super.nyxt) pname;
|
||||||
|
version = "2.2.4";
|
||||||
|
|
||||||
|
lispLibs = super.nyxt.lispLibs ++ (with super; [
|
||||||
|
cl-cffi-gtk cl-webkit2 mk-string-metrics cl-css
|
||||||
|
]);
|
||||||
|
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/atlas-engineer/nyxt/archive/2.2.4.tar.gz";
|
||||||
|
sha256 = "12l7ir3q29v06jx0zng5cvlbmap7p709ka3ik6x29lw334qshm9b";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.makeWrapper
|
||||||
|
|
||||||
|
# needed for GSETTINGS_SCHEMAS_PATH
|
||||||
|
pkgs.gsettings-desktop-schemas pkgs.glib pkgs.gtk3
|
||||||
|
|
||||||
|
# needed for XDG_ICON_DIRS
|
||||||
|
pkgs.gnome.adwaita-icon-theme
|
||||||
|
];
|
||||||
|
|
||||||
|
buildScript = pkgs.writeText "build-nyxt.lisp" ''
|
||||||
|
(load "${spec.asdf}")
|
||||||
|
(asdf:load-system :nyxt/gtk-application)
|
||||||
|
(sb-ext:save-lisp-and-die "nyxt" :executable t
|
||||||
|
#+sb-core-compression :compression
|
||||||
|
#+sb-core-compression t
|
||||||
|
:toplevel #'nyxt:entry-point)
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Run with WEBKIT_FORCE_SANDBOX=0 if getting a runtime error
|
||||||
|
# See https://github.com/atlas-engineer/nyxt/issues/1781
|
||||||
|
# TODO(kasper): use wrapGAppsHook
|
||||||
|
installPhase = super.nyxt.installPhase + ''
|
||||||
|
rm -v $out/nyxt
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp -v nyxt $out/bin
|
||||||
|
wrapProgram $out/bin/nyxt \
|
||||||
|
--prefix LD_LIBRARY_PATH : $LD_LIBRARY_PATH \
|
||||||
|
--prefix XDG_DATA_DIRS : $XDG_ICON_DIRS \
|
||||||
|
--prefix XDG_DATA_DIRS : $GSETTINGS_SCHEMAS_PATH \
|
||||||
|
--prefix GIO_EXTRA_MODULES ":" ${pkgs.dconf.lib}/lib/gio/modules/ \
|
||||||
|
--prefix GIO_EXTRA_MODULES ":" ${pkgs.glib-networking}/lib/gio/modules/
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
nyxt = self.nyxt-gtk;
|
||||||
|
|
||||||
|
ltk = super.ltk.overrideLispAttrs (o: {
|
||||||
|
src = pkgs.fetchzip {
|
||||||
|
url = "https://github.com/uthar/ltk/archive/f19162e76d6c7c2f51bd289b811d9ba20dd6555e.tar.gz";
|
||||||
|
sha256 = "0mzikv4abq9yqlj6dsji1wh34mjizr5prv6mvzzj29z1485fh1bj";
|
||||||
|
};
|
||||||
|
version = "f19162e76";
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
qt = let
|
||||||
|
rev = "dffff3ee3dbd0686c85c323f579b8bbf4881e60e";
|
||||||
|
in build-with-compile-into-pwd rec {
|
||||||
|
pname = "commonqt";
|
||||||
|
version = builtins.substring 0 7 rev;
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
inherit rev;
|
||||||
|
owner = pname;
|
||||||
|
repo = pname;
|
||||||
|
hash = "sha256-GAgwT0D9mIkYPTHfCH/KxxIv7b6QGwcxwZE7ehH5xug=";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [ pkgs.qt4 ];
|
||||||
|
nativeBuildInputs = [ pkgs.smokegen pkgs.smokeqt ];
|
||||||
|
nativeLibs = [ pkgs.qt4 pkgs.smokegen pkgs.smokeqt ];
|
||||||
|
|
||||||
|
systems = [ "qt" ];
|
||||||
|
|
||||||
|
lispLibs = with super; [
|
||||||
|
cffi named-readtables cl-ppcre alexandria
|
||||||
|
closer-mop iterate trivial-garbage bordeaux-threads
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
qt-libs = build-with-compile-into-pwd {
|
||||||
|
inherit (super.qt-libs) pname version src;
|
||||||
|
patches = [ ./patches/qt-libs-dont-download.patch ];
|
||||||
|
prePatch = ''
|
||||||
|
substituteInPlace systems/*.asd --replace ":qt+libs" ":qt"
|
||||||
|
'';
|
||||||
|
lispLibs = super.qt-libs.lispLibs ++ [ self.qt ];
|
||||||
|
systems = [
|
||||||
|
"qt-libs"
|
||||||
|
"commonqt"
|
||||||
|
# "phonon"
|
||||||
|
# "qimageblitz"
|
||||||
|
# "qsci"
|
||||||
|
"qt3support"
|
||||||
|
"qtcore"
|
||||||
|
"qtdbus"
|
||||||
|
"qtdeclarative"
|
||||||
|
"qtgui"
|
||||||
|
"qthelp"
|
||||||
|
"qtnetwork"
|
||||||
|
"qtopengl"
|
||||||
|
"qtscript"
|
||||||
|
"qtsql"
|
||||||
|
"qtsvg"
|
||||||
|
"qttest"
|
||||||
|
"qtuitools"
|
||||||
|
# "qtwebkit"
|
||||||
|
"qtxml"
|
||||||
|
"qtxmlpatterns"
|
||||||
|
# "qwt"
|
||||||
|
"smokebase"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
commonqt = self.qt-libs;
|
||||||
|
qt3support = self.qt-libs;
|
||||||
|
qtcore = self.qt-libs;
|
||||||
|
qtdbus = self.qt-libs;
|
||||||
|
qtdeclarative = self.qt-libs;
|
||||||
|
qtgui = self.qt-libs;
|
||||||
|
qthelp = self.qt-libs;
|
||||||
|
qtnetwork = self.qt-libs;
|
||||||
|
qtopengl = self.qt-libs;
|
||||||
|
qtscript = self.qt-libs;
|
||||||
|
qtsql = self.qt-libs;
|
||||||
|
qtsvg = self.qt-libs;
|
||||||
|
qttest = self.qt-libs;
|
||||||
|
qtuitools = self.qt-libs;
|
||||||
|
qtxml = self.qt-libs;
|
||||||
|
qtxmlpatterns = self.qt-libs;
|
||||||
|
smokebase = self.qt-libs;
|
||||||
|
|
||||||
|
qtools = build-with-compile-into-pwd {
|
||||||
|
inherit (super.qtools) pname version src nativeLibs;
|
||||||
|
lispLibs = [ self.qt ] ++ remove super.qt_plus_libs super.qtools.lispLibs ++ [ self.qt-libs ];
|
||||||
|
patches = [ ./patches/qtools-use-nix-libs.patch ];
|
||||||
|
};
|
||||||
|
|
||||||
|
magicl = build-with-compile-into-pwd {
|
||||||
|
inherit (super.magicl) pname version src lispLibs;
|
||||||
|
nativeBuildInputs = [ pkgs.gfortran ];
|
||||||
|
nativeLibs = [ pkgs.openblas ];
|
||||||
|
patches = [ ./patches/magicl-dont-build-fortran-twice.patch ];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-gtk4 = build-asdf-system {
|
||||||
|
pname = "cl-gtk4";
|
||||||
|
version = "1.0.0";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "bohonghuang";
|
||||||
|
repo = "cl-gtk4";
|
||||||
|
rev = "6e11b0d92ccf7cacee5c7f03d50148d68fe8e04d";
|
||||||
|
hash = "sha256-d/DYV1aQAir4mszsw1wEotxxBW9jGiFjELB04/PRBQ4=";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
cl-gobject-introspection-wrapper
|
||||||
|
cl-glib_dot_gio
|
||||||
|
];
|
||||||
|
nativeBuildInputs = [
|
||||||
|
pkgs.gobject-introspection
|
||||||
|
pkgs.gtk4
|
||||||
|
];
|
||||||
|
nativeLibs = [
|
||||||
|
pkgs.gtk4
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-gtk4_dot_adw = build-asdf-system {
|
||||||
|
pname = "cl-gtk4.adw";
|
||||||
|
version = "1.0.0";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "bohonghuang";
|
||||||
|
repo = "cl-gtk4";
|
||||||
|
rev = "6e11b0d92ccf7cacee5c7f03d50148d68fe8e04d";
|
||||||
|
hash = "sha256-d/DYV1aQAir4mszsw1wEotxxBW9jGiFjELB04/PRBQ4=";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
cl-gobject-introspection-wrapper
|
||||||
|
] ++ [ self.cl-gtk4 ];
|
||||||
|
nativeBuildInputs = [
|
||||||
|
pkgs.libadwaita
|
||||||
|
];
|
||||||
|
nativeLibs = [
|
||||||
|
pkgs.libadwaita
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-gtk4_dot_webkit2 = build-asdf-system {
|
||||||
|
pname = "cl-gtk4.webkit2";
|
||||||
|
version = "1.0.0";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "bohonghuang";
|
||||||
|
repo = "cl-gtk4";
|
||||||
|
rev = "6e11b0d92ccf7cacee5c7f03d50148d68fe8e04d";
|
||||||
|
hash = "sha256-d/DYV1aQAir4mszsw1wEotxxBW9jGiFjELB04/PRBQ4=";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
cl-gobject-introspection-wrapper
|
||||||
|
] ++ [ self.cl-gtk4 ];
|
||||||
|
nativeBuildInputs = [
|
||||||
|
pkgs.webkitgtk_5_0
|
||||||
|
];
|
||||||
|
nativeLibs = [
|
||||||
|
pkgs.webkitgtk_5_0
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
cl-avro = build-asdf-system {
|
||||||
|
pname = "cl-avro";
|
||||||
|
version = "trunk";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "SahilKang";
|
||||||
|
repo = "cl-avro";
|
||||||
|
rev = "7d624253e98afb987a01729bd72c99bae02f0d7d";
|
||||||
|
hash = "sha256-AlTn+Q1gKnAFEfcnz9+VeHz681pPIirg2za3VXYiNWk=";
|
||||||
|
};
|
||||||
|
lispLibs = with super; [
|
||||||
|
alexandria
|
||||||
|
babel
|
||||||
|
chipz
|
||||||
|
closer-mop
|
||||||
|
ieee-floats
|
||||||
|
flexi-streams
|
||||||
|
local-time
|
||||||
|
local-time-duration
|
||||||
|
md5
|
||||||
|
salza2
|
||||||
|
st-json
|
||||||
|
time-interval
|
||||||
|
trivial-extensible-sequences
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
in packages
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
--- a/src/ffi/grovel/grovel-freetype.h
|
||||||
|
+++ b/src/ffi/grovel/grovel-freetype.h
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
#include <ft2build.h>
|
||||||
|
#include FT_FREETYPE_H
|
||||||
|
|
||||||
|
-#include <ftsystem.h>
|
||||||
|
-#include <fttypes.h>
|
||||||
|
-#include <ftlist.h>
|
||||||
|
-#include <ftimage.h>
|
||||||
|
+#include <freetype/ftsystem.h>
|
||||||
|
+#include <freetype/fttypes.h>
|
||||||
|
+#include <freetype/ftlist.h>
|
||||||
|
+#include <freetype/ftimage.h>
|
||||||
|
|
||||||
|
Diff finished. Mon Nov 14 22:41:57 2022
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
Fix system not loading due to:
|
||||||
|
|
||||||
|
Unhandled CFFI:LOAD-FOREIGN-LIBRARY-ERROR
|
||||||
|
Unable to load foreign library (LIBALLEGRO-NUKLEAR).
|
||||||
|
Error opening shared object "/build/source/src/liballegro_nuklear.so":
|
||||||
|
/build/source/src/liballegro_nuklear.so: undefined symbol: al_draw_ellipse.
|
||||||
|
--- a/cl-liballegro-nuklear.asd
|
||||||
|
+++ b/cl-liballegro-nuklear.asd
|
||||||
|
@@ -12,7 +12,7 @@
|
||||||
|
:description "CFFI wrapper for the Nuklear IM GUI library with liballegro backend, to be used with cl-liballegro."
|
||||||
|
:author "Andrew Kravchuk <awkravchuk@gmail.com>"
|
||||||
|
:license "MIT"
|
||||||
|
- :depends-on (:cffi :cffi-libffi :trivial-features)
|
||||||
|
+ :depends-on (:cl-liballegro :cffi :cffi-libffi :trivial-features)
|
||||||
|
:pathname "src"
|
||||||
|
:serial t
|
||||||
|
:components ((:makefile "Makefile")
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
From 2040fcab5a7be2f28add46a1412bef62ac5ccf11 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Marx <mmarx@wh2.tu-dresden.de>
|
||||||
|
Date: Thu, 24 Nov 2022 20:00:33 +0100
|
||||||
|
Subject: [PATCH] Use glucose binary from PATH if present
|
||||||
|
|
||||||
|
---
|
||||||
|
src/package.lisp | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/package.lisp b/src/package.lisp
|
||||||
|
index b6e26ac..bdb2581 100644
|
||||||
|
--- a/src/package.lisp
|
||||||
|
+++ b/src/package.lisp
|
||||||
|
@@ -13,7 +13,9 @@
|
||||||
|
(defvar *glucose-home* (asdf:system-relative-pathname :cl-sat.glucose "glucose-syrup/"))
|
||||||
|
|
||||||
|
(defun glucose-binary (&optional (*glucose-home* *glucose-home*))
|
||||||
|
- (merge-pathnames "simp/glucose_static" *glucose-home*))
|
||||||
|
+ (if (trivial-package-manager:which "glucose")
|
||||||
|
+ "glucose"
|
||||||
|
+ (merge-pathnames "simp/glucose_static" *glucose-home*)))
|
||||||
|
|
||||||
|
(defmethod solve ((input pathname) (solver (eql :glucose)) &rest options &key debug &allow-other-keys)
|
||||||
|
(remf options :debug)
|
||||||
|
--
|
||||||
|
2.36.2
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
--- a/magicl.asd
|
||||||
|
+++ b/magicl.asd
|
||||||
|
@@ -143,6 +143,7 @@
|
||||||
|
(shared-object (make-pathname :type #+darwin "dylib" #-darwin "so"
|
||||||
|
:name "libexpokit"
|
||||||
|
:defaults fortran-file)))
|
||||||
|
+ (unless (probe-file (nn shared-object))
|
||||||
|
(uiop:run-program
|
||||||
|
(list "gfortran" "-fPIC" "-std=legacy"
|
||||||
|
"-c"
|
||||||
|
@@ -155,7 +156,7 @@
|
||||||
|
(nn object-file)
|
||||||
|
#+darwin "-lblas"
|
||||||
|
#+darwin "-llapack"))
|
||||||
|
- (delete-file object-file))))
|
||||||
|
+ (delete-file object-file)))))
|
||||||
|
|
||||||
|
|
||||||
|
(asdf:defsystem #:magicl/ext-expokit
|
||||||
|
|
||||||
|
Diff finished. Mon Oct 10 22:03:54 2022
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
--- a/qt-libs.asd
|
||||||
|
+++ b/qt-libs.asd
|
||||||
|
@@ -17,5 +17,4 @@
|
||||||
|
:components ((:file "qt-libs"))
|
||||||
|
:depends-on (:qt-lib-generator
|
||||||
|
:cl-ppcre
|
||||||
|
- :cffi)
|
||||||
|
- :perform (asdf:load-op :after (op c) (uiop:symbol-call :qt-libs :ensure-standalone-libs)))
|
||||||
|
+ :cffi))
|
||||||
|
--- a/qt-libs.lisp
|
||||||
|
+++ b/qt-libs.lisp
|
||||||
|
@@ -94,16 +94,14 @@
|
||||||
|
standalone-dir)
|
||||||
|
|
||||||
|
(defun %ensure-lib-loaded (file)
|
||||||
|
- (let ((file (etypecase file
|
||||||
|
- (pathname file)
|
||||||
|
- (string (installed-library-file file))))
|
||||||
|
- (name (intern (string-upcase (pathname-name file))))
|
||||||
|
- #+sbcl(sb-ext:*muffled-warnings* 'style-warning))
|
||||||
|
- (cffi::register-foreign-library
|
||||||
|
- name `((T ,file))
|
||||||
|
- :search-path (to-directory file))
|
||||||
|
- (unless (cffi:foreign-library-loaded-p name)
|
||||||
|
- (cffi:load-foreign-library name))))
|
||||||
|
+ (let ((name (make-pathname :name (format nil "lib~a" file)
|
||||||
|
+ :type #+unix "so"
|
||||||
|
+ #+darwin "dylib")))
|
||||||
|
+ (or (find-if (lambda (lib)
|
||||||
|
+ (equal (cffi:foreign-library-pathname lib)
|
||||||
|
+ (namestring name)))
|
||||||
|
+ (cffi:list-foreign-libraries))
|
||||||
|
+ (cffi:load-foreign-library name))))
|
||||||
|
|
||||||
|
(defun ensure-lib-loaded (file)
|
||||||
|
(cond ((pathnamep file)
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
Dont use the qt+libs system for managing Qt dependencies, because Nix provides
|
||||||
|
them already.
|
||||||
|
Don't build the deploy.lisp helper file, because Nix also can handle deployment.
|
||||||
|
--- a/qtools.asd
|
||||||
|
+++ b/qtools.asd
|
||||||
|
@@ -33,10 +33,9 @@
|
||||||
|
(:file "generate")
|
||||||
|
(:file "dynamic")
|
||||||
|
(:file "precompile")
|
||||||
|
- (:file "deploy")
|
||||||
|
(:file "fast-call")
|
||||||
|
(:file "documentation"))
|
||||||
|
- :depends-on (:qt+libs
|
||||||
|
+ :depends-on (:qt
|
||||||
|
:deploy
|
||||||
|
:cl-ppcre
|
||||||
|
:closer-mop
|
||||||
|
|
||||||
|
Diff finished. Sun Oct 2 14:38:06 2022
|
||||||
28
pkgs/development/lisp-modules/patches/swank-pure-paths.patch
Normal file
28
pkgs/development/lisp-modules/patches/swank-pure-paths.patch
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Prevent swank from attempting write into storeDir
|
||||||
|
--- a/swank-loader.lisp
|
||||||
|
+++ b/swank-loader.lisp
|
||||||
|
@@ -162,7 +162,7 @@
|
||||||
|
,(unique-dir-name)))
|
||||||
|
(user-homedir-pathname)))
|
||||||
|
|
||||||
|
-(defvar *fasl-directory* (default-fasl-dir)
|
||||||
|
+(defvar *fasl-directory* #P"@out@/fasl/"
|
||||||
|
"The directory where fasl files should be placed.")
|
||||||
|
|
||||||
|
(defun binary-pathname (src-pathname binary-dir)
|
||||||
|
@@ -284,12 +284,7 @@
|
||||||
|
(contrib-dir src-dir))))
|
||||||
|
|
||||||
|
(defun delete-stale-contrib-fasl-files (swank-files contrib-files fasl-dir)
|
||||||
|
- (let ((newest (reduce #'max (mapcar #'file-write-date swank-files))))
|
||||||
|
- (dolist (src contrib-files)
|
||||||
|
- (let ((fasl (binary-pathname src fasl-dir)))
|
||||||
|
- (when (and (probe-file fasl)
|
||||||
|
- (<= (file-write-date fasl) newest))
|
||||||
|
- (delete-file fasl))))))
|
||||||
|
+ (declare (ignore swank-files contrib-files fasl-dir)))
|
||||||
|
|
||||||
|
(defun compile-contribs (&key (src-dir (contrib-dir *source-directory*))
|
||||||
|
(fasl-dir (contrib-dir *fasl-directory*))
|
||||||
|
|
||||||
|
Diff finished. Sat Jan 22 23:57:27 2022
|
||||||
6
pkgs/development/lisp-modules/ql-import.lisp
Normal file
6
pkgs/development/lisp-modules/ql-import.lisp
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
(load (sb-ext:posix-getenv "ASDF"))
|
||||||
|
(pushnew (truename "./import") asdf:*central-registry*)
|
||||||
|
(asdf:load-system :org.lispbuilds.nix)
|
||||||
|
(load "./import/main.lisp")
|
||||||
|
(org.lispbuilds.nix/main::main)
|
||||||
206
pkgs/development/lisp-modules/ql.nix
Normal file
206
pkgs/development/lisp-modules/ql.nix
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
{ pkgs, lib, build-asdf-system, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
# FIXME: automatically add nativeLibs based on conditions signalled
|
||||||
|
|
||||||
|
overrides = (self: super: {
|
||||||
|
cl_plus_ssl = super.cl_plus_ssl.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.openssl ];
|
||||||
|
});
|
||||||
|
cl-cffi-gtk-glib = super.cl-cffi-gtk-glib.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.glib ];
|
||||||
|
});
|
||||||
|
cl-cffi-gtk-cairo = super.cl-cffi-gtk-cairo.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.cairo ];
|
||||||
|
});
|
||||||
|
cl-cairo2 = super.cl-cairo2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.cairo ];
|
||||||
|
});
|
||||||
|
cl-cairo2-xlib = super.cl-cairo2-xlib.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.gtk2-x11 ];
|
||||||
|
});
|
||||||
|
cl-freeimage = super.cl-freeimage.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.freeimage ];
|
||||||
|
});
|
||||||
|
cl-freetype2 = super.cl-freetype2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.freetype ];
|
||||||
|
nativeBuildInputs = [ pkgs.freetype ];
|
||||||
|
patches = [ ./patches/cl-freetype2-fix-grovel-includes.patch ];
|
||||||
|
});
|
||||||
|
cl-pango = super.cl-pango.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.pango ];
|
||||||
|
});
|
||||||
|
cl-gtk2-gdk = super.cl-gtk2-gdk.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.gtk2-x11 ];
|
||||||
|
});
|
||||||
|
cl-gtk2-glib = super.cl-gtk2-glib.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.glib ];
|
||||||
|
});
|
||||||
|
cl-gtk2-pango = super.cl-gtk2-pango.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.pango ];
|
||||||
|
});
|
||||||
|
cl-rsvg2 = super.cl-rsvg2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.librsvg ];
|
||||||
|
});
|
||||||
|
cl-cffi-gtk-gdk = super.cl-cffi-gtk-gdk.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.gtk3 ];
|
||||||
|
});
|
||||||
|
cl-cffi-gtk-gdk-pixbuf = super.cl-cffi-gtk-gdk-pixbuf.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.gdk-pixbuf ];
|
||||||
|
});
|
||||||
|
cl-cffi-gtk-pango = super.cl-cffi-gtk-pango.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.pango ];
|
||||||
|
});
|
||||||
|
cl-gobject-introspection = super.cl-gobject-introspection.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.glib pkgs.gobject-introspection ];
|
||||||
|
});
|
||||||
|
cl-mysql = super.cl-mysql.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.mysql-client ];
|
||||||
|
});
|
||||||
|
clsql-postgresql = super.clsql-postgresql.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.postgresql.lib ];
|
||||||
|
});
|
||||||
|
clsql-sqlite3 = super.clsql-sqlite3.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.sqlite ];
|
||||||
|
});
|
||||||
|
cl-webkit2 = super.cl-webkit2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.webkitgtk ];
|
||||||
|
});
|
||||||
|
dbd-mysql = super.dbd-mysql.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.mysql-client ];
|
||||||
|
});
|
||||||
|
lla = super.lla.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.openblas ];
|
||||||
|
});
|
||||||
|
cffi-libffi = super.cffi-libffi.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.libffi ];
|
||||||
|
nativeLibs = [ pkgs.libffi ];
|
||||||
|
});
|
||||||
|
cl-rabbit = super.cl-rabbit.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.rabbitmq-c ];
|
||||||
|
nativeLibs = [ pkgs.rabbitmq-c ];
|
||||||
|
});
|
||||||
|
trivial-ssh-libssh2 = super.trivial-ssh-libssh2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libssh2 ];
|
||||||
|
});
|
||||||
|
sqlite = super.sqlite.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.sqlite ];
|
||||||
|
});
|
||||||
|
cl-libuv = super.cl-libuv.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.libuv ];
|
||||||
|
nativeLibs = [ pkgs.libuv ];
|
||||||
|
});
|
||||||
|
cl-liballegro = super.cl-liballegro.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.allegro5 ];
|
||||||
|
});
|
||||||
|
cl-ode = super.cl-ode.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = let
|
||||||
|
ode' = pkgs.ode.overrideAttrs (o: {
|
||||||
|
configureFlags = [
|
||||||
|
"--enable-shared"
|
||||||
|
"--enable-double-precision"
|
||||||
|
];
|
||||||
|
});
|
||||||
|
in [ ode' ];
|
||||||
|
});
|
||||||
|
classimp = super.classimp.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.assimp ];
|
||||||
|
});
|
||||||
|
sdl2 = super.sdl2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.SDL2 ];
|
||||||
|
});
|
||||||
|
lispbuilder-sdl-cffi = super.lispbuilder-sdl-cffi.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.SDL ];
|
||||||
|
});
|
||||||
|
cl-opengl = super.cl-opengl.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libGL ];
|
||||||
|
});
|
||||||
|
cl-glu = super.cl-glu.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libGLU ];
|
||||||
|
});
|
||||||
|
cl-glut = super.cl-glut.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.freeglut ];
|
||||||
|
});
|
||||||
|
cl-glfw = super.cl-glfw.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.glfw ];
|
||||||
|
});
|
||||||
|
cl-glfw-opengl-core = super.cl-glfw-opengl-core.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libGL ];
|
||||||
|
});
|
||||||
|
cl-glfw3 = super.cl-glfw3.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.glfw ];
|
||||||
|
});
|
||||||
|
lev = super.lev.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libev ];
|
||||||
|
});
|
||||||
|
cl-rdkafka = super.cl-rdkafka.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.rdkafka ];
|
||||||
|
nativeLibs = [ pkgs.rdkafka ];
|
||||||
|
});
|
||||||
|
cl-async-ssl = super.cl-async-ssl.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.openssl ];
|
||||||
|
});
|
||||||
|
iolib = super.iolib.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.libfixposix ];
|
||||||
|
nativeLibs = [ pkgs.libfixposix ];
|
||||||
|
systems = [ "iolib" "iolib/os" "iolib/pathnames" ];
|
||||||
|
});
|
||||||
|
cl-ana_dot_hdf-cffi = super.cl-ana_dot_hdf-cffi.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.hdf5 ];
|
||||||
|
nativeLibs = [ pkgs.hdf5 ];
|
||||||
|
NIX_LDFLAGS = [ "-lhdf5" ];
|
||||||
|
});
|
||||||
|
gsll = super.gsll.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.gsl ];
|
||||||
|
nativeLibs = [ pkgs.gsl ];
|
||||||
|
});
|
||||||
|
cl-libyaml = super.cl-libyaml.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libyaml ];
|
||||||
|
});
|
||||||
|
cl-libxml2 = super.cl-libxml2.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libxml2 ];
|
||||||
|
});
|
||||||
|
cl-readline = super.cl-readline.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.readline ];
|
||||||
|
});
|
||||||
|
md5 = super.md5.overrideLispAttrs (o: {
|
||||||
|
lispLibs = [ super.flexi-streams ];
|
||||||
|
});
|
||||||
|
pzmq = super.pzmq.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.zeromq ];
|
||||||
|
nativeLibs = [ pkgs.zeromq ];
|
||||||
|
});
|
||||||
|
pzmq-compat = super.pzmq-compat.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.zeromq ];
|
||||||
|
nativeLibs = [ pkgs.zeromq ];
|
||||||
|
});
|
||||||
|
pzmq-examples = super.pzmq-examples.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.zeromq ];
|
||||||
|
nativeLibs = [ pkgs.zeromq ];
|
||||||
|
});
|
||||||
|
pzmq-test = super.pzmq-test.overrideLispAttrs (o: {
|
||||||
|
nativeBuildInputs = [ pkgs.zeromq ];
|
||||||
|
nativeLibs = [ pkgs.zeromq ];
|
||||||
|
});
|
||||||
|
cl-git = super.cl-git.overrideLispAttrs (o: {
|
||||||
|
nativeLibs = [ pkgs.libgit2 ];
|
||||||
|
});
|
||||||
|
trivial-package-manager = super.trivial-package-manager.overrideLispAttrs (o: {
|
||||||
|
propagatedBuildInputs = [ pkgs.which ];
|
||||||
|
});
|
||||||
|
cl-sat_dot_glucose = super.cl-sat_dot_glucose.overrideLispAttrs (o: {
|
||||||
|
propagatedBuildInputs = [ pkgs.glucose ];
|
||||||
|
patches = [ ./patches/cl-sat-binary-from-path.patch ];
|
||||||
|
});
|
||||||
|
cl-sat_dot_minisat = super.cl-sat_dot_minisat.overrideLispAttrs (o: {
|
||||||
|
propagatedBuildInputs = [ pkgs.minisat ];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
qlpkgs =
|
||||||
|
if builtins.pathExists ./imported.nix
|
||||||
|
then pkgs.callPackage ./imported.nix { inherit build-asdf-system; }
|
||||||
|
else {};
|
||||||
|
|
||||||
|
in qlpkgs.overrideScope' overrides
|
||||||
56
pkgs/development/lisp-modules/setup-hook.sh
Normal file
56
pkgs/development/lisp-modules/setup-hook.sh
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# This setup hook adds every propagated lisp system to CL_SOURCE_REGISTRY
|
||||||
|
|
||||||
|
buildAsdfPath () {
|
||||||
|
declare -A seen=()
|
||||||
|
for dep in $propagatedBuildInputs; do
|
||||||
|
_addToAsdfPath $dep
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
addFileToSearchPathWithCustomDelimiter() {
|
||||||
|
local delimiter="$1"
|
||||||
|
local varName="$2"
|
||||||
|
local file="$3"
|
||||||
|
if [[ -f "$file" && "${!varName:+${delimiter}${!varName}${delimiter}}" \
|
||||||
|
!= *"${delimiter}${file}${delimiter}"* ]]; then
|
||||||
|
export "${varName}=${!varName:+${!varName}${delimiter}}${file}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
addFileToSearchPath() {
|
||||||
|
addFileToSearchPathWithCustomDelimiter ":" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
_addToAsdfPath () {
|
||||||
|
local dep="$1"
|
||||||
|
if [ -v seen[$dep] ]; then
|
||||||
|
return
|
||||||
|
else
|
||||||
|
seen[$dep]=1
|
||||||
|
local path="$dep"
|
||||||
|
|
||||||
|
# FIXME slow
|
||||||
|
|
||||||
|
while read file; do
|
||||||
|
case "${file##*.}" in
|
||||||
|
jar) addFileToSearchPath "CLASSPATH" "$file" ;;
|
||||||
|
class) addToSearchPath "CLASSPATH" "${file%/*}" ;;
|
||||||
|
so) addToSearchPath "LD_LIBRARY_PATH" "${file%/*}" ;;
|
||||||
|
dylib) addToSearchPath "DYLD_LIBRARY_PATH" "${file%/*}" ;;
|
||||||
|
asd) addToSearchPath "CL_SOURCE_REGISTRY" "$path//" ;;
|
||||||
|
esac
|
||||||
|
done < <(find "$path" -type f,l -name '*.asd' -o -name '*.jar' \
|
||||||
|
-o -name '*.class' -o -name '*.so' -o -name '*.dylib')
|
||||||
|
|
||||||
|
local prop="$dep/nix-support/propagated-build-inputs"
|
||||||
|
|
||||||
|
if [ -e "$prop" ]; then
|
||||||
|
local new_system
|
||||||
|
for new_system in $(cat $prop); do
|
||||||
|
_addToAsdfPath "$new_system"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# addEnvHooks "$targetOffset" buildAsdfPath
|
||||||
16
pkgs/development/lisp-modules/shell.nix
Normal file
16
pkgs/development/lisp-modules/shell.nix
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
let
|
||||||
|
pkgs = import ../../../. {};
|
||||||
|
in pkgs.mkShell {
|
||||||
|
nativeBuildInputs = [
|
||||||
|
(pkgs.sbcl.withPackages
|
||||||
|
(ps: with ps; [
|
||||||
|
alexandria
|
||||||
|
str
|
||||||
|
dexador
|
||||||
|
cl-ppcre
|
||||||
|
sqlite
|
||||||
|
arrow-macros
|
||||||
|
jzon
|
||||||
|
]))
|
||||||
|
];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user