grain.social is a photo sharing platform built on atproto.
1{
2 description = "Grain CLI - A command-line interface for grain.social";
3
4 inputs = {
5 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
6 flake-utils.url = "github:numtide/flake-utils";
7 crane = {
8 url = "github:ipetkov/crane";
9 inputs.nixpkgs.follows = "nixpkgs";
10 };
11 rust-overlay = {
12 url = "github:oxalica/rust-overlay";
13 inputs.nixpkgs.follows = "nixpkgs";
14 };
15 };
16
17 outputs = { self, nixpkgs, flake-utils, crane, rust-overlay }:
18 flake-utils.lib.eachDefaultSystem (system:
19 let
20 overlays = [ (import rust-overlay) ];
21 pkgs = import nixpkgs { inherit system overlays; };
22
23 rustToolchain = pkgs.rust-bin.stable.latest.default.override {
24 extensions = [ "rust-src" ];
25 targets = [
26 "x86_64-unknown-linux-gnu"
27 "x86_64-pc-windows-gnu"
28 "x86_64-apple-darwin"
29 "aarch64-apple-darwin"
30 "aarch64-unknown-linux-gnu"
31 ];
32 };
33
34 craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
35
36 src = craneLib.cleanCargoSource (craneLib.path ./.);
37
38 commonArgs = {
39 inherit src;
40 strictDeps = true;
41
42 buildInputs = with pkgs; [
43 openssl
44 ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
45 pkgs.darwin.apple_sdk.frameworks.Security
46 pkgs.darwin.apple_sdk.frameworks.SystemConfiguration
47 ];
48
49 nativeBuildInputs = with pkgs; [
50 pkg-config
51 ];
52 };
53
54 # Build dependencies first for caching
55 cargoArtifacts = craneLib.buildDepsOnly commonArgs;
56
57 # Build function for different targets
58 buildGrainCLI = target:
59 let
60 # Only cross-compile if target is different from current system
61 isCrossCompiling = target != system;
62 in
63 if isCrossCompiling then
64 # For cross-compilation, use the native build but with target specified
65 craneLib.buildPackage (commonArgs // {
66 inherit cargoArtifacts;
67 CARGO_BUILD_TARGET = target;
68 } // pkgs.lib.optionalAttrs (target == "x86_64-pc-windows-gnu") {
69 depsBuildBuild = with pkgs; [
70 pkgsCross.mingwW64.stdenv.cc
71 pkgsCross.mingwW64.windows.pthreads
72 ];
73 nativeBuildInputs = commonArgs.nativeBuildInputs ++ [
74 pkgs.pkgsCross.mingwW64.windows.pthreads
75 ];
76 CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "${pkgs.pkgsCross.mingwW64.stdenv.cc}/bin/x86_64-w64-mingw32-gcc";
77 })
78 else
79 # For native builds, don't specify target
80 craneLib.buildPackage (commonArgs // {
81 inherit cargoArtifacts;
82 });
83
84 in {
85 packages = {
86 default = buildGrainCLI system;
87
88 # Cross-compilation targets
89 grain-linux-x86_64 = buildGrainCLI "x86_64-unknown-linux-gnu";
90 grain-linux-aarch64 = buildGrainCLI "aarch64-unknown-linux-gnu";
91 grain-macos-x86_64 = buildGrainCLI "x86_64-apple-darwin";
92 grain-macos-aarch64 = buildGrainCLI "aarch64-apple-darwin";
93 grain-windows-x86_64 = buildGrainCLI "x86_64-pc-windows-gnu";
94 };
95
96 devShells.default = pkgs.mkShell {
97 inputsFrom = [ self.packages.${system}.default ];
98 packages = with pkgs; [
99 rustToolchain
100 pkg-config
101 openssl
102 cargo-cross
103 ];
104 };
105
106 # Helper script to build all targets
107 apps.build-all = flake-utils.lib.mkApp {
108 drv = pkgs.writeShellScriptBin "build-all" ''
109 set -e
110
111 echo "Building Grain CLI for all platforms..."
112
113 mkdir -p releases
114
115 # Build for each platform
116 echo "Building for Linux x86_64..."
117 nix build .#grain-linux-x86_64 -o result-linux-x86_64
118 cp result-linux-x86_64/bin/grain releases/grain-linux-x86_64
119
120 echo "Building for Linux aarch64..."
121 nix build .#grain-linux-aarch64 -o result-linux-aarch64
122 cp result-linux-aarch64/bin/grain releases/grain-linux-aarch64
123
124 echo "Building for macOS x86_64..."
125 nix build .#grain-macos-x86_64 -o result-macos-x86_64
126 cp result-macos-x86_64/bin/grain releases/grain-darwin-x86_64
127
128 echo "Building for macOS aarch64..."
129 nix build .#grain-macos-aarch64 -o result-macos-aarch64
130 cp result-macos-aarch64/bin/grain releases/grain-darwin-aarch64
131
132 echo "Building for Windows x86_64..."
133 nix build .#grain-windows-x86_64 -o result-windows-x86_64
134 cp result-windows-x86_64/bin/grain.exe releases/grain-windows-x86_64.exe
135
136 echo "All builds complete! Binaries are in releases/"
137 ls -la releases/
138 '';
139 };
140 });
141}