feat(nix): add nix flake and package (#319)

* feat(nix): add nix flake and package
* feat: support darwin

---------

Co-authored-by: Neko <neko@ayaka.moe>
This commit is contained in:
Weathercold
2025-07-28 12:48:58 +08:00
committed by GitHub
co-authored by Neko
parent 130344b2e4
commit 06b20b61be
5 changed files with 270 additions and 0 deletions
+5
View File
@@ -96,3 +96,8 @@ web-ext.config.ts
# Data # Data
.postgres .postgres
twitter-session.json twitter-session.json
# Symlinks created by nix build
result*
+1
View File
@@ -0,0 +1 @@
(builtins.getFlake (toString ./.)).packages.${builtins.currentSystem}
Generated
+27
View File
@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1752950548,
"narHash": "sha256-NS6BLD0lxOrnCiEOcvQCDVPXafX1/ek1dfJHX1nUIzc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c87b95e25065c028d31a94f06a62927d18763fdf",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+50
View File
@@ -0,0 +1,50 @@
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs =
{ self, nixpkgs }:
let
systems = [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];
forAllSystems = nixpkgs.lib.genAttrs systems;
pkgsForSystem =
system:
import nixpkgs {
inherit system;
config.allowUnfree = true;
};
in
{
formatter = forAllSystems (system: (pkgsForSystem system).nixfmt-tree);
packages = forAllSystems (system: {
default = self.packages.${system}.airi;
airi = (pkgsForSystem system).callPackage ./package.nix { };
airi-debug = (pkgsForSystem system).callPackage ./package.nix { debugBuild = true; };
});
overlays = {
default = self.overlays.airi;
airi = final: _: {
airi = final.callPackage ./package.nix { };
};
};
devShells = forAllSystems (
system: with (pkgsForSystem system); {
default = mkShell {
inputsFrom = [ self.packages.${system}.airi ];
packages = [
nixd
nixfmt-tree
pnpm
];
};
}
);
};
}
+187
View File
@@ -0,0 +1,187 @@
{
config,
lib,
stdenv,
stdenvNoCC,
rustPlatform,
autoPatchelfHook,
cargo-tauri,
cudaPackages,
pkg-config,
pnpm,
wrapGAppsHook3,
alsa-lib,
atk,
cacert,
glib,
libayatana-appindicator,
nodejs,
onnxruntime,
openssl,
webkitgtk_4_1,
cudaSupport ? config.cudaSupport,
debugBuild ? false,
}:
rustPlatform.buildRustPackage (final: {
pname = "airi";
version = "0.7.0-alpha.1";
src = ./.;
cargoLock.lockFile = ./Cargo.lock;
pnpmDeps = pnpm.fetchDeps {
inherit (final) pname version src;
fetcherVersion = 1;
hash = "sha256-gqsJ2TDby15bhz7AgiaRs06p0XiJY4w9Ay1HtRV28nk="; # To update, set it to ""
};
# Cache of assets downloaded during vite build
assets = stdenvNoCC.mkDerivation {
pname = "${final.pname}-assets";
inherit (final) version src pnpmDeps;
nativeBuildInputs = [
cacert # For network request
nodejs
pnpm.configHook
];
buildPhase = ''
runHook preBuild
pnpm run build:packages
pnpm -F @proj-airi/stage-tamagotchi run build
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out
cp -r apps/stage-tamagotchi/.cache/assets $out
runHook postInstall
'';
outputHashMode = "recursive";
# To update, set it to lib.fakeHash
outputHash = "sha256-QDGx5sWlWwgMWvG/umkNY+Ct9i5zl+eKEJnvA2whPkY=";
};
nativeBuildInputs =
[
cargo-tauri.hook
nodejs
pkg-config
pnpm.configHook
]
++ lib.optionals stdenv.isLinux [
wrapGAppsHook3
autoPatchelfHook
]
++ lib.optionals cudaSupport [
cudaPackages.cuda_nvcc # Used by cudarc and bindgen_cuda
];
buildInputs = [
glib # Used by glib-sys
onnxruntime # Used by ort-sys
openssl # Used by openssl-sys
]
++ lib.optionals stdenv.isLinux [
alsa-lib # Used by alsa-sys
atk # Used by atk-sys
libayatana-appindicator # Used by libappindicator-sys
webkitgtk_4_1
]
++ lib.optionals cudaSupport [
cudaPackages.cuda_cccl # For nv/target used by bindgen_cuda
cudaPackages.cuda_cudart # For cuda.h used by cudarc
cudaPackages.cuda_nvrtc
cudaPackages.libcublas
cudaPackages.libcurand
];
env = lib.optionalAttrs cudaSupport {
# For bindgen_cuda
CUDA_COMPUTE_CAP = builtins.replaceStrings [ "." ] [ "" ] (
builtins.head cudaPackages.flags.cudaCapabilities
);
};
configurePhase = ''
runHook preConfigure
echo Setting up asset cache
mkdir apps/stage-tamagotchi/.cache
cp -r $assets/assets apps/stage-tamagotchi/.cache
${lib.optionalString cudaSupport ''
echo Patching cudarc build script to find CUDA
# In configurePhase because CUDA is set up in a pre configure hook
# cudarc searches in a few environment variables, but they can't be used because they don't
# support the CUDAToolkit_ROOT format (semicolon-separated list of paths).
# https://github.com/coreylowman/cudarc/blob/main/build.rs#L211
substituteInPlace ../cargo-vendor-dir/cudarc-*/build.rs \
--replace-fail /usr/lib/cuda "$(echo "$CUDAToolkit_ROOT" | sed 's/;/", "/g')"
echo Patching bindgen_cuda to find CUDA # Used by candle-kernels
# bindgen_cuda copies the pathfinding logic from cudarc
# https://github.com/Narsil/bindgen_cuda/blob/main/src/lib.rs#L436
substituteInPlace ../cargo-vendor-dir/bindgen_cuda-*/src/lib.rs \
--replace-fail /usr/lib/cuda "$(echo "$CUDAToolkit_ROOT" | sed 's/;/", "/g')"
''}
runHook postConfigure
'';
preBuild = ''
pnpm run build:packages
'';
buildAndTestSubdir = "apps/stage-tamagotchi";
buildType = if debugBuild then "debug" else "release";
cargoBuildFeatures = lib.optional cudaSupport "cuda";
postInstall =
lib.optionalString stdenv.isLinux ''
mv $out/bin/app $out/bin/airi
''
+ lib.optionalString stdenv.isDarwin ''
mkdir -p "$out/bin"
ln -sf "$out/Applications/AIRI.app/Contents/MacOS/app" "$out/bin/airi"
'';
# Add missing runtime dependency
preFixup = lib.optionalString stdenv.isLinux ''
patchelf --add-needed libayatana-appindicator3.so.1 $out/bin/airi
'';
meta = {
description = "Self-hostable AI waifu / companion / VTuber";
longDescription = ''
AIRI is a container of souls of AI waifu / virtual characters to bring them into our worlds,
wishing to achieve Neuro-sama's altitude, completely LLM and AI driven, capable of realtime
voice chat, Minecraft playing, Factorio playing. It can be run in Browser or Desktop.
'';
homepage = "https://github.com/moeru-ai/airi";
changelog = "https://github.com/moeru-ai/airi/releases/tag/v${final.version}";
# While airi itself is licensed under MIT, it uses the nonfree Cubism SDK. Whether it's
# redistributable remains a question, so we say it's not.
license = lib.licenses.unfree;
platforms = [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];
mainProgram = "airi";
maintainers = with lib.maintainers; [ weathercold ];
};
})