Make nix build code more fault-tolerant
This commit is contained in:
parent
7acc55856f
commit
e1947eaa55
32
config.org
32
config.org
|
@ -1237,14 +1237,22 @@ We first need a function to build a flake reference:
|
||||||
|
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(defun nix-build-out-path (out &optional impure)
|
(defun nix-build-out-path (out &optional impure)
|
||||||
"Build the given flake output OUT and return the output path.
|
"Build the given flake output OUT and return the output path. Return
|
||||||
|
nil if the build fails.
|
||||||
|
|
||||||
If IMPURE is t, then allow impure builds."
|
If IMPURE is t, then allow impure builds."
|
||||||
(message "Building \"%s\" ..." out)
|
(message "Building \"%s\" ..." out)
|
||||||
(require 's)
|
(require 'nix) (require 's)
|
||||||
(s-trim (shell-command-to-string
|
(let* ((args `("build" "--no-link" "--print-out-paths"
|
||||||
(concat "nix build --no-link --print-out-paths "
|
,@(if impure "--impure") ,out))
|
||||||
(when impure "--impure ") out))))
|
(buffer (generate-new-buffer " *nix-process*" t))
|
||||||
|
(status (apply #'call-process nix-executable nil
|
||||||
|
(list buffer nil) nil args)))
|
||||||
|
(prog1
|
||||||
|
(when (eql status 0)
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(s-trim (buffer-string))))
|
||||||
|
(kill-buffer buffer))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
This works well enough if we just want to build something, but there's a problem: we haven't indicated to Nix that we want this output to stick around, so it will be deleted the next time we garbage collect. To fix this, we can write a wrapper function that also makes the output path a garbage collection root.
|
This works well enough if we just want to build something, but there's a problem: we haven't indicated to Nix that we want this output to stick around, so it will be deleted the next time we garbage collect. To fix this, we can write a wrapper function that also makes the output path a garbage collection root.
|
||||||
|
@ -1253,17 +1261,17 @@ This works well enough if we just want to build something, but there's a problem
|
||||||
(defun nix-build-out-path-gcroot (name out &optional impure)
|
(defun nix-build-out-path-gcroot (name out &optional impure)
|
||||||
"Build the given flake output OUT, register its output path as
|
"Build the given flake output OUT, register its output path as
|
||||||
a garbage collection root under NAME, and return the output path.
|
a garbage collection root under NAME, and return the output path.
|
||||||
|
Return nil if the build fails.
|
||||||
|
|
||||||
The GC root is placed under \"/nix/var/nix/gcroots/emacs/NAME\". If
|
The GC root is placed under \"/nix/var/nix/gcroots/emacs/NAME\". If
|
||||||
a call to this function reuses the same NAME argument, then the
|
a call to this function reuses the same NAME argument, then the
|
||||||
symlink is overwritten.
|
symlink is overwritten.
|
||||||
|
|
||||||
If IMPURE is t, then allow impure builds."
|
If IMPURE is t, then allow impure builds."
|
||||||
(let* ((gcdir "/nix/var/nix/gcroots/emacs")
|
(when-let* ((path (nix-build-out-path out impure))
|
||||||
(sym (expand-file-name name gcdir))
|
(gcdir "/nix/var/nix/gcroots/emacs")
|
||||||
(path (nix-build-out-path out impure)))
|
(sym (expand-file-name name gcdir)))
|
||||||
(unless (equal path (file-symlink-p sym))
|
(unless (equal path (file-symlink-p sym))
|
||||||
(require 'epg)
|
|
||||||
(make-directory (concat "/sudo::" gcdir) t)
|
(make-directory (concat "/sudo::" gcdir) t)
|
||||||
(make-symbolic-link path (concat "/sudo::" sym) t))
|
(make-symbolic-link path (concat "/sudo::" sym) t))
|
||||||
path))
|
path))
|
||||||
|
@ -1950,8 +1958,10 @@ Treemacs is a really useful package, but it also has a lot of defaults I don't l
|
||||||
; More accurate git status
|
; More accurate git status
|
||||||
(setq +treemacs-git-mode 'deferred
|
(setq +treemacs-git-mode 'deferred
|
||||||
treemacs-python-executable
|
treemacs-python-executable
|
||||||
(concat (nix-build-out-path-gcroot "treemacs-python" "nixpkgs#python3")
|
(if-let ((path (nix-build-out-path-gcroot
|
||||||
"/bin/python"))
|
"treemacs-python" "nixpkgs#python3")))
|
||||||
|
(concat path "/bin/python")
|
||||||
|
(error "Building python for treemacs failed")))
|
||||||
:config
|
:config
|
||||||
(setq ; Child-frame reading is broken (and sucks anyways)
|
(setq ; Child-frame reading is broken (and sucks anyways)
|
||||||
treemacs-read-string-input 'from-minibuffer
|
treemacs-read-string-input 'from-minibuffer
|
||||||
|
|
Loading…
Reference in a new issue