stumpwm-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [STUMP] [PATCH] Use exclusively ASDF to load StumpWM modules


From: David Bjergaard
Subject: Re: [STUMP] [PATCH] Use exclusively ASDF to load StumpWM modules
Date: Fri, 30 May 2014 08:33:46 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Hi,

Thanks so much for the patch.  Can you please submit it as a pull
request? Also, I would like to see it be a little more mature before it
gets merged into the main branch.  I'm completely open to giving you a
separate branch for people to test for a while though!

    Dave

"Diogo F. S. Ramos" <address@hidden> writes:

> A StumpWM module is a loadable ASDF system.  Typically, it consists of
> an `.asd' file (which defines an ASDF system) and one or more Lisp
> source files.
>
> By using ASDF, StumpWM doesn't need to worry how to look for files or
> resolve dependencies.  This is all done by ASDF.  StumpWM modules can
> also be more easily integrated with the Lisp system, describing
> dependencies which are automatically resolved and loaded by ASDF.
>
> This patch aims at ASDF 3.0, which was released on January 31st 2013.
>
> For backward compatibility, the function `load-module' was kept, so
> code that uses it continues to work, but when used as a command, it
> does not complete on module names.
>
> By getting rid of `*contrib-dir*' and `*load-path*', the user has to
> instruct ASDF where it should look for `.asd' files, as they would for
> any other Common Lisp system.
> ---
>
> With the transition to ASDF based modules, it might be better if
> StumpWM relies entirely on it to load, compile and resolve
> dependencies, instead of adding an layer of abstraction.
>
> This patch mostly removes code that are not needed if the above vision
> is accepted.
>
> So, how should the user now proceed to load and use modules?
>
> According to ASDF manual:
>
>      The default location for a user to install Common Lisp software
>   is under '~/.local/share/common-lisp/source/'.  If you install
>   software there (it can be a symlink), you don't need further
>   configuration.  If you're installing software yourself at a location
>   that isn't standard, you have to tell ASDF where you installed it.
>
> The same manual lists various other places and mechanism that an user
> can use.
>
> This patch is not finished.  It needs to update the manual, for one.
> But it intents to initiate a conversation about this possible change.
>
>  configure.ac       |   5 ---
>  make-image.lisp.in |   2 -
>  module.lisp        | 110 
> ++++-------------------------------------------------
>  3 files changed, 7 insertions(+), 110 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index b08c947..fb19d39 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -4,7 +4,6 @@
>  AC_PREREQ(2.59)
>  AC_INIT(Stump Window Manager, esyscmd(grep :version stumpwm.asd | cut -d\" 
> -f2 | tr -d \\n), address@hidden)
>
> -AC_SUBST(CONTRIB_DIR)
>  AC_SUBST(LISP_PROGRAM)
>  AC_SUBST(LISP)
>  AC_SUBST(STUMPWM_ASDF_DIR)
> @@ -17,10 +16,6 @@ AC_ARG_WITH(ccl,     [  --with-ccl=PATH         specify 
> location of ccl], CCL_PA
>  AC_ARG_WITH(ecl,     [  --with-ecl=PATH         specify location of ecl], 
> ECL_PATH=$withval, ECL_PATH="")
>  AC_ARG_WITH(lw,      [  --with-lw=PATH          specify location of 
> lispworks], LW_PATH=$withval, LW_PATH="")
>
> -AC_ARG_WITH(contrib-dir,
> -                     [  --with-contrib-dir=PATH specify location of contrib 
> modules],
> -                     CONTRIB_DIR=$withval, CONTRIB_DIR="`pwd`/contrib")
> -
>  STUMPWM_ASDF_DIR="`pwd`"
>
>  if test -x "$SBCL_PATH"; then
> diff --git a/make-image.lisp.in b/make-image.lisp.in
> index fc1afec..373a6f7 100644
> --- a/make-image.lisp.in
> +++ b/make-image.lisp.in
> @@ -2,8 +2,6 @@
>
>  (load "load-stumpwm.lisp")
>
> -#-ecl (stumpwm:set-contrib-dir "@CONTRIB_DIR@")
> -
>  #+sbcl
>  (sb-ext:save-lisp-and-die "stumpwm" :toplevel (lambda ()
>                                                  ;; asdf requires sbcl_home 
> to be set, so set it to the value when the image was built
> diff --git a/module.lisp b/module.lisp
> index 7dbe1ef..52ce3f6 100644
> --- a/module.lisp
> +++ b/module.lisp
> @@ -18,116 +18,20 @@
>
>  ;; Commentary:
>  ;;
> -;; Use `set-contrib-dir' to set the location stumpwm searches for modules.
> +;; A Module must be an ASDF loadable system.
>
>  ;; Code:
>
>  (in-package #:stumpwm)
>
>  (export '(load-module
> -          list-modules
> -          *load-path*
> -          init-load-path
> -       set-contrib-dir
> -          find-module
> -          add-to-load-path))
> +          ))
>
> -(defvar *contrib-dir*
> -  #.(asdf:system-relative-pathname (asdf:find-system :stumpwm)
> -                                   (make-pathname :directory
> -                                                  '(:relative "contrib")))
> -  "The location of the contrib modules on your system.")
> -
> -(defun flatten (ls)
> -  (labels ( (mklist (x) (if (listp x) x (list x))) )
> -    (mapcan #'(lambda (x) (if (atom x) (mklist x) (flatten x))) ls)))
> -
> -(defun build-load-path (path)
> -  "Maps subdirectories of path, returning a list of all subdirs in the
> -  first two levels which contain any files ending in .asd"
> -  (flatten
> -   (mapcar (lambda (dir)
> -             (let ((asd-file (car (directory
> -                                   (make-pathname :directory 
> (directory-namestring dir)
> -                                                  :name :wild
> -                                                  :type "asd")))))
> -               (when asd-file
> -                 (directory (directory-namestring asd-file)))))
> -           ;; TODO, make this truely recursive
> -           (directory (concat (if (stringp path) path
> -                                  (directory-namestring path))
> -                              "*/*")))))
> -
> -(defvar *load-path* nil
> -  "A list of paths in which modules can be found, by default it is
> -  populated by any asdf systems found in the first two levels of
> -  `*contrib-dir*' set from the configure script when StumpWM was built, or
> -  later by the user using `set-contrib-dir'")
> -
> -(defun sync-asdf-central-registry (load-path)
> -  "Sync `LOAD-PATH' with `ASDF:*CENTRAL-REGISTRY*'"
> -  (setf asdf:*central-registry*
> -        (union load-path asdf:*central-registry*)))
> -
> -(defun init-load-path (path)
> -  (let ((load-path (build-load-path path)))
> -    (setf *load-path* load-path)
> -    ;(format t "~{~a ~%~}" *load-path*)
> -    (sync-asdf-central-registry load-path)))
> -
> -(init-load-path *contrib-dir*)
> -
> -(defcommand set-contrib-dir (dir) ((:string "Directory: "))
> -  "Sets the location of the contrib modules"
> -  (when (stringp dir)
> -    (setf dir (pathname (concat dir "/"))))
> -  (setf *contrib-dir* dir)
> -  (init-load-path *contrib-dir*))
> -
> -(define-stumpwm-type :module (input prompt)
> -  (or (argument-pop-rest input)
> -      (completing-read (current-screen) prompt (list-modules) :require-match 
> t)))
> -
> -(defun list-modules ()
> -  "Return a list of the available modules."
> -  (flet ((list-module (dir)
> -           (mapcar 'pathname-name
> -                   (directory (make-pathname :defaults dir
> -                                             :name :wild
> -                                             :type "asd")))))
> -    (flatten (mapcar #'list-module *load-path*))))
> -
> -(defun find-module (name)
> -  (if name
> -      (find name (list-modules) :test #'string=)
> -      nil))
> -
> -(defun ensure-pathname (path)
> -  (if (stringp path) (first (directory path))
> -      path))
> -
> -(defun add-to-load-path (path)
> -  "If `PATH' is not in `*LOAD-PATH*' add it, check if `PATH' contains
> -an asdf system, and if so add it to the central registry"
> -  (let* ((pathspec (find (ensure-pathname path)  *load-path*))
> -         (in-central-registry (find pathspec asdf:*central-registry*))
> -         (is-asdf-path (directory (make-pathname :defaults path
> -                                                 :name :wild
> -                                                 :type "asd"))))
> -    (cond ((and pathspec in-central-registry is-asdf-path) *load-path*)
> -          ((and pathspec is-asdf-path (not in-central-registry))
> -           (setf asdf:*central-registry* (append (list pathspec) 
> asdf:*central-registry*)))
> -          ((and is-asdf-path (not pathspec))
> -           (setf asdf:*central-registry*
> -                 (append (list (ensure-pathname path)) 
> asdf:*central-registry*))
> -           (setf *load-path* (append (list (ensure-pathname path)) 
> *load-path*)))
> -          (T *load-path*))))
> -
> -(defcommand load-module (name) ((:module "Load Module: "))
> +(defcommand load-module (name) ((:string "Load Module: "))
>    "Loads the contributed module with the given NAME."
> -  (let ((module (find-module name)))
> -      (when module
> -        (asdf:operate 'asdf:load-op module))))
> -
> +  (when name
> +    (handler-case (asdf:load-system name)
> +      (asdf:SYSTEM-DEFINITION-ERROR (err)
> +        (message "~a" err)))))
>
>  ;; End of file
> --
> 2.0.0
>
> _______________________________________________
> Stumpwm-devel mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/stumpwm-devel



reply via email to

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