grain.social is a photo sharing platform built on atproto.
at main 5.1 kB view raw
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}