-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathflake.nix
More file actions
149 lines (134 loc) · 6.61 KB
/
Copy pathflake.nix
File metadata and controls
149 lines (134 loc) · 6.61 KB
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
{
description = "Genesis — evolutionary software development in Elixir. `nix run` for the CLI; `nix run .#desktop` for the native desktop app; `nix develop` for the Tauri build environment.";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
lib = pkgs.lib;
# ── BEAM toolchain ──────────────────────────────────────────
# Erlang/OTP 29 + Elixir 1.20, matching CI version pins.
beamPkgs = pkgs.beam.packagesWith pkgs.beam.interpreters.erlang_29;
erlang = beamPkgs.erlang;
elixir = beamPkgs.elixir_1_20;
# ── Tauri v2 native dependencies (Linux only) ──────────────
# These are the NixOS equivalents of the apt packages installed by
# the GitHub Actions workflow (libwebkit2gtk-4.1-dev, librsvg2-dev,
# libayatana-appindicator3-dev, libssl-dev, etc.).
tauriNativeDeps = lib.optionals pkgs.stdenv.isLinux (with pkgs; [
webkitgtk_4_1
gtk3
glib
glib-networking # TLS support for WebKit HTTP requests
librsvg
libayatana-appindicator
libsoup_3
openssl
xdo # libxdo — X11 automation (Tauri build-time dep)
]);
# ── Tauri runtime helpers (Linux only) ─────────────────────
tauriRuntimeDeps = lib.optionals pkgs.stdenv.isLinux [
pkgs.dconf # GSettings backend (required by GTK at runtime)
pkgs.hicolor-icon-theme # icon theme needed by app bundles
];
in
{
# ── `nix build` / `nix run` ──────────────────────────────────
# CLI app (both evo_git + evo_dash, no desktop flag).
packages.default = pkgs.callPackage ./genesis.nix {
src = self;
beamPackages = beamPkgs;
};
# Tauri desktop app (genesis_desktop release + native WebView shell).
packages.desktop = pkgs.callPackage ./genesis-desktop.nix {
src = self;
inherit (pkgs) rustPlatform makeWrapper pkg-config openssl file
webkitgtk_4_1 gtk3 glib glib-networking librsvg
libayatana-appindicator libsoup_3 xdo wrapGAppsHook3;
beamPackages = beamPkgs;
};
apps.default = {
type = "app";
program = "${self.packages.${system}.default}/bin/genesis";
};
apps.desktop = {
type = "app";
program = "${self.packages.${system}.desktop}/bin/genesis-desktop";
};
# ── Development shell ────────────────────────────────────────
devShells.default = pkgs.mkShell {
# pkg-config must be in nativeBuildInputs so the Rust/Tauri build
# can locate the webkit/gtk libraries via *.pc files.
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = [
# ── BEAM toolchain ──
erlang
elixir
# ── Rust toolchain ──
pkgs.cargo
pkgs.rustc
pkgs.rustfmt
pkgs.clippy
# ── Core build tools ──
pkgs.gnumake
pkgs.gcc # C compiler for NIF compilation (mdex, xqlite)
pkgs.file # required by Tauri's bundling step
pkgs.curl # for downloading vendor binaries
# ── Vendor binaries (bundled into the release) ──
pkgs.ripgrep
pkgs.git
] ++ tauriNativeDeps
++ tauriRuntimeDeps;
shellHook = ''
${lib.optionalString pkgs.stdenv.isLinux ''
# Let GLib/GIO find the networking and dconf modules at runtime.
export GIO_EXTRA_MODULES="${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf}/lib/gio/modules"
# Work around WebKit rendering issues under certain compositors.
export WEBKIT_DISABLE_DMABUF_RENDERER=1
''}
echo ""
echo " ┌─────────────────────────────────────────────┐"
echo " │ EvoX Genesis — NixOS Development Shell │"
echo " └─────────────────────────────────────────────┘"
echo ""
echo " Quick start:"
echo " nix run — build & run Genesis CLI"
echo " nix run .#desktop — build & run EvoX Genesis (Tauri)"
echo ""
echo " Toolchain:"
echo " Erlang/OTP : $(erl -noshell -eval '{ok,V}=file:read_file(filename:join([code:root_dir(),"releases",erlang:system_info(otp_release),"OTP_VERSION"])), io:format("OTP ~s",[string:trim(V)]), halt()' 2>/dev/null || echo 'unknown')"
echo " Elixir : $(elixir --version 2>/dev/null | tail -1 || echo 'unknown')"
echo " Rust : $(rustc --version 2>/dev/null || echo 'unknown')"
echo ""
echo " ── Build the desktop app ─────────────────────"
echo ""
echo " # 1. Fetch Elixir dependencies"
echo " mix deps.get"
echo ""
echo " # 2. Build and digest frontend assets"
echo " mix assets.setup && mix assets.deploy"
echo ""
echo " # 3. Install Tauri CLI v2 (first time only)"
echo " cargo install tauri-cli --version \"^2.0\""
echo ""
echo " # 4. Bundle vendor binaries into the release"
echo " ./nix/bundle-vendor.sh"
echo ""
echo " # 5. Build the Elixir release"
echo " MIX_ENV=prod mix release genesis_desktop"
echo ""
echo " # 6. Place the release directory where Tauri expects it"
echo " rm -rf desktop/src-tauri/resources/genesis-backend"
echo " cp -a _build/prod/rel/genesis_desktop desktop/src-tauri/resources/genesis-backend"
echo ""
echo " # 7. Build the Tauri desktop app"
echo " cd desktop/src-tauri && cargo tauri build"
echo ""
'';
};
}
);
}