diff --git a/flake.lock b/flake.lock index 5999137c..e58f1151 100644 --- a/flake.lock +++ b/flake.lock @@ -1,6 +1,46 @@ { "nodes": { - "root": {} + "nixpkgs": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "dir": "pins/nixpkgs", + "lastModified": 1706403361, + "narHash": "sha256-/gpmOBW2C1zmKhE/skCv2P73pjpVO0+sXkHy6MWhqKQ=", + "owner": "deemp", + "repo": "flakes", + "rev": "0ac75a3908fd4bf358b53b1759c216be5a2ca2e5", + "type": "github" + }, + "original": { + "dir": "pins/nixpkgs", + "owner": "deemp", + "repo": "flakes", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1704321053, + "narHash": "sha256-r8KVHIxSA9hB4KNGyAf2ltEJXpDELX5Q1sIXpWAf9Tg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "efc960b6d6a6498c23868f4ba59fcb8bb51c9861", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "efc960b6d6a6498c23868f4ba59fcb8bb51c9861", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } }, "root": "root", "version": 7 diff --git a/flake.nix b/flake.nix index 753859d9..1292448a 100644 --- a/flake.nix +++ b/flake.nix @@ -1,139 +1,241 @@ { + inputs = { + nixpkgs.url = "github:deemp/flakes?dir=pins/nixpkgs"; + }; + outputs = inputs: - let makeFlake = import ./makeFlake.nix; in - makeFlake { - inputs = { - inherit (import ./source-flake) nixpkgs formatter; - codium = import ./codium; - devshell = import ./devshell; - drv-tools = import ./drv-tools; - flakes-tools = import ./flakes-tools; - workflows = import ./workflows; - }; - perSystem = { inputs, system }: + import ./makeFlake.nix { + inherit inputs; + perSystem = system: let pkgs = inputs.nixpkgs.legacyPackages.${system}; - inherit (inputs.codium.lib.${system}) mkCodium writeSettingsJSON extensionsCommon settingsCommonNix; - inherit (inputs.drv-tools.lib.${system}) subDirectories withAttrs mkShellApps getExe getExe'; - inherit (inputs.flakes-tools.lib.${system}) mkFlakesTools; - inherit (inputs.devshell.lib.${system}) mkCommands mkRunCommands mkShell; - inherit (inputs.workflows.lib.${system}) writeWorkflow nixCI expr steps names run stepsIf os; - - flakesTools = (mkFlakesTools { - root = ./.; - dirs = [ - "codium" - "devshell" - "drv-tools" - "env2json" - "flakes-tools" - "json2md" - "templates/haskell-minimal" - "workflows" - "source-flake" - "." - ]; - subDirs = [ - "language-tools" - "templates/codium" - ]; - }); - - packages = mkShellApps { + + inherit (pkgs) lib; + + nix = rec { + drv-tools = import ./drv-tools { inherit system pkgs; }; + flakes-tools = import ./flakes-tools { inherit system pkgs drv-tools; }; + language-tools.haskell = import ./language-tools/haskell { inherit system pkgs drv-tools; }; + language-tools.purescript = import ./language-tools/purescript { inherit system pkgs drv-tools; }; + json2md = import ./language-tools/purescript { inherit system pkgs drv-tools; }; + workflows = import ./workflows { inherit system pkgs drv-tools flakes-tools; }; + }; + + subdirs = + lib.pipe + { + src = [ + [ "drv-tools" ] + [ "flakes-tools" ] + [ "language-tools" "haskell" ] + [ "language-tools" "purescript" ] + [ "workflows" ] + ]; + attr = [ "packages" "devShells" "lib" "test" ]; + } + [ + lib.cartesianProductOfSets + + (map (x: { + name = x.src; + value = lib.getAttrFromPath x.src nix; + inherit (x) attr; + })) + + (map (x: + if (x.value?"${x.attr}") + then (lib.setAttrByPath ([ x.attr ] ++ x.name) x.value."${x.attr}") + else null + )) + + (lib.filter (x: x != null)) + + nix.drv-tools.lib.mergeAttrsRecursive + ]; + + devshell = (pkgs.appendOverlays [ (builtins.getFlake "github:deemp/devshell/${(builtins.fromJSON (builtins.readFile ./pins/devshell/flake.lock)).nodes.devshell.locked.rev}").overlays.default ]).devshell; + + packages = subdirs.lib.drv-tools.mkShellApps { + inherit (subdirs.lib.flakes-tools.mkFlakesTools { + root = ./.; + dirs = [ + "codium" + "templates/haskell-minimal" + "." + ]; + subDirs = [ + "templates/codium" + "pins" + ]; + }) saveFlakes format updateLocks; + genDocs = { text = '' mkdir -p docs/src cp README/*.md docs/src - ${getExe' pkgs.mdbook "mdbook"} build docs + ${lib.getExe' pkgs.mdbook "mdbook"} build docs ''; description = "Generate docs"; }; - inherit (mkFlakesTools { root = ./.; dirs = [ "source-flake" "codium" ]; }) pushToCachix; - inherit (flakesTools) saveFlakes format updateLocks; - writeSettings = writeSettingsJSON settingsCommonNix; - codium = mkCodium ({ extensions = extensionsCommon; }); - writeWorkflows = writeWorkflow "ci" (withAttrs - (nixCI { - jobArgs = { - cacheNixArgs = { - linuxGCEnabled = true; - linuxMaxStoreSize = 5000000000; - macosGCEnabled = true; - macosMaxStoreSize = 5000000000; - }; - doFormat = true; - doPushToCachix = true; - doCommit = false; - steps = { dir, stepsAttrs }: - stepsIf ("${names.matrix.os} == '${os.ubuntu-22}'") [ - { - name = "Write workflows"; - run = pkgs.lib.strings.concatMapStringsSep "\n\n" - (dir_: "${run.nixScript { dir = dir_; inDir = true; name = "writeWorkflows"; }}") - [ "templates/codium/haskell" "templates/codium/haskell-simple" "workflows" ] - ; - } - { - name = "Update docs"; - run = run.nixScript { name = getExe packages.genDocs; }; - } - (steps.commit { - messages = [ - (steps.updateLocks { }).name - (steps.format { }).name - stepsAttrs."Write workflows".name - stepsAttrs."Update docs".name - ]; - }) - { - name = "Copy docs"; - run = "cp -r docs/book docs/dist"; - } - { - name = "Publish docs on GitHub Pages"; - uses = "peaceiris/actions-gh-pages@v3.9.3"; - "with" = { - github_token = expr names.secrets.GITHUB_TOKEN; - publish_dir = "docs/dist"; - force_orphan = true; - }; - } - ]; - }; - }) - { on.schedule = [{ cron = "0 0 * * 0"; }]; }); }; - tools = [ ]; - devShells.default = mkShell { - packages = tools; - commands = - mkCommands "tools" tools - ++ mkRunCommands "ide" { inherit (packages) writeSettings; "codium ." = packages.codium; } - ++ mkRunCommands "infra" { inherit (packages) writeWorkflows saveFlakes format updateLocks; } - ++ mkRunCommands "docs" { inherit (packages) genDocs; }; + devShells.default = devshell.mkShell { + commands = { + scripts = [ + { + prefix = "nix run .#"; + packages = { inherit (packages) genDocs; }; + } + ]; + flakes-tools = [ + { + prefix = "nix run .#"; + packages = { inherit (packages) saveFlakes format updateLocks; }; + } + ]; + }; }; + + formatter = pkgs.nixpkgs-fmt; in - { - inherit packages devShells; - formatter = inputs.formatter.${system}; - }; - raw = inputs: { - all = (import ./source-flake) // { - codium = import ./codium; - devshell = import ./devshell; - drv-tools = import ./drv-tools; - env2json = import ./env2json; - flakes-tools = import ./flakes-tools; - haskell-tools = import ./language-tools/haskell; - json2md = import ./json2md; - purescript-tools = import ./language-tools/purescript; - python-tools = import ./language-tools/python; - workflows = import ./workflows; - }; - inherit makeFlake; - makeDefault = import ./makeDefault.nix; - makeShell = src: (import (import ./source-flake).outputs.flake-compat { inherit src; }).shellNix; + lib.recursiveUpdate subdirs { inherit packages devShells formatter; }; + + other = rec { + lib.makeFlake = import ./makeFlake.nix; + + # no overlay is provided because it's easy to override nixpkgs via flake inputs + + # let makeFlake = import ./makeFlake.nix; in + # makeFlake { + # inputs = { + # inherit (import ./source-flake) nixpkgs formatter; + # codium = import ./codium; + # devshell = import ./devshell; + # drv-tools = import ./drv-tools { inherit (inputs) nixpkgs; }; + # flakes-tools = import ./flakes-tools; + # workflows = import ./workflows; + # }; + # perSystem = { inputs, system }: + # let + # pkgs = inputs.nixpkgs.legacyPackages.${system}; + # inherit (inputs.codium.lib.${system}) mkCodium writeSettingsJSON extensionsCommon settingsCommonNix; + # inherit (inputs.drv-tools.lib.${system}) withAttrs mkShellApps getExe getExe'; + # inherit (inputs.flakes-tools.lib.${system}) mkFlakesTools; + # inherit (inputs.devshell.lib.${system}) mkCommands mkRunCommands mkShell; + # inherit (inputs.workflows.lib.${system}) writeWorkflow nixCI expr steps names run stepsIf os; + + # writeInputs = lockPath: + # with pkgs.lib; + # pkgs.writeText "inputs" ( + # concatStringsSep "\n" ( + # mapAttrsToList + # (_: value: (builtins.fetchTree value.locked).outPath) + # ( + # filterAttrs + # (name: _: name != "root") + # (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes + # ) + # ) + # ); + + # # TODO + # # remove devshell flake (mkRunCommands is deprecated) + # # convert flakes to lib. + # # make the save function accept a list of (derivation or a path to a lock file) + # # inputs.flakes.lib.flakes-tools.writeInputs + + # packages = mkShellApps { + # inp = writeInputs ./flake.lock; + + # inherit (mkFlakesTools { root = ./.; dirs = [ "source-flake" "codium" ]; }) pushToCachix; + # inherit (flakesTools) saveFlakes format updateLocks; + + # writeSettings = writeSettingsJSON settingsCommonNix; + # codium = mkCodium ({ extensions = extensionsCommon; }); + + # writeWorkflows = writeWorkflow "ci" (withAttrs + # (nixCI { + # jobArgs = { + # cacheNixArgs = { + # linuxGCEnabled = true; + # linuxMaxStoreSize = 5000000000; + # macosGCEnabled = true; + # macosMaxStoreSize = 5000000000; + # }; + # doFormat = true; + # doPushToCachix = true; + # doCommit = false; + # steps = { dir, stepsAttrs }: + # stepsIf ("${names.matrix.os} == '${os.ubuntu-22}'") [ + # { + # name = "Write workflows"; + # run = pkgs.lib.strings.concatMapStringsSep "\n\n" + # (dir_: "${run.nixScript { dir = dir_; inDir = true; name = "writeWorkflows"; }}") + # [ "templates/codium/haskell" "templates/codium/haskell-simple" "workflows" ] + # ; + # } + # { + # name = "Update docs"; + # run = run.nixScript { name = getExe packages.genDocs; }; + # } + # (steps.commit { + # messages = [ + # (steps.updateLocks { }).name + # (steps.format { }).name + # stepsAttrs."Write workflows".name + # stepsAttrs."Update docs".name + # ]; + # }) + # { + # name = "Copy docs"; + # run = "cp -r docs/book docs/dist"; + # } + # { + # name = "Publish docs on GitHub Pages"; + # uses = "peaceiris/actions-gh-pages@v3.9.3"; + # "with" = { + # github_token = expr names.secrets.GITHUB_TOKEN; + # publish_dir = "docs/dist"; + # force_orphan = true; + # }; + # } + # ]; + # }; + # }) + # { on.schedule = [{ cron = "0 0 * * 0"; }]; }); + # }; + + # tools = [ ]; + # devShells.default = mkShell { + # packages = tools; + # commands = + # mkCommands "tools" tools + # ++ mkRunCommands "ide" { inherit (packages) writeSettings; "codium ." = packages.codium; } + # ++ mkRunCommands "infra" { inherit (packages) writeWorkflows saveFlakes format updateLocks; } + # ++ mkRunCommands "docs" { inherit (packages) genDocs; }; + # }; + # in + # { + # inherit packages devShells; + # }; + # raw = inputs: { + # all = (import ./source-flake) // { + # codium = import ./codium; + # devshell = import ./devshell; + # drv-tools = import ./drv-tools; + # env2json = import ./env2json; + # flakes-tools = import ./flakes-tools; + # haskell-tools = import ./language-tools/haskell; + # json2md = import ./json2md; + # purescript-tools = import ./language-tools/purescript; + # python-tools = import ./language-tools/python; + # workflows = import ./workflows; + # }; + # inherit makeFlake; + # makeDefault = import ./makeDefault.nix; + # makeShell = src: (import (import ./source-flake).outputs.flake-compat { inherit src; }).shellNix; + # }; + templates = rec { codium-generic = { path = ./templates/codium/generic;