Difference between revisions of "DIP41"
Timotheecour (talk | contribs) |
Timotheecour (talk | contribs) |
||
Line 55: | Line 55: | ||
2a) | 2a) | ||
Here's one possible way to achieve this (say in next dmd release): | Here's one possible way to achieve this (say in next dmd release): | ||
− | + | <syntaxhighlight lang="bash"> | |
dmd -offilename main.d //works but generates a warning for now, and error in a subsequent dmd release | dmd -offilename main.d //works but generates a warning for now, and error in a subsequent dmd release | ||
dmd -old_flag -offilename main.d //works and doesn't generate a warning. | 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 | dmd -new_flag -of=filename main.d //works. After a certain time passed, -new_flag is implied | ||
+ | </syntaxhighlight> | ||
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). | 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). | ||
Line 71: | Line 72: | ||
rdmd main.d | rdmd main.d | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
Which one do you think is called when we call rdmd main.d ? | 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 | + | 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 |
+ | <syntaxhighlight lang="bash"> | ||
+ | dmd -c -oq foo/mod.d foo_mod.d | ||
+ | </syntaxhighlight> | ||
4) | 4) | ||
The current strategy of rdmd is to treat as input arguments anything after the first source file: | The current strategy of rdmd is to treat as input arguments anything after the first source file: | ||
+ | <syntaxhighlight lang="bash"> | ||
rdmd main.d myfirstprogramarg // a bit awkward, especially with optional extension it gets hard to parse visually. | rdmd main.d myfirstprogramarg // a bit awkward, especially with optional extension it gets hard to parse visually. | ||
+ | </syntaxhighlight> | ||
This is error prone, and inconsistent with dmd's behavior, which is: | This is error prone, and inconsistent with dmd's behavior, which is: | ||
+ | <syntaxhighlight lang="bash"> | ||
dmd src1.d -run main.d myfirstprogramarg //a bit awkward, need to split the source from the main file. | dmd src1.d -run main.d myfirstprogramarg //a bit awkward, need to split the source from the main file. | ||
+ | </syntaxhighlight> | ||
I suggest instead something simpler, explicit and consistent, using -args as a dmd command line argument, that would just work as well with rdmd: | I suggest instead something simpler, explicit and consistent, using -args as a dmd command line argument, that would just work as well with rdmd: | ||
+ | <syntaxhighlight lang="bash"> | ||
dmd main.d src1.d -args myfirstprogramarg | dmd main.d src1.d -args myfirstprogramarg | ||
rdmd main.d -args myfirstprogramarg | rdmd main.d -args myfirstprogramarg | ||
+ | </syntaxhighlight> | ||
5) | 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 | 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 | ||
+ | <syntaxhighlight lang="bash"> | ||
rdmd --chatty --dflags -version=myversion main.d | rdmd --chatty --dflags -version=myversion main.d | ||
+ | </syntaxhighlight> | ||
Notes: | Notes: | ||
Has support of Walter ([http://forum.dlang.org/post/kk4ejt$1pnq$1@digitalmars.com here]) | Has support of Walter ([http://forum.dlang.org/post/kk4ejt$1pnq$1@digitalmars.com here]) |
Revision as of 08:15, 21 May 2013
Contents
DIP 41: dmd command line overhaul. (still editing : don't read 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
This DIP seeks to improve dmd's command line flags, to make it more consistent with other tools, more expandable, and better interact with other tools such as rdmd.
-offilename vs -of=filename
Dmd currently uses 2 conventions for its flags with arguments:
- type A: -offilename, -Dddocdir, -Dffilename, -Ipath (etc)
- type B: -version=ident (etc)
Type A, the most common in dmd, is problematic:
- it doesn't scale: we can't have any new flag starting with "-I" or "-L", etc as it would create conflicts.
- it's visually harder to tell from the command line the options from the arguments to these options
- it's using a different (worst) convention from most other tools (including other D compilers, like gdc or ldc)
For reference, ldc uses: -of=filename, -Dd=docdir, -Df=filename, -I=path etc.
Deprecation path
We should support type B convention for all flags in a future release of dmd, and support the existing ones for some time until they become deprecated.
1) Make all future flags have type B.
2) Migrate all A flags to B flags.
2a) 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 in a subsequent dmd release
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, reminds of D2, ldc2, ldmd2) instead of -newflag. I don't like this as much somehow.
Deprecate passing file without extension
I would like to 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 can create a pathological case where main.d is conflicting with main.d.d (the 2 files have different contents).
rdmd main.d
Which one do you think is called when we call rdmd main.d ? Note, I raised a very analogous concern here [1] 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)