A suggestion for modules names / sharing code between projects
Mike Parker via Digitalmars-d
digitalmars-d at puremagic.com
Mon Feb 29 17:51:57 PST 2016
On Monday, 29 February 2016 at 21:43:31 UTC, Sebastien Alaiwan
wrote:
>>> Ok so now let's say I rename the directory "lib" to "foo". If
>>> I don't change the "import lib.hello" to "import foo.hello",
>>> how is the compiler going to find "hello.d"?
>>
>> You have to tell the compiler where it is.
> Is it only possible with separate compilation?
Given two modules, src/lib/foo.d and and src/main.d, you can pass
them both to the command line and not worry about passing -I to
the compiler.
dmd src/main.d src/lib/foo.d
In this case, foo.d can have a module statement that gives it any
name at all. It does not need to match its directory structure:
module wicked.cool.mod;
This works because you've given the module directly to the
compiler and it doesn't need to search for it. If you compile
them separately:
dmd -c src/lib/foo.d
dmd src/main.d foo.obj
Now you will see a compiler error. You've given the compiler
foo's object file, but it doesn't know where the source file is.
When main.d imported wicked.foo.mod, the compiler tried to find
wicked/foo/mod.d from its current working directory. No joy. You
can test this changing the module declaration in foo.d to
lib.foo, then importing lib.foo in main.d. The you can do this:
cd src
dmd -c lib/foo.d
dmd main.d foo.obj
Now when it encounters import lib.foo, it will look for lib/foo.d
and find it. Now do this:
cd ..
dmd -c src/lib/foo.d
dmd src/main.d foo.obj
Again, failure, because it's looking for lib/foo.d. So now you
have to tell it where to find lib/foo.d:
dmd -Isrc src/main.d foo.obj
Now it will look for src/lib/foo.d and find it.
This is why you shouldn't muck about with package names. If you
want to change the name of the src directory, that's fine. You
can simply pass -I to the compiler with the correct value. But if
you want to change the name of lib, you are now affecting the
compiler's ability to find imports. This becomes a problem with
separate compilation (as above), which also means it's a problem
when using libraries. If you change a package name for something
you're distributing as a library, then all the import statements
in client code will need to be changed as well.
More information about the Digitalmars-d
mailing list