Thread overview
std libraries vs. personal libraries
Mar 16, 2006
jicman
Mar 16, 2006
jicman
Mar 17, 2006
John Reimer
Mar 18, 2006
Derek Parnell
Mar 18, 2006
John Reimer
March 16, 2006
I have these two programs:
// test.d
private import std.string;
private import std.stdio;
private import std.date;
private import std.file;
private import std.recls;
private import jic.lib.misc;

int main(char[][] args) { return(0); }

and

// test0.d
private import std.string;
private import std.stdio;
private import std.date;
private import std.file;
private import std.recls;

int main(char[][] args) { return(0); }


When I compile test.d, I get:

15:20:05.13>build -I.. test.d
c:\dmd\bin\..\..\dm\bin\link.exe
C:\cygwin\home\us319318\source\d\jic\lib\misc_bn+C:\cygwin\home\us319318\source\d\jic\lib\misc+RemFiles_bn+test,test.exe,,user32+kernel32,test.def/noi;

and the size of the test.exe file is 162,844 bytes.  However, when I compile test0.d, I get:

15:24:03.45>build -I.. test0.d
c:\dmd\bin\..\..\dm\bin\link.exe test0,test0.exe,,user32+kernel32,test0.def/noi;

and the size of the test0.exe file is 86,556 bytes.

Now, I see that my personal library is getting added also, but I am not adding anything to the program.  Why is the personal library getting added by the compiler when I am not calling any functions from it?

Could it be build?


March 16, 2006
Ok, so I tried dmd and it builds both files ok and with the same file size
(below):

16:05:42.78>dmd -I.. test.d c:\dmd\bin\..\..\dm\bin\link.exe test,,,user32+kernel32/noi;

16:06:02.14>dmd -I.. test0.d c:\dmd\bin\..\..\dm\bin\link.exe test0,,,user32+kernel32/noi;

03/16/2006  04:28 PM            86,556 test.exe
03/16/2006  04:28 PM            86,556 test0.exe

So, apparently, is build.

Derek? :-)


jicman says...
>
>
>I have these two programs:
>// test.d
>private import std.string;
>private import std.stdio;
>private import std.date;
>private import std.file;
>private import std.recls;
>private import jic.lib.misc;
>
>int main(char[][] args) { return(0); }
>
>and
>
>// test0.d
>private import std.string;
>private import std.stdio;
>private import std.date;
>private import std.file;
>private import std.recls;
>
>int main(char[][] args) { return(0); }
>
>
>When I compile test.d, I get:
>
>15:20:05.13>build -I.. test.d
>c:\dmd\bin\..\..\dm\bin\link.exe
>C:\cygwin\home\us319318\source\d\jic\lib\misc_bn+C:\cygwin\home\us319318\source\d\jic\lib\misc+RemFiles_bn+test,test.exe,,user32+kernel32,test.def/noi;
>
>and the size of the test.exe file is 162,844 bytes.  However, when I compile test0.d, I get:
>
>15:24:03.45>build -I.. test0.d
>c:\dmd\bin\..\..\dm\bin\link.exe test0,test0.exe,,user32+kernel32,test0.def/noi;
>
>and the size of the test0.exe file is 86,556 bytes.
>
>Now, I see that my personal library is getting added also, but I am not adding anything to the program.  Why is the personal library getting added by the compiler when I am not calling any functions from it?
>
>Could it be build?
>
>


March 17, 2006
Yes, I believe jicman wrote:
> Ok, so I tried dmd and it builds both files ok and with the same file size
> (below):
> 
> 16:05:42.78>dmd -I.. test.d
> c:\dmd\bin\..\..\dm\bin\link.exe test,,,user32+kernel32/noi;
> 
> 16:06:02.14>dmd -I.. test0.d
> c:\dmd\bin\..\..\dm\bin\link.exe test0,,,user32+kernel32/noi;
> 
> 03/16/2006  04:28 PM            86,556 test.exe
> 03/16/2006  04:28 PM            86,556 test0.exe
> 
> So, apparently, is build.
> 
> Derek? :-)
> 
> 

I believe that by default 'build' compiles and links in files that may be "import-only", so pretty much anything that might be referenced in the imports will be included in the final executable.  That means you may get files in there that merely declare a bunch of symbols: like the ones that use extern(C) or extern(Windows) for external libraries -- you don't need the object form of those modules since they just contain symbol definitions for the external libraries.  Compiling all those symbols and putting the object into your project is going to bloat up the executable, I imagine.

If you know which files are really just import header modules, maybe try using builds exclude function on the command line: -X(module or package).

Did you try -Xphobos?

That might help.

-JJR
March 18, 2006
On Fri, 17 Mar 2006 08:06:07 +1100, jicman <jicman_member@pathlink.com> wrote:

>
> I have these two programs:
> // test.d
> private import std.string;
> private import std.stdio;
> private import std.date;
> private import std.file;
> private import std.recls;
> private import jic.lib.misc;
>
> int main(char[][] args) { return(0); }
>
> and
>
> // test0.d
> private import std.string;
> private import std.stdio;
> private import std.date;
> private import std.file;
> private import std.recls;
>
> int main(char[][] args) { return(0); }
>
>
> When I compile test.d, I get:
>
> 15:20:05.13>build -I.. test.d
> c:\dmd\bin\..\..\dm\bin\link.exe
> C:\cygwin\home\us319318\source\d\jic\lib\misc_bn+C:\cygwin\home\us319318\source\d\jic\lib\misc+RemFiles_bn+test,test.exe,,user32+kernel32,test.def/noi;
>
> and the size of the test.exe file is 162,844 bytes.  However, when I compile
> test0.d, I get:
>
> 15:24:03.45>build -I.. test0.d
> c:\dmd\bin\..\..\dm\bin\link.exe test0,test0.exe,,user32+kernel32,test0.def/noi;
>
> and the size of the test0.exe file is 86,556 bytes.
>
> Now, I see that my personal library is getting added also, but I am not adding
> anything to the program.  Why is the personal library getting added by the
> compiler when I am not calling any functions from it?
>
> Could it be build?

Yes. If the module 'jic.lib.misc' contains nothing that should be linked in, you can add a pragma to it to stop Build from linking it.

  version(build) pragma(nolink);

This can be added anywhere in the 'jic.lib.misc.d' source file.

Typically, you would do this if the source file only contained header info and no function bodies and/or public variables.

-- 
Derek Parnell
Melbourne, Australia
March 18, 2006
In article <op.s6l0j8f26b8z09@ginger.vic.bigpond.net.au>, Derek Parnell says...
>
>Yes. If the module 'jic.lib.misc' contains nothing that should be linked in, you can add a pragma to it to stop Build from linking it.
>
>   version(build) pragma(nolink);
>
>This can be added anywhere in the 'jic.lib.misc.d' source file.
>
>Typically, you would do this if the source file only contained header info and no function bodies and/or public variables.
>
>-- 
>Derek Parnell
>Melbourne, Australia

A point I was wondering about:  version(build) pragma(nolink) is certainly useful, but in most situations these types of modules don't need to be compiled at all since they are headers.  So wouldn't it be better (or at least more efficient) to have a pragma that specified "nocompile" or something similar to avoid an unnecessary step?

Currently, using the -full and -X<module> flags together on the build command line seems to achieve this goal. -full "causes all source files, except ignored modules, to be compiled."  But there is no equivalent in a pragma version.  This would seem more suitable in a header-type module situation as described above.

-JJR