diff --git a/build-helpers/full-init b/build-helpers/full-init new file mode 100755 index 0000000..46e85d4 --- /dev/null +++ b/build-helpers/full-init @@ -0,0 +1,39 @@ +#!/usr/bin/env doomscript +;; -*- lexical-binding: t; -*- + +;; 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. + +(defcli! full-init + ((output-directory ("-o" dir) "Directory to write init.el into.") + (&flag full? ("--full"))) + "Write init.el with all modules." + (with-temp-buffer + (insert ";;; init.el -*- no-byte-compile: t; -*- + +;;; Dynamically generated by nix-doom-emacs-unstraightened. + +(doom! +") + (dolist (kp (doom-module-list 'all)) + (let ((cat (car kp)) + (name (cdr kp))) + (when name + (if full? + (error "unimplemented") + (insert (format " %s %s\n" cat name)))))) + (insert ")\n") + (write-region nil nil (expand-file-name "init.el" output-directory)))) + +(run! "full-init" (cdr (member "--" argv))) diff --git a/checks.nix b/checks.nix index fcc5044..61bd043 100644 --- a/checks.nix +++ b/checks.nix @@ -14,6 +14,7 @@ { emacs29, + emptyDirectory, lib, linkFarm, runCommand, @@ -36,6 +37,7 @@ let mkDoom = args: (makeDoomPackages (common // args)).doomEmacs; mkDoomDir = args: writeTextDir "init.el" (toInit args); minimalDoomDir = mkDoomDir { config = [ "default" ]; }; + fullDoomDir = (makeDoomPackages (common // { doomDir = emptyDirectory; })).doomDirWithAllPackages; doomTest = name: init: doomArgs: testers.testEqualContents { assertion = "name = ${name}; modules = ${toPretty {} init}; args = ${toPretty {} doomArgs};"; expected = writeText "doom-expected" "Doom functions"; @@ -64,10 +66,7 @@ in { minimalEmacs = (makeDoomPackages (common // { doomDir = minimalDoomDir; })).emacsWithDoom; - full = mkDoom { - full = true; - doomDir = minimalDoomDir; - }; + full = mkDoom { doomDir = fullDoomDir; }; example = mkDoom { doomDir = ./doomdirs/example; }; example-without-loader = mkDoom { doomDir = ./doomdirs/example; diff --git a/default.nix b/default.nix index 0c8f523..f986c13 100644 --- a/default.nix +++ b/default.nix @@ -56,6 +56,24 @@ let inherit (lib) optionalAttrs optionalString; inherit (import ./fetch-overrides.nix) extraPins extraUrls; + # 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. + doomDirWithAllPackages = 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 + ''; + # Step 1: determine which Emacs packages to pull in. # # Inputs: Doom, original DOOMDIR (only init.el and packages.el are used). @@ -412,5 +430,5 @@ let ''; in { - inherit doomEmacs emacsWithDoom; + inherit doomDirWithAllPackages doomEmacs emacsWithDoom; }