Thread overview
[Issue 9285] New: dtoh
Jan 09, 2013
Iain Buclaw
[Issue 9285] dtoh utility - convert D files to C++ header files
Jan 09, 2013
Andrej Mitrovic
Jan 09, 2013
Adam D. Ruppe
Jan 09, 2013
Adam D. Ruppe
Jan 15, 2013
Adam D. Ruppe
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285

           Summary: dtoh
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: andrei@erdani.com


--- Comment #0 from Andrei Alexandrescu <andrei@erdani.com> 2013-01-09 00:10:47 PST ---
Generating D files from C or C++ header files is a difficult endeavor. However, the converse process of generating C++ header files from D source files is easier to approach, and very useful.

Possible uses include migrating a large C++ codebase to D in small steps without needing to deal with declaration duplication across D code and C++ legacy code. (The dmd compiler itself may use the tool.) Using D as source and translating from D to C++ gives a robust unique point of maintenance.

Here are a few requirements:

* dtoh takes a D file as input and generates C++ declarations for all pertinent function and class declarations in the D file.

* Accepted declarations: data, functions, classes, and interfaces for all types that have a C++ correspondent.

* D declarations that cannot be translated into C++ will be ignored.

* In order to stay decoupled from the compiler, dtoh should generate C++ code from the JSON output of the D compiler.

* For make friendliness, dtoh should overwrite its output if and only if the generated output is different from the existing output.

* The generated C++ code should be human readable (nicely indented etc) and use
good C++ practices (e.g. include guards etc).

* C++11 generation is default, there should be an option to generate C++98.

The tool would be in the tools/ repository and distributed alongside with the compiler in source and binary forms.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285


Alex Rønne Petersen <alex@lycus.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |alex@lycus.org


--- Comment #1 from Alex Rønne Petersen <alex@lycus.org> 2013-01-09 09:14:55 CET ---
So how do you see this working overall? Generate a bunch of mangled declarations in the resulting .h and then generate some nice C++-y wrappers around them?

> * C++11 generation is default, there should be an option to generate C++98.

Virtually every C++ compiler in existence supports C++03, so why not that?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285


Iain Buclaw <ibuclaw@ubuntu.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ibuclaw@ubuntu.com


--- Comment #2 from Iain Buclaw <ibuclaw@ubuntu.com> 2013-01-09 00:20:53 PST ---
(In reply to comment #1)
> So how do you see this working overall? Generate a bunch of mangled declarations in the resulting .h and then generate some nice C++-y wrappers around them?
> 
> > * C++11 generation is default, there should be an option to generate C++98.
> 
> Virtually every C++ compiler in existence supports C++03, so why not that?

It's true, even GCC's -std=c++98 switch is just an alias for -std=c++03

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285



--- Comment #3 from Andrei Alexandrescu <andrei@erdani.com> 2013-01-09 00:22:31 PST ---
(In reply to comment #1)
> So how do you see this working overall? Generate a bunch of mangled declarations in the resulting .h and then generate some nice C++-y wrappers around them?

No, just generate declarations for extern(C++) names. This is a tool for people who want to interface with C++ and know what steps to take.

> > * C++11 generation is default, there should be an option to generate C++98.
> 
> Virtually every C++ compiler in existence supports C++03, so why not that?

OK

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285


Andrej Mitrovic <andrej.mitrovich@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich@gmail.com


--- Comment #4 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2013-01-09 08:58:26 PST ---
(In reply to comment #0)
> * In order to stay decoupled from the compiler, dtoh should generate C++ code
from the JSON output of the D compiler.

JSON output still needs fixing, see https://github.com/D-Programming-Language/dmd/pull/1179

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285


Adam D. Ruppe <destructionator@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |destructionator@gmail.com


--- Comment #5 from Adam D. Ruppe <destructionator@gmail.com> 2013-01-09 09:07:41 PST ---
I just slapped something together very very quickly. It works for a couple simple things I've tried on linux: simple functions and interfaces.

http://arsdnet.net/dcode/dtocpp.zip

includes a little test program (test.c, test.cpp, and testcpp.d), a makefile for it, and of course, the main app, dtoh.d.

dmd dtoh.d
make

The makefile will regenerate testcpp.json and run dtoh to build testcpp.h.


I just realized, I guess I should add POD structs too, but I have real work to get back to now.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285



--- Comment #6 from Andrei Alexandrescu <andrei@erdani.com> 2013-01-09 10:14:10 PST ---
(In reply to comment #5)
> I just slapped something together very very quickly. It works for a couple simple things I've tried on linux: simple functions and interfaces.
> 
> http://arsdnet.net/dcode/dtocpp.zip
> 
> includes a little test program (test.c, test.cpp, and testcpp.d), a makefile for it, and of course, the main app, dtoh.d.
> 
> dmd dtoh.d
> make
> 
> The makefile will regenerate testcpp.json and run dtoh to build testcpp.h.
> 
> 
> I just realized, I guess I should add POD structs too, but I have real work to get back to now.

Great. When you'll assess your work is in reviewable form, you may want to submit it as a pull request to github.com/D-Programming-Language/tools. Once we have a good initial codebase others can work on it.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285



--- Comment #7 from Adam D. Ruppe <destructionator@gmail.com> 2013-01-09 11:16:49 PST ---
work is boring so i updated the zip instead. Hit a few problems, we'll really need to improve dmd's json output (I vote for that pull request!) to go much further than this I think. Maybe fix up forward declarations but meh.

Turning import into include needs more json from dmd as well, and that's going to be nice to have for real work (though not strictly necessary... the user could always #include everything in the main file).

Anyway here it is:
http://arsdnet.net/dcode/dtocpp.zip

Now structs are outputted too, as plain data skipping any functions (which I'm pretty sure should work anyway), and types are translated a little differently.

If you write your declarations in D, whether you implement them in C++ or D doesn't matter, this is kinda cool for going both ways.


But yeah I think this is about as good as we're going to get until that dmd pull request for json happens.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 09, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285



--- Comment #8 from Andrei Alexandrescu <andrei@erdani.com> 2013-01-09 11:22:05 PST ---
(In reply to comment #7)
> Turning import into include needs more json from dmd as well

Please submit to bugzilla anything you have, and fill the "depends on" field above to mark the dependency. Thanks!

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 15, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9285



--- Comment #9 from Adam D. Ruppe <destructionator@gmail.com> 2013-01-15 10:11:18 PST ---
Here's a pull request with what I wrote up last week: https://github.com/D-Programming-Language/tools/pull/39

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------