[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#60029] [PATCH 3/4] guix: add vim-build-system
From: |
Jonathan Scoresby |
Subject: |
[bug#60029] [PATCH 3/4] guix: add vim-build-system |
Date: |
Tue, 13 Dec 2022 01:34:19 -0700 |
---
guix/build-system/vim.scm | 160 ++++++++++++++++++++++++++++++++
guix/build/vim-build-system.scm | 137 +++++++++++++++++++++++++++
2 files changed, 297 insertions(+)
create mode 100644 guix/build-system/vim.scm
create mode 100644 guix/build/vim-build-system.scm
diff --git a/guix/build-system/vim.scm b/guix/build-system/vim.scm
new file mode 100644
index 0000000000..4b74c24e10
--- /dev/null
+++ b/guix/build-system/vim.scm
@@ -0,0 +1,160 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2022 Jonathan Scoresby <me@jonscoresby.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build-system vim)
+ #:use-module (guix store)
+ #:use-module (guix utils)
+ #:use-module (guix gexp)
+ #:use-module (guix monads)
+ #:use-module (guix packages)
+ #:use-module (guix search-paths)
+ #:use-module (guix build-system)
+ #:use-module (guix build-system copy)
+ #:use-module (guix build-system gnu)
+ #:export (%vim-build-system-modules vim-build vim-build-system))
+
+;; Commentary:
+;;
+;; Standard package installer for vim and neovim plugins.
+;; This is implemented as an extension of `copy-build-system'
+;; and takes advantage of vim and neovim's built-in package manager.
+;; It extends the installation procedure from the copy-build-system
+;; to put files in the correct place and then generates help tags.
+;;
+;; Code:
+
+(define %vim-build-system-modules
+ ;; Build-side modules imported by default.
+ `((guix build vim-build-system)
+ ,@%copy-build-system-modules))
+
+(define (default-vim)
+ "Return the default Vim package."
+ ;; Lazily resolve the binding to avoid a circular dependency.
+ (let ((vim (resolve-interface '(gnu packages vim))))
+ (module-ref vim
+ 'vim)))
+
+(define (default-neovim)
+ "Return the default Neovim package."
+ (let ((vim (resolve-interface '(gnu packages vim))))
+ (module-ref vim
+ 'neovim)))
+
+(define* (lower name
+ #:key source
+ inputs
+ native-inputs
+ outputs
+ system
+ target
+ (vim? #f)
+ (neovim? #f)
+ (vim (default-vim))
+ (neovim (default-neovim))
+ #:allow-other-keys #:rest arguments)
+ "Return a bag for NAME."
+ (let* ((private-keywords '(#:target #:vim #:neovim #:inputs #:native-inputs))
+ (vim? (or (= 0
+ (string-contains name "vim")) vim?))
+ (neovim? (or (not (not (or (string-contains name "neovim")
+ (member "neovim" outputs)))) neovim?))
+ (vim-inputs (append (if vim?
+ `(("vim" ,vim))
+ '())
+ (if neovim?
+ `(("neovim" ,neovim))
+ '())))
+ (vim-arguments (append arguments
+ `(#:vim? ,vim?
+ #:neovim? ,neovim?))))
+ (bag (name name)
+ (system system)
+ (host-inputs `(,@(if source
+ `(("source" ,source))
+ '()) ,@inputs
+
+ ;; Keep the standard inputs of 'gnu-build-system'.
+ ,@(standard-packages)))
+ (build-inputs `(,@vim-inputs ,@native-inputs))
+ (outputs outputs)
+ (build vim-build)
+ (arguments (strip-keyword-arguments private-keywords
vim-arguments)))))
+
+(define* (vim-build name
+ inputs
+ #:key guile
+ source
+ (vim? #f)
+ (neovim? #f)
+ (mode "start")
+ (install-plan ''())
+ (phases '(@ (guix build vim-build-system)
%standard-phases))
+ (outputs '("out"))
+ (search-paths '())
+ (system (%current-system))
+ (imported-modules %vim-build-system-modules)
+ (modules '((guix build vim-build-system)
+ (guix build utils))))
+
+ (define build
+ (with-imported-modules imported-modules
+ #~(begin
+ (use-modules #$@modules)
+ #$(with-build-variables inputs outputs
+ #~(vim-build #:name
#$name
+ #:vim? #$vim?
+ #:neovim? #$neovim?
+ #:mode #$mode
+ #:install-plan #$(if
+
(pair?
+
install-plan)
+
(sexp->gexp
+
install-plan)
+
install-plan)
+ #:source #+source
+ #:system #$system
+ #:phases #$(if (pair?
+
phases)
+
(sexp->gexp
+ phases)
+ phases)
+ #:outputs %outputs
+ #:search-paths
'#$(sexp->gexp
+
(map
+
search-path-specification->sexp
+
search-paths))
+ #:inputs
+ %build-inputs)))))
+
+ (mlet %store-monad
+ ((guile (package->derivation (or guile
+ (default-guile)) system
+ #:graft? #f)))
+ (gexp->derivation name
+ build
+ #:system system
+ #:target #f
+ #:guile-for-build guile)))
+
+(define vim-build-system
+ (build-system (name 'vim)
+ (description "The standard Vim build system")
+ (lower lower)))
+
+;;; vim.scm ends here
diff --git a/guix/build/vim-build-system.scm b/guix/build/vim-build-system.scm
new file mode 100644
index 0000000000..38d82c416b
--- /dev/null
+++ b/guix/build/vim-build-system.scm
@@ -0,0 +1,137 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2022 Jonathan Scoresby <me@jonscoresby.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build vim-build-system)
+ #:use-module ((guix build copy-build-system)
+ #:prefix copy:)
+ #:use-module (guix build utils)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 ftw)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:export (%standard-phases vim-build))
+
+;; Commentary:
+;;
+;; System for installing vim and neovim plugins. It downloads
+;; the source and copies the appropriate files to vim and nvim
+;; packpaths. It then generates helptags.
+;;
+;; Code:
+
+(define copy:install
+ (assoc-ref copy:%standard-phases
+ 'install))
+
+(define vim-path
+ "/share/vim/vimfiles/pack/guix/")
+(define nvim-path
+ "/share/nvim/site/pack/guix/")
+
+(define* (install #:key name
+ install-plan
+ neovim?
+ vim?
+ mode
+ outputs
+ #:allow-other-keys)
+
+ (let* ((include-regexp '(".*\\/.*\\/.*"))
+ (exclude-regexp '("scripts/.*" "tests?/.*" ".*\\/\\..*"))
+ (vim-install (if vim?
+ `(("." ,(string-append vim-path mode "/" name "/")
+ #:include-regexp ,include-regexp
+ #:exclude-regexp ,exclude-regexp))
+ '()))
+ (neovim-outputs (if vim?
+ `(("." ,(string-append nvim-path mode "/" name
+ "/")
+ #:include-regexp ,include-regexp
+ #:exclude-regexp ,exclude-regexp
+ #:output "neovim"))
+ `(("." ,(string-append nvim-path mode "/" name
+ "/")
+ #:include-regexp ,include-regexp
+ #:exclude-regexp ,exclude-regexp))))
+ (neovim-install (if neovim? neovim-outputs
+ '())))
+ (copy:install #:outputs outputs
+ #:install-plan (append vim-install neovim-install
+ install-plan))))
+
+(define* (generate-helptags #:key name
+ neovim?
+ vim?
+ mode
+ outputs
+ #:allow-other-keys)
+
+ (define (vim-generate output)
+ (invoke "vim" "--clean" "-en" "--cmd"
+ (string-append "helptags "
+ output
+ vim-path
+ mode
+ "/"
+ name
+ "/doc | q")))
+
+ (define (neovim-generate output)
+ (invoke "nvim"
+ "--clean"
+ "--headless"
+ "-en"
+ "--cmd"
+ (string-append "helptags "
+ output
+ nvim-path
+ mode
+ "/"
+ name
+ "/doc | q")))
+
+ (when (scandir "./doc")
+ (let ((out (assoc-ref outputs "out"))
+ (neovim (assoc-ref outputs "neovim")))
+ (if vim?
+ (begin
+ (vim-generate out)
+ (if neovim?
+ (neovim-generate neovim)))
+ (neovim-generate out)))))
+
+(define %standard-phases
+ ;; Everything is as with the Copy Build System except for
+ ;; the addition of the generate-helptags phase and a few
+ ;; custom actions are added to the install phase
+ (modify-phases copy:%standard-phases
+ (replace 'install
+ install)
+ (add-after 'install 'generate-helptags
+ generate-helptags)))
+
+(define* (vim-build #:key inputs
+ (phases %standard-phases)
+ #:allow-other-keys #:rest args)
+ "Build the given package, applying all of PHASES in order."
+ (apply copy:copy-build
+ #:inputs inputs
+ #:phases phases
+ args))
+
+;;; vim-build-system.scm ends here
--
2.38.1