Re: Compililng C++ and D together without going mad

2020-04-29 Thread IGotD- via Digitalmars-d-learn

On Wednesday, 29 April 2020 at 10:25:31 UTC, Jan Hönig wrote:
In my pet project, I am using some C++ libraries. The main 
file/function is also C++. All of it successfully compiles with 
cmake. Now I want to add some functionality by calling my own D 
functions (which use some other modules/projects/phobos).


My questions is, what is the "proper" building tool/way.
Do I extend my CMakeFile.txt with additional instructions, 
which basically do a "dmd -c ...".
Do I use dub to compile the D part as a library, and use that 
in the cmake file?

Do I use dub to compile the C++ part as well?

Surely somebody has done something similar.
Can you pinpoint me to some examples? I could go from there.


For mixed language project use Cmake only, you do not need to 
involve dub.


You extend Cmake to compile D files. You add these files with the 
contents.


CMakeDCompiler.cmake.in:
set(CMAKE_D_COMPILER "@CMAKE_D_COMPILER@")
set(CMAKE_D_COMPILER_LOADED 1)
set(CMAKE_D_SOURCE_FILE_EXTENSIONS 
@CMAKE_D_SOURCE_FILE_EXTENSIONS@)

set(CMAKE_D_OUTPUT_EXTENSION @CMAKE_D_OUTPUT_EXTENSION@)
set(CMAKE_D_COMPILER_ENV_VAR "@CMAKE_D_COMPILER_ENV_VAR@")


CMakeDetermineDCompiler.cmake:
# Find the D compiler
find_program(
CMAKE_D_COMPILER
NAMES "ldc2"
HINTS "${CMAKE_SOURCE_DIR}"
DOC "LDC compiler"
)
mark_as_advanced(CMAKE_D_COMPILER)

set(CMAKE_D_SOURCE_FILE_EXTENSIONS d)
set(CMAKE_D_OUTPUT_EXTENSION .obj)
set(CMAKE_D_COMPILER_ENV_VAR "D")

# Configure variables set in this file for fast reload later on
configure_file(${CMAKE_CURRENT_LIST_DIR}/CMakeDCompiler.cmake.in
   ${CMAKE_PLATFORM_INFO_DIR}/CMakeDCompiler.cmake)


CMakeDInformation.cmake:
if(NOT CMAKE_D_COMPILE_OBJECT)
set(CMAKE_D_COMPILE_OBJECT " 
${CMAKE_D_FLAGS} -c --of= ")

endif()
set(CMAKE_D_INFORMATION_LOADED 1)


CMakeTestDCompiler.cmake:
# For now just do nothing in here
set(CMAKE_D_COMPILER_WORKS 1 CACHE INTERNAL "")


Put these files somewhere and tell Cmake were to find them.

set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" 
${THE_PATH_TO_THE_FILES}" CACHE INTERNAL "")


You need to enable D language to use it with.

enable_language(D)



You can make this more complex but this will make you start 
quickly. Now Cmake will compile D files as soon as it encounters 
source files with the .d extension. You can gladly mix C++ and D 
files and it will link them all together.






Re: Compililng C++ and D together without going mad

2020-04-29 Thread Johan via Digitalmars-d-learn

On Wednesday, 29 April 2020 at 13:02:36 UTC, Jan Hönig wrote:

On Wednesday, 29 April 2020 at 11:38:16 UTC, Johan wrote:
LDC is a (somewhat complex) project with D and C++ code (and 
external C++ libraries).
I think it will help you if your main() is in D (such that 
druntime is automatically initialized for you).

https://github.com/ldc-developers/ldc

-Johan


Hmmm, a D main means i need to do quite some C++ bindings, with 
which I have 0 experience. I cannot even say if it will be 
possible.


I will probably need:
https://github.com/jupyter-xeus/xeus/blob/master/include/xeus/xkernel.hpp
https://github.com/jupyter-xeus/xeus/blob/master/include/xeus/xkernel_configuration.hpp
c++ stdlib's unique_ptr.
And then i need to subclass a C++ class and extern this D 
subclass.


It sounds easier to me, to manually initialize D's runtime (i 
imagine it being some function calls), build everything with 
C++, and just call D functions from C++.


Manually initializing D's runtime is also possible. You need to 
call rt_init and rt_term: 
https://dlang.org/phobos/core_runtime.html#.rt_init


What I meant is to
- add a `int main()` in a D source file
- rename your current `main` in the C++ source file to something 
like `the_real_main`
- add a forward reference to the D file: `extern(C) int 
the_real_main();`

- call `the_real_main` from the `main` in the D file

That way you don't have to think about how to correctly 
initialize D's runtime.


-Johan






Re: Compililng C++ and D together without going mad

2020-04-29 Thread Jan Hönig via Digitalmars-d-learn

On Wednesday, 29 April 2020 at 13:12:50 UTC, Johan wrote:
Manually initializing D's runtime is also possible. You need to 
call rt_init and rt_term: 
https://dlang.org/phobos/core_runtime.html#.rt_init


What I meant is to
- add a `int main()` in a D source file
- rename your current `main` in the C++ source file to 
something like `the_real_main`
- add a forward reference to the D file: `extern(C) int 
the_real_main();`

- call `the_real_main` from the `main` in the D file

That way you don't have to think about how to correctly 
initialize D's runtime.


-Johan


I thought it was a good idea to ask in the forum!
This actually helps me a lot, thanks!


Re: Compililng C++ and D together without going mad

2020-04-29 Thread Jan Hönig via Digitalmars-d-learn

On Wednesday, 29 April 2020 at 13:02:36 UTC, Jan Hönig wrote:

I will probably need:

Also this thing: https://github.com/nlohmann/json


Re: Compililng C++ and D together without going mad

2020-04-29 Thread Jan Hönig via Digitalmars-d-learn

On Wednesday, 29 April 2020 at 11:38:16 UTC, Johan wrote:
LDC is a (somewhat complex) project with D and C++ code (and 
external C++ libraries).
I think it will help you if your main() is in D (such that 
druntime is automatically initialized for you).

https://github.com/ldc-developers/ldc

-Johan


Hmmm, a D main means i need to do quite some C++ bindings, with 
which I have 0 experience. I cannot even say if it will be 
possible.


I will probably need:
https://github.com/jupyter-xeus/xeus/blob/master/include/xeus/xkernel.hpp
https://github.com/jupyter-xeus/xeus/blob/master/include/xeus/xkernel_configuration.hpp
c++ stdlib's unique_ptr.
And then i need to subclass a C++ class and extern this D 
subclass.


It sounds easier to me, to manually initialize D's runtime (i 
imagine it being some function calls), build everything with C++, 
and just call D functions from C++.


Or do you think it is worth the hassle with bindings?

I have done C++ bindings once,years ago in python and it was a 
not pleasent.


Re: Compililng C++ and D together without going mad

2020-04-29 Thread Johan via Digitalmars-d-learn

On Wednesday, 29 April 2020 at 10:25:31 UTC, Jan Hönig wrote:
In my pet project, I am using some C++ libraries. The main 
file/function is also C++. All of it successfully compiles with 
cmake. Now I want to add some functionality by calling my own D 
functions (which use some other modules/projects/phobos).


My questions is, what is the "proper" building tool/way.
Do I extend my CMakeFile.txt with additional instructions, 
which basically do a "dmd -c ...".
Do I use dub to compile the D part as a library, and use that 
in the cmake file?

Do I use dub to compile the C++ part as well?

Surely somebody has done something similar.
Can you pinpoint me to some examples? I could go from there.


LDC is a (somewhat complex) project with D and C++ code (and 
external C++ libraries).
I think it will help you if your main() is in D (such that 
druntime is automatically initialized for you).

https://github.com/ldc-developers/ldc

-Johan