diff --git a/flake.nix b/flake.nix index 4190520ad4..3408ffde17 100644 --- a/flake.nix +++ b/flake.nix @@ -38,7 +38,8 @@ inherit buildLeanPackage; }; buildLeanPackage = callPackage (import ./nix/buildLeanPackage.nix) { - inherit (lean) stdenv lean leanc; + inherit (lean) stdenv leanc; + lean = lean.stage1; inherit lean-emacs; nix = nix-pinned; }; @@ -107,5 +108,13 @@ defaultPackage = packages.lean; checks.lean = packages.test; - }); + + }) // rec { + templates.pkg = { + path = ./nix/templates/pkg; + description = "A custom Lean package"; + }; + + defaultTemplate = templates.pkg; + }; } diff --git a/nix/bootstrap.nix b/nix/bootstrap.nix index 5364dd3af0..d3f9918c16 100644 --- a/nix/bootstrap.nix +++ b/nix/bootstrap.nix @@ -62,9 +62,9 @@ rec { leanFlags = [ "-Dinterpreter.prefer_native=false" ]; }; in (all: all // all.lean) rec { - Init = build { name = "Init"; src = ../src; srcDir = "/src"; deps = {}; }; - Std = build { name = "Std"; src = ../src; srcDir = "/src"; deps = { inherit Init; }; }; - Lean = build { name = "Lean"; src = ../src; srcDir = "/src"; deps = { inherit Init Std; }; }; + Init = build { name = "Init"; src = ../src; srcDir = "/src"; deps = []; }; + Std = build { name = "Std"; src = ../src; srcDir = "/src"; deps = [ Init ]; }; + Lean = build { name = "Lean"; src = ../src; srcDir = "/src"; deps = [ Init Std ]; }; inherit (Lean) emacs-dev emacs-package; mods = Init.mods // Std.mods // Lean.mods; lean = stdenv.mkDerivation { diff --git a/nix/buildLeanPackage.nix b/nix/buildLeanPackage.nix index 86b3d5e8a7..1b12024648 100644 --- a/nix/buildLeanPackage.nix +++ b/nix/buildLeanPackage.nix @@ -1,5 +1,5 @@ { debug ? false, leanFlags ? [], leancFlags ? [], - lean, leanc ? lean, lean-leanDeps ? lean, lean-final ? lean, + lean, lean-leanDeps ? lean, lean-final ? lean, leanc, stdenv, lib, coreutils, gnused, writeShellScriptBin, bash, lean-emacs, nix, substituteAll, symlinkJoin, linkFarmFromDrvs }: with builtins; let # "Init.Core" ~> "Init/Core" @@ -40,12 +40,12 @@ with builtins; let allowSubstitutes = false; }; in - { name, src, srcDir ? "", deps }: let + { name, src, srcDir ? name, deps ? [ lean.Lean ] }: let srcRoot = src; fakeDepRoot = runCommandLocal "${name}-dep-root" {} '' mkdir $out cd $out - mkdir ${lib.concatStringsSep " " ([name] ++ attrNames deps)} + mkdir ${lib.concatStringsSep " " ([name] ++ map (dep: dep.name) deps)} ''; # build a file containing the module names of all immediate dependencies of `mod` leanDeps = mod: mkDerivation { @@ -106,7 +106,8 @@ in ${lean-emacs}/bin/emacs --eval "(progn (setq lean4-rootdir \"${lean}\") (require 'lean4-mode))" $@ ''; in rec { - mods = buildModAndDeps name (lib.foldr (dep: depMap: depMap // dep.mods) {} (attrValues deps)); + inherit name lean; + mods = buildModAndDeps name (lib.foldr (dep: depMap: depMap // dep.mods) {} deps); modRoot = depRoot name [ mods.${name} ]; cTree = symlinkJoin { name = "${name}-cTree"; paths = map (mod: mod.c) (builtins.attrValues mods); }; objects = mapAttrs compileMod mods; diff --git a/nix/lean-dev.in b/nix/lean-dev.in index aeab4d357b..2546aa588d 100644 --- a/nix/lean-dev.in +++ b/nix/lean-dev.in @@ -30,10 +30,13 @@ while [[ "$root" != / ]]; do root="$(realpath "$root/..")" done if [[ "$root" == / ]]; then + # if we're outside of any project, just call Lean without any packages call @lean@/bin/lean $@ elif [[ "$input" != "$root@srcDir@/"* ]]; then + # otherwise, if we're inside the package but not its source directory, call Lean with the full package available call nix run "$root#lean-package" -- $@ else + # otherwise call Lean with the file's dependencies available input="$(realpath --relative-to="$root@srcDir@" "$input")" input="${input%.lean}" input="${input//\//.}" diff --git a/nix/templates/pkg/MyPackage.lean b/nix/templates/pkg/MyPackage.lean new file mode 100644 index 0000000000..75229fb67c --- /dev/null +++ b/nix/templates/pkg/MyPackage.lean @@ -0,0 +1 @@ +#eval "Hello, world!" diff --git a/nix/templates/pkg/flake.nix b/nix/templates/pkg/flake.nix new file mode 100644 index 0000000000..44ad076d6b --- /dev/null +++ b/nix/templates/pkg/flake.nix @@ -0,0 +1,18 @@ +{ + description = "My Lean package"; + + inputs.lean.url = github:leanprover/lean4; + inputs.flake-utils.url = github:numtide/flake-utils; + + outputs = { self, lean, flake-utils }: flake-utils.lib.eachDefaultSystem (system: + let leanPkgs = lean.packages.${system}; in rec { + packages = { + inherit (leanPkgs) lean; + } // leanPkgs.buildLeanPackage { + name = "MyPackage"; # must match the name of the top-level .lean file + src = ./.; + }; + + defaultPackage = packages.modRoot; + }); +}