how to distinguish public vs private (entry-point vs internal) systems
Robert Goldman
rpgoldman at sift.info
Thu Feb 7 17:40:20 UTC 2019
I think the approach of disabling operate is not a good solution to this
problem because, for example (this is one I have actually encountered),
one might have multiple test systems that one wishes to test separately.
E.g.,
"Foo/input-test"
"Foo/processing-test"
... and so on.
So I think it's better to handle this in a way that focuses on
Quicklisp, and indexing, rather than attempting to change the core
functions of ASDF. It's just as easy to create a system class that
simply says "I am a system that Quicklisp should not build."
Unfortunately, there has been enough bad blood between Xach and some
members of the ASDF-devel community that this discussion won't be
reaching him. Jim, Hugo, either of you want to try to be a conduit?
Best,
R
On 6 Feb 2019, at 10:52, Hugo Ishimaru wrote:
> Hi,
>
> when I read your post, I instantly came up with the system that may
> not be the target of OPERATE like
> ;; foo.asd
> ;;
> https://gist.github.com/privet-kitty/84350b73d528533ac8e19e5bba6aa333
> (defpackage :foo.asdf
> (:use :cl :asdf :uiop)
> (:export #:hideable-system))
> (in-package :foo.asdf)
>
> (eval-when (:compile-toplevel :load-toplevel :execute)
> (defclass hideable-system (system)
> ((private :initform nil :initarg :private :reader private-p))
> (:documentation "If PRIVATE is true, ASDF signals an error when
> one tries to OPERATE this system."))
>
> (defmethod operate :around (operation (component hideable-system)
> &key &allow-other-keys)
> (if (private-p component)
> (error "Private system ~S cannot be directly operated."
> (component-name component))
> (call-next-method))))
>
> (defsystem "foo"
> :license "public domain"
> :depends-on ("foo/private")
> :components ((:file "main")))
>
> (defsystem "foo/private"
> :pathname "private"
> :class "FOO.ASDF:HIDEABLE-SYSTEM"
> :private t
> :components ((:file "package")))
>
> Here FOO/PRIVATE cannot be OPERATEd (but can be PERFORMed and then
> loaded, compiled, tested etc. via FOO). It seems to work at least
> superficially, though ASDF Best Practices states:
>
>> You SHOULD NOT define methods on asdf:operate --- most of the time
>> it's totally the wrong thing
>> because users would not be "operating" on your system, but on their
>> system that depends on it.
>> Instead you SHOULD define methods on asdf:perform,
>> asdf:component-depends-on, etc.
> https://gitlab.common-lisp.net/asdf/asdf/blob/master/doc/best_practices.md
>
> Anyway, I don't have a sufficient knowledge on ASDF's internal.
Robert P. Goldman
Research Fellow
Smart Information Flow Technologies (d/b/a SIFT, LLC)
319 N. First Ave., Suite 400
Minneapolis, MN 55401
Voice: (612) 326-3934
Email: rpgoldman at SIFT.net
More information about the asdf-devel
mailing list