{ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; rust = { url = "git+https://git.stranger.systems/nix/Rust"; inputs.nixpkgs.follows = "nixpkgs"; }; flake-utils.url = "github:numtide/flake-utils"; }; description = "Generate nix package from an idris project"; outputs = { self, nixpkgs, rust, flake-utils }: nixpkgs.lib.attrsets.recursiveUpdate (rust.single { crateName = "idr2nix"; sharedDeps = (pkgs: [ nixpkgs.legacyPackages.${pkgs.system}.nix-prefetch ]); src = ./.; }) ({ idris = { mkIdris = { system, sources }: let pkgs = import nixpkgs { inherit system; }; idris-source = pkgs.fetchgit sources.idris2; idris-lock = builtins.fromJSON (builtins.readFile "${idris-source}/flake.lock"); idris-emacs-src = pkgs.fetchFromGithub { owner = idris-lock.nodes.idris-emacs-src.locked.owner; repo = idris-lock.nodes.idris-emacs-src.locked.repo; rev = idris-lock.nodes.idris-emacs-src.locked.rev; sha256 = idris-lock.nodes.idris-emacs-src.locked.narHash; }; flake-outputs = (import "${idris-source}/flake.nix").outputs { self = flake-outputs; inherit nixpkgs flake-utils idris-emacs-src; }; in flake-outputs.packages.${system}.idris2; mkIdrisPrefix = { system, extraDeps ? (pkgs: [ ]) , extraNativeDeps ? (pkgs: [ ]), sources, idris2api ? false , extraBuildArgs ? (pkgs: { }) }: let pkgs = import nixpkgs { inherit system; }; idris2Pkg = self.idris.mkIdris { inherit system sources; }; packageSourcesRaw = builtins.map (item: let s = sources.sources.${item}; in { ipkg = s.ipkg; source = pkgs.fetchgit s.source; name = s.name; }) sources.sorted; idris-source = pkgs.fetchgit sources.idris2; packageSources = if idris2api then [{ ipkg = "idris2api.ipkg"; source = idris-source; name = "idris2"; }] ++ packageSourcesRaw else packageSourcesRaw; in pkgs.stdenv.mkDerivation ({ name = "idris2-prefix"; src = ./.; buildInputs = [ idris2Pkg ] ++ (extraDeps pkgs); nativeBuildInputs = extraNativeDeps pkgs; buildPhase = '' set -e env mkdir -p $out/src export IDRIS2_PREFIX=$out ${pkgs.lib.concatMapStringsSep "\n" (p: '' cp -r ${p.source} $out/src/${p.name} pushd $out/src/${p.name} chmod -R u+w . ${if p.name == "idris2" then "make src/IdrisPaths.idr" else ""} idris2 --build-dir $out/tmp --install ${p.ipkg} ls if [ -d "lib" ]; then echo "Moving libraries" mkdir -p $out/lib mv lib/* $out/lib fi popd '') packageSources} rm -rf $out/tmp $out/src ''; } // (extraBuildArgs pkgs)); mkDevShell = args@{ system, extraDeps ? (pkgs: [ ]) , extraNativeDeps ? (pkgs: [ ]), sources, idris2api ? false , extraBuildArgs ? (pkgs: { }) }: let pkgs = import nixpkgs { inherit system; }; idris2Pkg = self.idris.mkIdris { inherit system sources; }; idris2Prefix = self.idris.mkIdrisPrefix args; in pkgs.mkShell ({ nativeBuildInputs = [ idris2Pkg idris2Prefix ] ++ (extraDeps pkgs) ++ (extraNativeDeps pkgs); shellHook = '' alias idris2="rlwrap -s 1000 idris2 --no-banner" export IDRIS2_PREFIX=${idris2Prefix} export LD_LIBRARY_PATH=${idris2Prefix}/lib:$LD_LIBRARY_PATH ${pkgs.lib.concatMapStringsSep "\n" (p: "export LD_LIBRARY_PATH=${p}/lib:$LD_LIBRARY_PATH") ((extraDeps pkgs) ++ (extraNativeDeps pkgs))} ''; } // (extraBuildArgs pkgs)); # Build an idris package with a single output binary single = { src, sources, packageName, ipkg, extraDeps ? (pkgs: [ ]) , extraNativeDeps ? (pkgs: [ ]), idris2api ? false , extraBuildArgs ? (pkgs: { }) }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; idris2Pkg = self.idris.mkIdris { inherit system sources; }; idris2Prefix = self.idris.mkIdrisPrefix { inherit system sources extraDeps extraNativeDeps idris2api extraBuildArgs; }; in rec { packages.${packageName} = (import ./nix/buildFinalPackage.nix { name = packageName; inherit pkgs src idris2Pkg idris2Prefix ipkg extraDeps extraNativeDeps extraBuildArgs; }); defaultPackage = packages.${packageName}; devShell = self.idris.mkDevShell { inherit system extraDeps extraNativeDeps sources idris2api extraBuildArgs; }; }); # Build an idris package with multiple output binaries multiple = { src, sources, packageDetails, defaultPackage , extraDeps ? (pkgs: [ ]), extraNativeDeps ? (pkgs: [ ]) , idris2api ? false, extraBuildArgs ? (pkgs: { }) }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; idris2Pkg = self.idris.mkIdris { inherit system sources; }; idris2Prefix = self.idris.mkIdrisPrefix { inherit system sources extraDeps extraNativeDeps idris2api extraBuildArgs; }; packages = builtins.listToAttrs (builtins.map ({ name, ipkg }: { inherit name; value = (import ./nix/buildFinalPackage.nix { inherit name pkgs src idris2Pkg idris2Prefix ipkg extraDeps extraNativeDeps extraBuildArgs; }); }) packageDetails); in { inherit packages; defaultPackage = packages.${defaultPackage}; devShell = self.idris.mkDevShell { inherit system extraDeps extraNativeDeps sources idris2api extraBuildArgs; }; }); }; } // flake-utils.lib.eachDefaultSystem (system: { packages = { testIdris = let sources = builtins.fromJSON (builtins.readFile ./test-data/sources/pack.json); in self.idris.mkIdris { inherit system sources; }; testIdrisPrefix = let sources = builtins.fromJSON (builtins.readFile ./test-data/sources/pack.json); in self.idris.mkIdrisPrefix { inherit system sources; }; }; })); }