1{ pkgs, lib, fetchFromGitHub, llvmPackages_15 }:
2
3
4let
5
6 src = fetchFromGitHub {
7 owner = "clasp-developers";
8 repo = "clasp";
9 rev = "2.2.0";
10 hash = "sha256-gvUqUb0dftW1miiBcAPJur0wOunox4y2SUYeeJpR9R4=";
11 };
12
13 reposDirs = [
14 "dependencies"
15 "src/lisp/kernel/contrib"
16 "src/lisp/modules/asdf"
17 "src/mps"
18 "src/bdwgc"
19 "src/libatomic_ops"
20 ];
21
22 reposTarball = llvmPackages_15.stdenv.mkDerivation {
23 pname = "clasp-repos";
24 version = "tarball";
25 inherit src;
26 patches = [ ./clasp-pin-repos-commits.patch ];
27 nativeBuildInputs = with pkgs; [
28 sbcl
29 git
30 cacert
31 ];
32 buildPhase = ''
33 export SOURCE_DATE_EPOCH=1
34 export ASDF_OUTPUT_TRANSLATIONS=$(pwd):$(pwd)/__fasls
35 sbcl --script koga --help
36 for x in {${lib.concatStringsSep "," reposDirs}}; do
37 find $x -type d -name .git -exec rm -rvf {} \; || true
38 done
39 '';
40 installPhase = ''
41 tar --owner=0 --group=0 --numeric-owner --format=gnu \
42 --sort=name --mtime="@$SOURCE_DATE_EPOCH" \
43 -czf $out ${lib.concatStringsSep " " reposDirs}
44 '';
45 outputHashMode = "flat";
46 outputHashAlgo = "sha256";
47 outputHash = "sha256-vgwThjn2h3nKnShtKoHgaPdH/FDHv28fLMQvKFEwG6o=";
48 };
49
50in llvmPackages_15.stdenv.mkDerivation {
51 pname = "clasp";
52 version = "2.2.0";
53 inherit src;
54 nativeBuildInputs = (with pkgs; [
55 sbcl
56 git
57 pkg-config
58 fmt
59 gmpxx
60 libelf
61 boost
62 libunwind
63 ninja
64 ]) ++ (with llvmPackages_15; [
65 llvm
66 libclang
67 ]);
68 configurePhase = ''
69 export SOURCE_DATE_EPOCH=1
70 export ASDF_OUTPUT_TRANSLATIONS=$(pwd):$(pwd)/__fasls
71 tar xf ${reposTarball}
72 sbcl --script koga \
73 --skip-sync \
74 --cc=$NIX_CC/bin/cc \
75 --cxx=$NIX_CC/bin/c++ \
76 --reproducible-build \
77 --package-path=/ \
78 --bin-path=$out/bin \
79 --lib-path=$out/lib \
80 --share-path=$out/share
81'';
82 buildPhase = ''
83 ninja -C build
84'';
85 installPhase = ''
86 ninja -C build install
87'';
88
89 meta = {
90 description = "A Common Lisp implementation based on LLVM with C++ integration";
91 license = lib.licenses.lgpl21Plus ;
92 maintainers = lib.teams.lisp.members;
93 platforms = ["x86_64-linux" "x86_64-darwin"];
94 # Upstream claims support, but breaks with:
95 # error: use of undeclared identifier 'aligned_alloc'
96 broken = llvmPackages_15.stdenv.isDarwin;
97 homepage = "https://github.com/clasp-developers/clasp";
98 };
99
100}
101