-op can be quite strange
Jonathan Marler
johnnymarler at gmail.com
Sat Sep 1 14:48:55 UTC 2018
The -od (output directory) and -op (perserve source paths) work
great when you're compiling multiple modules in a single
invocation. For example, say we have the following:
/foolib/src/foo/bar.d
/myapp/src/main.d
Current Directory: /myapp
```
dmd -I=../foolib/src -I=src -od=obj -op -c src/main.d
../foolib/src/foo/bar.d
```
This example shows a weird unexpected result. Because I've
specified "../foolib/src/foo/bar.d" on the command line, the
compiler will put the object file here:
obj/../foolib/src/foo/bar.o
which means it will go here:
/myapp/foolib/src/foo/bar.o
This is very strange. Because it has a ".." in the name, it
doesn't even get put in the "obj" folder specified by "-od".
What makes it worse is if you ad used "-i" instead of giving it
on the command line:
```
dmd -I=../foolib/src -I=src -od=obj -op -c src/main.d -i
```
then it would be in:
obj/foo/bar.o
I thought about this for a bit an realized that maybe there's a
better way. Instead of telling the compiler to append the
"relative path" of the source file from CWD to the output
directory like this:
`<relative_path>/<basename>.d` ->
`<output-dir>/<relative_path>/<basename>.o`
`../foolib/src/foo/bar.d` -> `obj/../foolib/src/foo/bar.o`
we could tell the compiler to use the path relative of the source
file from the package root. Let's call it the "package path":
`<some_path>/<package_path>/<basename>.d` ->
`<output-dir>/<package_path>/<basename>.o`
`../foolib/src/foo/bar.d` -> `obj/foo/bar.o`
This would mean modules would go to the same place whether they
were explicitly given on the command line or whether they were a
"compiled import" via "-i". It also handles conflicts because
each fully-qualified module name (and by extension each "package
path" / "module name" combo) must be unique in a compiler
invocation.
Note that we would want this to be a new option so as not to
break anyone depending on "-op" semantics. Maybe "-om" for
"output path based on 'Module' name"?
More information about the Digitalmars-d
mailing list