September 11, 2020 `dmd -deps` is broken | ||||
---|---|---|---|---|
| ||||
Consider these four modules: --- foo.d import baz; alias x = t!(); --- bar.d import baz; alias x = t!(); --- baz.d template t() { import qux; } --- qux.d // empty Naively, one might draw the dependency graph like so: foo → baz ← bar ↓ qux And that's just what DMD used to do, until it changed in 2.064. That version included a fix for issue 9948 ("-deps dependency printing incorrect for templates") [1]. The idea described in the issue is to skip over baz, because that module itself doesn't really depend on qux. Only the modules that instantiate t actually depend on qux. So since 2.064 `dmd -deps -o- foo.d bar.d` should result in this graph: foo → baz ← bar ↘ ↙ qux But it actually prints this: foo (foo.d) : private : baz (baz.d) foo (foo.d) : private : qux (qux.d) bar (bar.d) : private : baz (baz.d) The same thing with arrows: foo → baz ← bar ↓ qux It's missing bar's dependency on qux! Looks like a serious bug to me. Issue 9948 is being described as "not severe, it will just make build tools less efficient, because modules need to be compiled needlessly". In contrast, the new(er) bug seems severe to me, rendering `dmd -deps` useless for anything but the most trivial toy examples. I suggest reverting to the old behavior. A dependency graph that has some unnecessary edges is better than a graph that is missing necessary edges. Any objections? Given how broken `-deps` apparently is, does anyone even use it (succesfully)? [1] https://issues.dlang.org/show_bug.cgi?id=9948 |
September 11, 2020 Re: `dmd -deps` is broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | On 11.09.20 15:32, ag0aep6g wrote: > I suggest reverting to the old behavior. A dependency graph that has some unnecessary edges is better than a graph that is missing necessary edges. Pull request for that: https://github.com/dlang/dmd/pull/11723 |
Copyright © 1999-2021 by the D Language Foundation