(Lack of) Inheritance of in-order-to dependencies
Robert Goldman
rpgoldman at sift.info
Mon Jun 21 17:41:03 UTC 2021
This problem is happening because of a (common) misunderstanding about
what it means to apply an operator to a parent component.
If you have a parent component, P, and serial children C1, C2, C3, then
a simple downward-operation O will generate this plan:
```
(O . C1)
(O . C2)
(O . C3)
(O . P)
```
So ASDF does a *postorder* traversal of the component tree which gives
the results which you report (and which you do not like).
To get the macros loaded at the proper time, you could do the following:
:in-order-to ((prepare-op (load-op "some-macros")))
But this will not do what you want because it will *always* load
`some-macros` rather than skipping the load when the compile-op is
already done.
I don't believe that what you ask for can easily be done because if you
try to load a system, ASDF will *always* put the `compile-op` into the
plan -- but it will notice that the `compile-op` is `already-done-p`,
and not `perform` the operation.
If you really want to do this, you should probably set up your own
compile-op like operation that will be done in a separate phase, and for
which you can make your own rules (like the way one can translate
protobuf specifications with an external compiler).
On 21 Jun 2021, at 7:57, akater wrote:
> I tried to specify a build-time dependency for ASDF system, and
> failed.
>
> The defsystem option
>
> :depends-on systems
>
> makes “systems” both build-time and runtime dependencies of a
> system
> being defined. I'm interested in specifying a dependency that is
> required at build time only.
>
> I attempted
>
> (defsystem "test-toplevel-in-order-deps"
> :in-order-to ((compile-op (load-op "some-macros")))
> :components ((:file "a")
> (:file "b")))
>
> but this way, some-macros is loaded too late:
>
> (let ((system (find-system "test-toplevel-in-order-deps")))
> (plan-actions
> (make-plan 'sequential-plan 'compile-op system)))
> ;; =>
>
> ((#<PREPARE-OP > . #<SYSTEM "test-toplevel-in-order-deps">)
> (#<PREPARE-OP > . #<CL-SOURCE-FILE "test-toplevel-in-order-deps"
> "a">)
> (#<COMPILE-OP > . #<CL-SOURCE-FILE "test-toplevel-in-order-deps"
> "a">)
> (#<PREPARE-OP > . #<CL-SOURCE-FILE "test-toplevel-in-order-deps"
> "b">)
> (#<COMPILE-OP > . #<CL-SOURCE-FILE "test-toplevel-in-order-deps"
> "b">)
> (#<PREPARE-OP > . #<SYSTEM "some-macros">)
> ...
> (#<LOAD-OP > . #<SYSTEM "some-macros">)
> (#<COMPILE-OP > . #<SYSTEM "test-toplevel-in-order-deps">))
>
> I'm not requesting a feature but still, it's unfortunate that a
> seemingly basic task of specifying build-time dependency is
> unachievable
> in ASDF.
>
> My hypothesis is, if (compile-op . parent) depends on “actions”,
> then
> compiling children of parent should depend on “actions” as well,
> and
> similarly for all instances of downward-operation. I'm not sure
> what's
> the best way to implement this but I wonder if you find this
> reasonable
> in the first place.
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/asdf-devel/attachments/20210621/56c40d1b/attachment.html>
More information about the asdf-devel
mailing list