virittaa

audio metadata analyzer
Log | Files | Refs | README | LICENSE

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 }