Suppose I have the following library structure (from Andrei
Alexandrescu 'The D Programming Language' pag. 352)

acme
├── algebra.d
└── io
     └── file.d

// acme/algebra.d
module algebra;
import std.stdio;

public void gun() {
    writeln("algebra->gun");
}

// acme/io/file.d
import std.stdio;
public void fun() {
    writeln("file->fun");
}

and suppose I want to use it in this client

acmeClient
├── acme.a
└── client.d


// acmeClient/client.d
import std.stdio;
import algebra;
import io.file;
void main(string[] args) {
    algebra.gun();
    gun();
    fun();
}

I want link acme.a to my client, so Andrei wrote:
-----
The syntax for building a library depends on the implementation;
on the
reference implementation, you’d do something like this:

% cd /path/to/acme_impl
% dmd -lib -ofacme algebra.d gui.d io/file.d io/network.d

The switch -lib instructs the compiler to build a library, and
the switch
-of (“output file”) directs the output to a file called acme.lib
(Windows)
or acme.a (various Unix-derived systems). With that library in
tow, all
you have to do now to get client code running is something like

% dmd client.d acme.lib
-----

So I write (in acme)
   $ cd acme
   $ dmd -lib -ofacme algebra.d io/file.d

in acmeClient
   $ cd ../acmeClient
   $ cp ../acme/acme.a .
   $ dmd client.d acme.a -ofclient
    app.d(2): Error: module algebra is in file 'algebra.d' which
cannot be read

instead if I write
   $ dmd -I../acme acme.a app.d
it works.

So, if I want to use acme library in my client project I need to
know
the entire acme source code. is that correct? Is there an easier
way?

I am a C# programmer and with Mono dmcs compiler I can do:

(in acme)
$ dmcs  -out:acme.a -target:library *.cs

(in acmeClient)
$ cp ../acme/acme.a .
$ dmcs -out:client -target:exe -reference:acme.a *.cs

(..to be honest it easy because mono assembly contains metadata
and
reference options imports that metadata)

So, if I use "Module Summaries" (pag 350 Andrei's book),
$ cd acme
$ dmd -lib -H doitall.d

doitall.di and doitall.d are identical (except for comments).

Is there any "pattern" to use "shared" code inside a project?
(i.e. manually copy all acme source in a client subdirectory, use
git subtree, etc.)

Reply via email to