nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at netboot-syslinux-multiplatform 162 lines 5.6 kB view raw
1(defpackage org.lispbuilds.nix/database/sqlite 2 (:use :cl) 3 (:import-from :str) 4 (:import-from :sqlite) 5 (:import-from :alexandria :read-file-into-string) 6 (:import-from :arrow-macros :->>) 7 (:import-from 8 :org.lispbuilds.nix/util 9 :replace-regexes) 10 (:import-from 11 :org.lispbuilds.nix/nix 12 :nix-eval 13 :system-master 14 :nixify-symbol 15 :make-pname 16 :*nix-attrs-depth*) 17 (:import-from 18 :org.lispbuilds.nix/api 19 :database->nix-expression) 20 (:export :sqlite-database :init-db) 21 (:local-nicknames 22 (:json :com.inuoe.jzon))) 23 24(in-package org.lispbuilds.nix/database/sqlite) 25 26(defclass sqlite-database () 27 ((url :initarg :url 28 :reader database-url 29 :initform (error "url required")) 30 (init-file :initarg :init-file 31 :reader init-file 32 :initform (error "init file required")))) 33 34(defun init-db (db init-file) 35 (let ((statements (->> (read-file-into-string init-file) 36 (replace-regexes '(".*--.*") '("")) 37 (substitute #\Space #\Newline) 38 (str:collapse-whitespaces) 39 (str:split #\;) 40 (mapcar #'str:trim) 41 (remove-if #'str:emptyp)))) 42 (sqlite:with-transaction db 43 (dolist (s statements) 44 (sqlite:execute-non-query db s))))) 45 46 47;; Writing Nix 48 49(defparameter prelude " 50# This file was auto-generated by nix-quicklisp.lisp 51 52{ runCommand, fetchzip, pkgs, ... }: 53 54# Ensures that every non-slashy `system` exists in a unique .asd file. 55# (Think cl-async-base being declared in cl-async.asd upstream) 56# 57# This is required because we're building and loading a system called 58# `system`, not `asd`, so otherwise `system` would not be loadable 59# without building and loading `asd` first. 60# 61let createAsd = { url, sha256, asd, system }: 62 let 63 src = fetchzip { inherit url sha256; }; 64 in runCommand \"source\" {} '' 65 mkdir -pv $out 66 cp -r ${src}/* $out 67 find $out -name \"${asd}.asd\" | while read f; do mv -fv $f $(dirname $f)/${system}.asd || true; done 68 ''; 69 70getAttr = builtins.getAttr; 71 72in {") 73 74;; Random compilation errors 75(defparameter +broken-packages+ 76 (list 77 ;; no dispatch function defined for #\t 78 "hu.dwim.logger" 79 "hu.dwim.serializer" 80 "hu.dwim.quasi-quote" 81 ;; Tries to write in $HOME 82 "ubiquitous" 83 "math" 84 ;; Upstream bad packaging, multiple systems in clml.blas.asd 85 "clml.blas.hompack" 86 ;; Fails on SBCL due to heap exhaustion 87 "magicl" 88 ;; Probably missing dependency in QL data 89 "mcclim-bezier" 90 ;; Missing dependency on c2ffi cffi extension 91 "hu.dwim.zlib" 92 ;; Missing libgvc.so native library 93 "hu.dwim.graphviz" 94 ;; These require libRmath.so, but I don't know where to get it from 95 "cl-random" 96 "cl-random-tests" 97 )) 98 99(defmethod database->nix-expression ((database sqlite-database) outfile) 100 (sqlite:with-open-database (db (database-url database)) 101 (with-open-file (f outfile 102 :direction :output 103 :if-exists :supersede) 104 105 ;; Fix known problematic packages before dumping the nix file. 106 (sqlite:execute-non-query db 107 "create temp table fixed_systems as select * from system_view") 108 109 (sqlite:execute-non-query db 110 "alter table fixed_systems add column systems") 111 112 (sqlite:execute-non-query db 113 "update fixed_systems set systems = json_array(name)") 114 115 (sqlite:execute-non-query db 116 "alter table fixed_systems add column asds") 117 118 (sqlite:execute-non-query db 119 "update fixed_systems set asds = json_array(name)") 120 121 (format f prelude) 122 123 (dolist (p (sqlite:execute-to-list db "select * from fixed_systems")) 124 (destructuring-bind (name version asd url sha256 deps systems asds) p 125 (format f "~% ") 126 (let ((*nix-attrs-depth* 1)) 127 (format 128 f 129 "~a = ~a;" 130 (nix-eval `(:symbol ,name)) 131 (nix-eval 132 `(:attrs 133 ("pname" (:string ,(make-pname name))) 134 ("version" (:string ,version)) 135 ("asds" (:list 136 ,@(mapcar (lambda (asd) 137 `(:string ,(system-master asd))) 138 (coerce (json:parse asds) 'list)))) 139 ("src" (:funcall 140 "createAsd" 141 (:attrs 142 ("url" (:string ,url)) 143 ("sha256" (:string ,sha256)) 144 ("system" (:string ,(system-master name))) 145 ("asd" (:string ,asd))))) 146 ("systems" (:list 147 ,@(mapcar (lambda (sys) 148 `(:string ,sys)) 149 (coerce (json:parse systems) 'list)))) 150 ("lispLibs" (:list 151 ,@(mapcar (lambda (dep) 152 `(:funcall 153 "getAttr" 154 (:string ,(nixify-symbol dep)) 155 (:symbol "pkgs"))) 156 (remove "asdf" 157 (str:split-omit-nulls #\, deps) 158 :test #'string=)))) 159 ,@(when (or (find #\/ name) 160 (find name +broken-packages+ :test #'string=)) 161 '(("meta" (:attrs ("broken" (:symbol "true")))))))))))) 162 (format f "~%}~%"))))