diff --git a/build-helpers/doomscript.nix b/build-helpers/doomscript.nix new file mode 100644 index 0000000..853402a --- /dev/null +++ b/build-helpers/doomscript.nix @@ -0,0 +1,42 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +{ + script, + scriptArgs, + doomSource, + debug ? false, + name ? "doomscript", + extraArgs ? { }, + + emacs, + lib, + runCommandLocal, + runtimeShell, +}: +runCommandLocal name + ( + { + inherit doomSource runtimeShell script; + EMACS = lib.getExe emacs; + } + // (lib.optionalAttrs debug { DEBUG = "1"; }) + // extraArgs + ) + # Set DOOMLOCALDIR somewhere harmless to stop Doom from trying to create it somewhere read-only. + '' + mkdir $out + export DOOMLOCALDIR=$(mktemp -d) + $runtimeShell $doomSource/bin/doomscript $script ${scriptArgs} + '' diff --git a/default.nix b/default.nix index 95238f2..71b5f5e 100644 --- a/default.nix +++ b/default.nix @@ -41,6 +41,7 @@ /* Extra emacs packages from nixpkgs */ extraPackages ? epkgs: [ ], + callPackage, callPackages, git, emacsPackagesFor, @@ -57,37 +58,19 @@ let # This doesn't belong here: it does not depend on doomDir (only on doomSource). # But this is where all my doomscript execution lives. - # TODO: consider splitting off doomdir execution to a separate helper. - doomDirWithAllModules = runCommandLocal "doom-full-init" - { - env = { - EMACS = lib.getExe emacs; - # Enable this to troubleshoot failures at this step. - #DEBUG = "1"; - }; - # We set DOOMLOCALDIR somewhere harmless below to stop Doom from trying to - # create it somewhere read-only. - } '' - mkdir $out - export DOOMLOCALDIR=$(mktemp -d) - ${runtimeShell} ${doomSource}/bin/doomscript ${./build-helpers/full-init} -o $out - ''; - - doomDirWithAllModulesAndFlags = runCommandLocal "doom-full-init" - { - env = { - EMACS = lib.getExe emacs; - # Enable this to troubleshoot failures at this step. - #DEBUG = "1"; - }; - # We set DOOMLOCALDIR somewhere harmless below to stop Doom from trying to - # create it somewhere read-only. - } '' - mkdir $out - export DOOMLOCALDIR=$(mktemp -d) - ${runtimeShell} ${doomSource}/bin/doomscript ${./build-helpers/full-init} --flags -o $out - ''; + doomDirWithAllModules = callPackage ./build-helpers/doomscript.nix { + name = "doom-full-init"; + inherit doomSource emacs; + script = ./build-helpers/full-init; + scriptArgs = "-o $out"; + }; + doomDirWithAllModulesAndFlags = callPackage ./build-helpers/doomscript.nix { + name = "doom-full-init"; + inherit doomSource emacs; + script = ./build-helpers/full-init; + scriptArgs = "--flags -o $out"; + }; # Step 1: determine which Emacs packages to pull in. # @@ -100,21 +83,13 @@ let # (not even straight). # Force local build in case the user init.el does something weird and to avoid a roundtrip. - doomIntermediates = runCommandLocal "doom-intermediates" - { - env = { - EMACS = lib.getExe emacs; - DOOMDIR = "${doomDir}"; - # Enable this to troubleshoot failures at this step. - #DEBUG = "1"; - }; - # We set DOOMLOCALDIR somewhere harmless below to stop Doom from trying to - # create it somewhere read-only. - } '' - mkdir $out - export DOOMLOCALDIR=$(mktemp -d) - ${runtimeShell} ${doomSource}/bin/doomscript ${./build-helpers/dump} -o $out - ''; + doomIntermediates = callPackage ./build-helpers/doomscript.nix { + name = "doom-intermediates"; + inherit doomSource emacs; + extraArgs = { DOOMDIR = "${doomDir}"; }; + script = ./build-helpers/dump; + scriptArgs = "-o $out"; + }; doomPackageSet = lib.importJSON "${doomIntermediates}/packages.json";