flake.nix (5780B)
1 { 2 inputs = { 3 nixpkgs.url = "nixpkgs/nixos-unstable"; 4 flake-utils.url = "github:numtide/flake-utils"; 5 6 fenix = { 7 url = "github:nix-community/fenix"; 8 inputs.nixpkgs.follows = "nixpkgs"; 9 }; 10 11 crane = { 12 url = "github:ipetkov/crane"; 13 }; 14 15 naersk = { 16 url = "github:nix-community/naersk"; 17 inputs.nixpkgs.follows = "nixpkgs"; 18 }; 19 }; 20 21 outputs = { 22 nixpkgs, 23 flake-utils, 24 fenix, 25 crane, 26 naersk, 27 ... 28 }: 29 flake-utils.lib.eachDefaultSystem ( 30 system: let 31 pkgs = nixpkgs.legacyPackages.${system}; 32 fenixPkgs = fenix.packages.${system}; 33 stableToolchain = fenixPkgs.stable.toolchain; 34 craneLib = (crane.mkLib pkgs).overrideToolchain stableToolchain; 35 src = craneLib.cleanCargoSource ./.; 36 37 baseNativeBuildInputs = with pkgs; [ 38 pkg-config 39 cmake 40 llvmPackages.libclang 41 ]; 42 43 cargoToml = fromTOML (builtins.readFile ./Cargo.toml); 44 45 commonArgs = { 46 pname = "virittaa"; 47 inherit src; 48 inherit (cargoToml.package) version; 49 50 strictDeps = true; 51 52 LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib"; 53 BINDGEN_EXTRA_CLANG_ARGS = 54 "-isystem ${pkgs.llvmPackages.libclang.lib}/lib/clang/${pkgs.llvmPackages.libclang.version}/include" 55 + pkgs.lib.optionalString (!pkgs.stdenv.isDarwin) " -isystem ${pkgs.glibc.dev}/include"; 56 57 nativeBuildInputs = 58 baseNativeBuildInputs 59 ++ pkgs.lib.optionals (!pkgs.stdenv.isDarwin) [pkgs.glibc.dev]; 60 61 buildInputs = with pkgs; 62 [ 63 ffmpeg 64 ] 65 ++ lib.optionals stdenv.isDarwin [libiconv]; 66 }; 67 68 cargoArtifacts = craneLib.buildDepsOnly commonArgs; 69 70 virittaa = craneLib.buildPackage (commonArgs 71 // { 72 inherit cargoArtifacts; 73 nativeBuildInputs = commonArgs.nativeBuildInputs ++ [pkgs.makeWrapper]; 74 postInstall = 75 if pkgs.stdenv.isDarwin then 76 '' 77 wrapProgram $out/bin/virittaa --prefix DYLD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath [pkgs.ffmpeg]}" 78 '' 79 else 80 '' 81 wrapProgram $out/bin/virittaa --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath [pkgs.ffmpeg]}" 82 ''; 83 }); 84 85 mkCross = { 86 target, 87 pkgsCrossName, 88 }: let 89 crossPkgs = pkgs.pkgsCross.${pkgsCrossName}; 90 toolchain = with fenixPkgs; 91 combine [ 92 minimal.cargo 93 minimal.rustc 94 targets.${target}.latest.rust-std 95 ]; 96 naerskLib = naersk.lib.${system}.override { 97 cargo = toolchain; 98 rustc = toolchain; 99 }; 100 linkerEnv = "CARGO_TARGET_${pkgs.lib.toUpper (builtins.replaceStrings ["-"] ["_"] target)}_LINKER"; 101 targetEnv = pkgs.lib.toUpper (builtins.replaceStrings ["-"] ["_"] target); 102 inherit (crossPkgs.stdenv) cc; 103 bintools = cc.bintools.bintools or cc.bintools; 104 libc = cc.libc or crossPkgs.glibc or crossPkgs.musl; 105 in 106 naerskLib.buildPackage { 107 inherit src; 108 pname = "virittaa"; 109 version = "0.1.0"; 110 CARGO_BUILD_TARGET = target; 111 ${linkerEnv} = "${cc}/bin/${cc.targetPrefix}cc"; 112 113 "CC_${targetEnv}" = "${cc}/bin/${cc.targetPrefix}cc"; 114 "AR_${targetEnv}" = "${bintools}/bin/${cc.targetPrefix}ar"; 115 116 PKG_CONFIG_ALLOW_CROSS = "1"; 117 PKG_CONFIG_PATH = pkgs.lib.concatStringsSep ":" ( 118 pkgs.lib.filter (x: x != "") 119 [ 120 (pkgs.lib.optionalString (crossPkgs ? ffmpeg) "${crossPkgs.ffmpeg.dev}/lib/pkgconfig") 121 "${libc.dev}/lib/pkgconfig" 122 ] 123 ); 124 125 nativeBuildInputs = baseNativeBuildInputs ++ [libc.dev]; 126 127 buildInputs = 128 pkgs.lib.optional (crossPkgs ? ffmpeg) crossPkgs.ffmpeg 129 ++ pkgs.lib.optional (crossPkgs.stdenv.isDarwin && (crossPkgs ? libiconv)) crossPkgs.libiconv; 130 131 inherit (commonArgs) LIBCLANG_PATH; 132 BINDGEN_EXTRA_CLANG_ARGS = "-isystem ${libc.dev}/include -isystem ${pkgs.llvmPackages.libclang.lib}/lib/clang/${pkgs.llvmPackages.libclang.version}/include --target=${target}"; 133 }; 134 135 virittaa-aarch64-linux = mkCross { 136 target = "aarch64-unknown-linux-gnu"; 137 pkgsCrossName = "aarch64-multiplatform"; 138 }; 139 virittaa-x86_64-windows = mkCross { 140 target = "x86_64-pc-windows-gnu"; 141 pkgsCrossName = "mingwW64"; 142 }; 143 virittaa-x86_64-darwin = mkCross { 144 target = "x86_64-apple-darwin"; 145 pkgsCrossName = "x86_64-darwin"; 146 }; 147 virittaa-aarch64-darwin = mkCross { 148 target = "aarch64-apple-darwin"; 149 pkgsCrossName = "aarch64-darwin"; 150 }; 151 in { 152 packages = { 153 default = virittaa; 154 inherit 155 virittaa 156 virittaa-aarch64-linux 157 virittaa-x86_64-windows 158 virittaa-x86_64-darwin 159 virittaa-aarch64-darwin 160 ; 161 }; 162 163 checks = { 164 inherit virittaa; 165 166 test = craneLib.cargoTest (commonArgs 167 // { 168 inherit cargoArtifacts; 169 }); 170 }; 171 172 devShells.default = pkgs.mkShell { 173 nativeBuildInputs = 174 [ 175 stableToolchain 176 fenixPkgs.rust-analyzer 177 ] 178 ++ commonArgs.nativeBuildInputs; 179 inherit (commonArgs) buildInputs; 180 }; 181 } 182 ); 183 }