9.3. Extracting flags from the wrapper compilers
If you cannot use the wrapper compilers for some reason, there are multiple supported ways to extract the compiler/linker flags that you will need.
9.3.1. Using the --showme option
The wrapper compilers all support a --showme command line option
that will show what commands would have been invoked.
# Show the flags necessary to compile MPI C applications shell$mpicc--showme:compile # Show the flags necessary to link MPI C applications shell$mpicc--showme:link # Show all the flags necessary to build MPI C applications shell$mpicc--showme
Note
If you pass --showme and additional command line
parameters to the wrapper compiler, be sure to also pass in a
filename. Otherwise, the --showme functionality will not
display output as expected.
Warning
It is almost never a good idea to hard-code these results
in a Makefile (or other build system). It is almost always
best to run (for example) mpicc --showme:compile in a dynamic
fashion to find out what you need. For example, GNU Make allows
running commands and assigning their results to variables:
MPI_COMPILE_FLAGS=$(shellmpicc--showme:compile) MPI_LINK_FLAGS=$(shellmpicc--showme:link) my_app:my_app.c $(CC)$(MPI_COMPILE_FLAGS)my_app.c$(MPI_LINK_FLAGS)-omy_app
9.3.2. Using pkg-config
Alternatively, Open MPI also installs pkg-config(1) configuration
files under $libdir/pkgconfig. If pkg-config is configured to
find these files (e.g., if you add $libdir/pkgconfig — which
is usually $prefix/lib/pkgconfig — to the
PKG_CONFIG_PATH environment variable), then compiling / linking
Open MPI programs can be performed like this:
shell$exportPKG_CONFIG_PATH=/opt/openmpi/lib/pkgconfig shell$gcchello_world_mpi.c-ohello_world_mpi-g\ `pkg-configompi-c--cflags--libs` shell$
Open MPI supplies multiple pkg-config configuration files; one for
each different wrapper compiler (language):
ompi: Synonym forompi-c; Open MPI applications using the C MPI bindingsompi-c: Open MPI applications using the C MPI bindingsompi-cxx: Open MPI applications using the C MPI bindingsompi-fort: Open MPI applications using the Fortran MPI bindings
Note
Open MPI’s pkg-config files work properly, but they
probably aren’t technically correct.
Specifically: Open MPI will list all of its dependent
libraries that are necessary to link an MPI application,
even if a given dependency has a .pc file and should
therefore be listed as a Requires and/or
Requires.private in Open MPI’s .pc files.
For example, Open MPI lists -lpmix in both Libs and
Libs.private. But since PMIx provides its own
pmix.pc file, it would be more correct for Open MPI to
not list -lpmix in Libs / Libs.private, and
instead include:
Requires: pmix Requires.private: pmix
The end result is likely immaterial, but we document this just in case it ever becomes an issue someday.
9.3.3. Using ompi_info
This method is not directly suitable for getting all the compiler / linker flags needed to compile MPI applications because it does not include the relevant flags to find Open MPI’s headers and libraries. But it does show a breakdown of all other flags.
shell$ ompi_info --all | grep -i wrapper Wrapper extra CFLAGS: Wrapper extra CXXFLAGS: Wrapper extra FFLAGS: Wrapper extra FCFLAGS: Wrapper extra LDFLAGS: Wrapper extra LIBS: -lutil -lnsl -ldl -Wl,--export-dynamic -lm
This installation is only adding options in the xLIBS areas of the
wrapper compilers; all other values are blank (remember: the -I’s
and -L’s are implicit).
Note that the --parsable option can be used to obtain
machine-parsable versions of this output. For example:
shell$ ompi_info --all --parsable | grep wrapper:extra option:wrapper:extra_cflags: option:wrapper:extra_cxxflags: option:wrapper:extra_fflags: option:wrapper:extra_fcflags: option:wrapper:extra_ldflags: option:wrapper:extra_libs:-lutil -lnsl -ldl -Wl,--export-dynamic -lm