guix-patches
[Top][All Lists]
Advanced

[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






reply via email to

[Prev in Thread] Current Thread [Next in Thread]