summaryrefslogtreecommitdiffhomepage
path: root/gleam/flake.nix
blob: da194b55cd982ab19fd4b98932a3a729781bc89a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
{
  description = "ocda-lib: the object-centric document abstraction as a Gleam library";
  inputs.nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.zst";
  outputs = { self, nixpkgs }:
    let
      system = "x86_64-linux"; # adjust for aarch64-linux / darwin
      pkgs = import nixpkgs { inherit system; };

      name = "ocda_lib";

      /* The builder, nix-gleam's, kept here in nix-gleam/ (see the README
         there). It fetches each Hex dependency on its own, with the
         checksum gleam has already written into manifest.toml, so there is
         no hash in this file to keep up to date, and nothing a run of gleam
         could make come out differently.
      */
      inherit (pkgs.callPackage ./nix-gleam { }) buildGleamApplication;

      /* rebar3 with the port compiler already in it.
         esqlite builds a NIF, and its rebar3 configuration asks for the
         `pc` plugin, which rebar3 would otherwise fetch from Hex at build
         time: impossible in a sandbox, and the build fails with
         "missing_package pc". nixpkgs carries the plugin, so the answer is
         a rebar3 that has it before it starts.
      */
      rebar3-pc = pkgs.beamPackages.rebar3WithPlugins {
        plugins = [ pkgs.beamPackages.pc ];
      };
    in {
      packages.${system} = {
        default = self.packages.${system}.${name};
        /* Shipped as an Erlang shipment rather than as an escript, because
           sqlite on the BEAM is a NIF: esqlite compiles its own sqlite into
           a shared object, and a NIF cannot be loaded from inside an
           escript archive, the runtime needing a real file on disk. The
           shipment keeps priv/ on disk, so it loads.
        */
        ${name} = buildGleamApplication {
          pname = "ocda-lib";
          version = "2.1.0";
          src = ./.;
          rebar3Package = rebar3-pc;
          nativeBuildInputs = [ pkgs.makeWrapper ];
          preBuild = ''
            export HOME=$TMPDIR
          '';
          installPhase = ''
            runHook preInstall
            mkdir -p $out/lib $out/bin
            cp -r build/erlang-shipment $out/lib/${name}
            makeWrapper $out/lib/${name}/entrypoint.sh $out/bin/ocda-lib \
              --add-flags run \
              --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.beamPackages.erlang pkgs.coreutils ]}
            # the reader under its own name, as the D flake installs it
            makeWrapper $out/lib/${name}/entrypoint.sh $out/bin/ocda-read \
              --add-flags "run read" \
              --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.beamPackages.erlang pkgs.coreutils ]}
            runHook postInstall
          '';
          meta = {
            description = "the abstraction as a Gleam library, with its reader, dump and agreement check";
            mainProgram = "ocda-lib";
          };
        };
      };
      devShells.${system}.default = pkgs.mkShell {
        packages = [ pkgs.gleam pkgs.beamPackages.erlang pkgs.rebar3 pkgs.sqlite ];
      };
    };
}