1{
2 description = "Janet implementation of Lox, from the book Crafting Interpreters";
3
4 inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
5
6 outputs =
7 { self, nixpkgs }:
8 let
9 forAllSystems =
10 mkOutputs:
11 nixpkgs.lib.genAttrs [
12 "aarch64-linux"
13 "aarch64-darwin"
14 "x86_64-darwin"
15 "x86_64-linux"
16 ] (system: mkOutputs nixpkgs.legacyPackages.${system});
17 in
18 {
19 packages = forAllSystems (pkgs: rec {
20 spork = pkgs.stdenv.mkDerivation rec {
21 pname = "spork";
22 version = "1.0.0";
23 src = pkgs.fetchFromGitHub {
24 owner = "janet-lang";
25 repo = pname;
26 rev = "v${version}";
27 sha256 = "sha256-na1A3JT8FmtsbdAVAXf+MCMdi0dCdBGqmyNg5wZLy6k=";
28 };
29 dontConfigure = true;
30 buildInputs = [ pkgs.janet ];
31 dontBuild = true;
32 installPhase = ''
33 mkdir $out
34 JANET_PATH=$out janet --install .
35 '';
36 doInstallCheck = true;
37 installCheckPhase = ''
38 $out/bin/janet-pm --help
39 '';
40 };
41 lox = pkgs.stdenv.mkDerivation {
42 pname = "lox";
43 version = "0.0.1";
44 src = ./.;
45 dontConfigure = true;
46 buildInputs = [ pkgs.janet ];
47 nativeBuildInputs = [ pkgs.makeWrapper ];
48 installPhase = ''
49 mkdir $out
50 JANET_PATH=$out janet --install .
51 mkdir -p $out/bin
52 mv bin/lox $out/bin/lox
53 wrapProgram $out/bin/lox --set JANET_PATH $out
54 '';
55 doInstallCheck = true;
56 installCheckPhase = ''
57 $out/bin/lox << EOF
58 fun add(x, y) {
59 return x + y;
60 }
61 print add(10, 5);
62 EOF | grep 15
63 '';
64 meta.mainProgram = "lox";
65 };
66 default = lox;
67 });
68
69 apps = forAllSystems (pkgs: {
70 lox = {
71 type = "app";
72 program = pkgs.lib.getExe self.packages.${pkgs.system}.lox;
73 };
74 default = self.apps.${pkgs.system}.lox;
75 });
76
77 devShells = forAllSystems (pkgs: {
78 default = pkgs.mkShell {
79 packages = with self.packages.${pkgs.system}; [
80 pkgs.janet
81 spork
82 lox
83 ];
84 };
85 });
86 };
87}