Difference between revisions of "DIP41"

From D Wiki
Jump to: navigation, search
(Deprecation path)
(Deprecate passing file without extension)
Line 73: Line 73:
 
</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, see my example with  
 
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">
 
<syntaxhighlight lang="bash">
Line 78: Line 79:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
4)
+
== Improving compile and run with arguments ==
 
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">
 
<syntaxhighlight lang="bash">
Line 87: Line 88:
 
<syntaxhighlight lang="bash">
 
<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>
 +
 +
It also makes it impossible to do this:
 +
<syntaxhighlight lang="bash">
 +
dmd -c main.d
 +
dmd -run main.o myfirstprogramarg #Error: -run must be followed by a source file
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Line 96: Line 103:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
5)
+
== Distinguish dmd vs rdmd flags with a single flag --dflags ==
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">
 
<syntaxhighlight lang="bash">
 
rdmd --chatty --dflags -version=myversion main.d
 
rdmd --chatty --dflags -version=myversion main.d
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Notes:
+
== Deprecate rdmd --main (redundant with dmd -main) ==
Has support of Walter ([http://forum.dlang.org/post/kk4ejt$1pnq$1@digitalmars.com here])
+
dmd -main was introduced in 2.063, so we should deprecate the use of rdmd --main, which is redundant.
 +
 
 +
== Notes ==
 +
It seems at least some of the changes proposed have support of Walter ([http://forum.dlang.org/post/kk4ejt$1pnq$1@digitalmars.com here]).
 +
 
 +
== Copyright ==
 +
 
 +
This document has been placed in the Public Domain.
 +
 
 +
[[Category: DIP]]

Revision as of 08:51, 21 May 2013

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 (say in next dmd release):

2a) One way is to introduce command line arguments -flagstyle=old or -flagstyle=new:

dmd -offilename main.d #works but generates a warning for now, and error in a subsequent dmd release
dmd -flagstyle=old -offilename main.d #works and does not generate a warning.
dmd -flagstyle=new -of=filename main.d #works. After a certain time passed, -flagstyle=new is implied

Note, A and B conventions for flags that currently are using A convention can't be mixed in a command line call, eg: -offilename -Ddoc=dir will give error, in all 3 cases above.

2b) An alternative way is to use a new binary name (dmd2, reminds of D2, ldc2, ldmd2) instead of -flagstyle=new. I don't like this as much somehow, as it requires compiling 2 binaries instead of 1, which complicates build.

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

Improving compile and run with arguments

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.

It also makes it impossible to do this:

dmd -c main.d 
dmd -run main.o myfirstprogramarg #Error: -run must be followed by a source 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

Distinguish dmd vs rdmd flags with a single flag --dflags

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

Deprecate rdmd --main (redundant with dmd -main)

dmd -main was introduced in 2.063, so we should deprecate the use of rdmd --main, which is redundant.

Notes

It seems at least some of the changes proposed have support of Walter (here).

Copyright

This document has been placed in the Public Domain.