DIP41
DIP 41: dmd command line overhaul. (still editing : don't look yet)
Title: | dmd command line overhaul. |
---|---|
DIP: | 41 |
Version: | 1 |
Status: | Draft |
Created: | 2013-05-20 |
Last Modified: | 2013-05-20 |
Author: | Timothee Cour |
Links: | dmd command line options bad design: -offilename, -Ddocdir etc. |
Abstract
Dmd currently uses 2 conventions for its flags with arguments:
- -version=ident
- -offilename
The 2nd version is problematic,
-Dddocdir
-Dffilename
-Ipath
-offilename
(etc...)
vs a sane way, eg the one used in ldc2 (or many other unix tools, which have a space at least as delimiter):
-Dd=docdir -Df=filename -I=path -of=filename
The problem is:
- dmd's flags don't scale: now we can't have any new flag starting
with "-I" or "-L", etc as it would create conflicts. And I know some people want to keep the number of flags to a minimum but that's not a good reason to restrict future expansion ability
- it's visually harder to tell from the command line the options from
the arguments to these options.
If we don't deprecate in favor of the ldc2 style (is that an option with a proper deprecation path?), can we at least make sure any future flags will follow ldc2's convention?
support both the old and the new ways for now.
Let's agree on specifics before writing enhancement request, and possibly make a single one-time breaking change instead of several short-sighted ones.
With type A being -offilename and type B being -of=filename, how about:
1) prevent any newly created flags of type A
2) migrate all A flags to B flags. Here's one possible way to achieve this (say in next dmd release):
dmd -offilename main.d //works but generates a warning for now, and error after a certain time passed dmd -old_flag -offilename main.d //works and doesn't generate a warning. dmd -new_flag -of=filename main.d //works. After a certain time passed, -new_flag is implied
Note, A and B flags can't be mixed, eg: -offilename -Ddoc=dir will give error, in all 3 cases above (ie for flags that are currently in the A style).
2b) Alternative: use a new binary name (dmd2) instead of -newflag. I don't like this as much somehow.
3) can we deprecate the current behavior where one can pass the file name without extension (main vs main.d) as source? Consistency is better than avoiding to type those 2 characters. I created a pathological case with main.d is conflicting with main.d.d (with different contents). Which one do you think is called when we call rdmd main.d ? Note, I raised a very analogous concern here https://github.com/D-Programming-Language/dmd/pull/1871#issuecomment-16101987 regarding naming of object files in a flat hierarchy (see my example with dmd -c -oq foo/mod.d foo_mod.d)
4) The current strategy of rdmd is to treat as input arguments anything after the first source file: rdmd main.d myfirstprogramarg // a bit awkward, especially with optional extension it gets hard to parse visually.
This is error prone, and inconsistent with dmd's behavior, which is: dmd src1.d -run main.d myfirstprogramarg //a bit awkward, need to split the source from the main file.
I suggest instead something simpler, explicit and consistent, using -args as a dmd command line argument, that would just work as well with rdmd:
dmd main.d src1.d -args myfirstprogramarg rdmd main.d -args myfirstprogramarg
5)
currently we distinguish rdmd's arguments from dmd's arguments via
'--' vs '-'. A better way IMO would be to have a special flag
indicating the start of dmd's (or gdc/ldc...) flags: eg
rdmd --chatty --dflags -version=myversion main.d
Notes: Has support of Walter (here)