Using dpp on the openmpi headers

bachmeier no at spam.net
Mon Mar 16 01:12:42 UTC 2020


On Friday, 13 March 2020 at 08:08:17 UTC, Peter Jacobs wrote:
> Given the recent thread that mentioned dpp for generating an 
> interface module for a C library, I thought that I would give 
> it a go on the openmpi headers.  I am working in  LinuxMint 
> system and after making a symbolic link for libclang.so, I have 
> had some success but not complete success.
>
> I have a module
>
> // mpi.dpp
>
> module mpi;
>
> #include <mpi.h>
>
> /**
>  * Convert D's string[] args to a correct C char** argv.
>  */
> char** toArgv(string[] args)
> {
>     auto argv = new char*[args.length + 1];
>     foreach(i, arg; args)
>     {
>         argv[i] = (arg.dup ~ '\0').ptr;
>     }
>     argv[args.length] = null;
>     return argv.ptr;
> }
>
> enum MPI_DUMMY = 999;
>
>
> a main module
>
> // hello_d.d
> // hacked out of the hello_d example from the OpenMPI project.
>
> import std.stdio;
> import std.string;
> import std.array;
> import std.algorithm;
> import mpi;
>
> int main(string[] args)
> {
>     int argc = cast(int)args.length;
>     auto argv = args.toArgv();
>
>     int rank;
>     int size;
>     writeln("MPI_VERSION=", MPI_VERSION);
>
>     MPI_Init(&argc, &argv);
>     //MPI_Comm_rank(MPI_COMM_WORLD, &rank);
>     //MPI_Comm_size(MPI_COMM_WORLD, &size);
>     writefln("Hello, world, I am %d of %d", rank+1, size);
>     writeln("MPI_DUMMY=", MPI_DUMMY);
>     //MPI_Barrier(MPI_COMM_WORLD);
>     MPI_Finalize();
>
>     return 0;
> }
>
> and a makefile
>
> # makefile for hello_d, playing with dpp and MPI
>
> hello_d : hello_d.d mpi.d
> 	dmd -ofhello_d hello_d.d mpi.d -L-lmpi
>
> mpi.d : mpi.dpp
> 	dub run dpp -- --include-path=/usr/include/openmpi \
> 		--preprocess-only mpi.dpp
>
> The dpp program successfully generates an interface module 
> mpi.d and the hello_d executable is built and it runs.  
> However, not all of the needed elements for a real MPI program 
> are present.  For example, in the main module above, 
> MPI_COMM_WORLD is not available so the lines calling 
> MPI_Comm_rank, MPI_Comm_size and MPI_Barrier are commented out.
>
> It may be that I am not using dpp correctly, however, running 
> dpp with the -- option gives a lot output that includes
>
> Cursor(MacroDefinition, "MPI_COMM_WORLD", Type(Invalid, "")) 
> CAN @ SourceRange("/usr/include/openmpi/mpi.h", 1034:9, 1034:78)
>
> so I am guessing that dpp does not know how to compute its type 
> and value.
>
> Thoughts or suggestions on how to proceed?

Have you seen this project?

https://github.com/1100110/OpenMPI

As I think about this, OpenMPI is probably one of the most 
difficult libraries to deal with. It's such a complicated beast 
to build that you're supposed to use their wrapper compiler.


More information about the Digitalmars-d mailing list