D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 767 - compiler shall print dependencies and pragma(lib)
Summary: compiler shall print dependencies and pragma(lib)
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: All All
: P3 enhancement
Assignee: Walter Bright
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-12-29 11:51 UTC by Frank Benoit
Modified: 2014-02-15 13:19 UTC (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Frank Benoit 2006-12-29 11:51:44 UTC
Let the compiler have a new commandline switch:

-bldinfo
-bldinfo=filename
Prints the bldinfo either to the console or into the given file. The bldinfo contains informations about found dependencies and pragma(lib) statements. 

Every bldinfo line has the format:
"bldinfo <recordtype>: <info>"

Every active import from a module will be printed like this:
"bldinfo import: %s(\"%s\") => %s(\"%s\")", moduleFQN, moduleFileName, importedModuleFQN, importedModuleFileName

Every active pragma(lib) is printed like this:
"bldinfo pragma-lib: %s(\"%s\") => \"%s\"", moduleFQN, moduleFileName, stringFromPragma

"Active" here means, the statement is relevant for compilation. It is not deactivated through version/debug/static-if conditions. 

Filenames are printed as absolute paths.
Filenames and strings are escaped like the D string literals and they are double  quoted.

If printed to the console, the bldinfo is printed in between the other messages.
The bldinfo is printed without any special order.
The bldinfo is printed for all modules given on the command line.
The bldinfo is also printed recursively for all modules that are imported.
Comment 1 Don 2010-05-22 07:07:36 UTC
I believe this is mostly implemented in the -deps flag. Is anything left to do?
Comment 2 nfxjfg 2010-05-22 07:24:09 UTC
You still can't get the libs requested by pragma(lib ...).

dmd -v will print the libs, but that's not comfortable enough.
Comment 3 Rainer Schuetze 2010-05-22 23:58:12 UTC
I would like too see string imports to be shown in the dependencies:

c:\>type test.d
int ver=mixin(import("Version"));

c:\>type version
42

c:\>dmd -c -J. -deps=deps test.d

c:\>type deps
test (test.d) : public : object (m:\\s\\d\\phobos\\druntime\\import\\object.di)

This should show "version", too.

Libraries "imported" by pragma(lib) to be shown would be nice, but this is not complete for a building tool, anyway, because pre-built libraries might force the inclusion of more libraries. I'd like the linker to supply a list of searched libraries.
Comment 4 nfxjfg 2010-05-23 00:09:23 UTC
I figure dmd doesn't report these string imports because it would re
Comment 5 nfxjfg 2010-05-23 00:14:12 UTC
I figure dmd doesn't report these string imports because it would require full semantic analysis of the code. Which would be much slower, making the -deps mode less useful.

Maybe the compiler should provide an "-a" flag, which automatically builds all imported modules? Incremental building is broken anyway (at least due to bug 3274, other reasons include CTFE, which subverts module dependencies, and some types of out-of-declaration bugs [forward refs]).

Then dmd would need to run semantically analysis only once to build a program. To facilitate building relatively independent packages as libraries, another flag could be added to dmd to exclude certain package paths using glob patterns.

Sorry for the previous comment, I think I accidentally hit soem key combination, that made the browser to submit the form.
Comment 6 Rainer Schuetze 2010-05-23 04:01:44 UTC
-deps does not enable a different mode, it just tells dmd to output any file imported to the given dependency file during the normal compilation process.

There is no need for an extra compilation step, just use the info in the dependency file from the last compile to figure out if an update is necessary.
Comment 7 jfanatiker 2013-06-09 13:55:13 UTC
Fixed in: https://github.com/D-Programming-Language/dmd/pull/1839
Comment 8 bearophile_hugs 2013-06-09 17:24:27 UTC
(In reply to comment #7)
> Fixed in: https://github.com/D-Programming-Language/dmd/pull/1839

It generates a quite large output :-)
Comment 9 jfanatiker 2013-06-10 00:21:17 UTC
> It generates a quite large output :-)

That is unfortunately true. I tried to trim it, by filtering out all standard versions, but it is still quite a lot and also quite redundant in places.

I don't know if this is a problem, there is one tiny area where it could be reduced a bit, other than that recursive dependency listing is just a whole bunch of information. With a command line overhaul some additional switch could be added so that dependency information is not printed recursively but just for the modules being compiled. Which sometimes is all you need.

And thanks for checking it out! :-)

Best regards,

Robert