summaryrefslogtreecommitdiffhomepage
path: root/gleam/flake.nix
diff options
context:
space:
mode:
Diffstat (limited to 'gleam/flake.nix')
-rw-r--r--gleam/flake.nix88
1 files changed, 88 insertions, 0 deletions
diff --git a/gleam/flake.nix b/gleam/flake.nix
new file mode 100644
index 0000000..49cd3f1
--- /dev/null
+++ b/gleam/flake.nix
@@ -0,0 +1,88 @@
+{
+ description = "ocda-write: sample writers over the object-centric document abstraction, in Gleam";
+
+ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+
+ /* The library this is built on, as a source tree rather than a flake.
+ gleam.toml names it as the path dependency ./ocda-lib, which in a
+ working tree is a symlink to the library's gleam/ and is not carried
+ in git; the build is given the library from this input instead, and
+ nix-gleam puts it in place as a local package.
+
+ flake.lock pins the commit of the library this writer was built and
+ checked against. To build against a working copy of it instead:
+
+ nix build --override-input ocda-lib path:../../sisudoc-ocda-lib
+ */
+ inputs.ocda-lib = {
+ url = "git+git://git.sisudoc.org/tools/sisudoc-ocda-lib";
+ flake = false;
+ };
+
+ outputs = { self, nixpkgs, ocda-lib }:
+ let
+ system = "x86_64-linux"; # adjust for aarch64-linux / darwin
+ pkgs = import nixpkgs { inherit system; };
+
+ name = "ocda_write";
+
+ /* 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-write";
+ version = "2.0.0";
+ src = ./.;
+ localPackages = [ "${ocda-lib}/gleam" ];
+ 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-write \
+ --add-flags run \
+ --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.beamPackages.erlang pkgs.coreutils ]}
+ runHook postInstall
+ '';
+ meta = {
+ description = "writes a document out from either serialisation of its abstraction";
+ mainProgram = "ocda-write";
+ };
+ };
+ };
+
+ devShells.${system}.default = pkgs.mkShell {
+ packages = [ pkgs.gleam pkgs.beamPackages.erlang pkgs.rebar3 pkgs.sqlite ];
+ };
+ };
+}