File: extracting-wrapper-flags.rst

package info (click to toggle)
openmpi 5.0.8-3
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 201,692 kB
  • sloc: ansic: 613,078; makefile: 42,353; sh: 11,194; javascript: 9,244; f90: 7,052; java: 6,404; perl: 5,179; python: 1,859; lex: 740; fortran: 61; cpp: 20; tcl: 12
file content (127 lines) | stat: -rw-r--r-- 4,650 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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.

Using the ``--showme`` option
-----------------------------

The wrapper compilers all support a ``--showme`` command line option
that will show what commands would have been invoked.

.. code-block:: sh

   # 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:

   .. code-block:: make

      MPI_COMPILE_FLAGS = $(shell mpicc --showme:compile)
      MPI_LINK_FLAGS = $(shell mpicc --showme:link)

      my_app: my_app.c
              $(CC) $(MPI_COMPILE_FLAGS) my_app.c $(MPI_LINK_FLAGS) -o my_app

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`` |mdash| which
is usually ``$prefix/lib/pkgconfig`` |mdash| to the
``PKG_CONFIG_PATH`` environment variable), then compiling / linking
Open MPI programs can be performed like this:

.. code-block:: sh

   shell$ export PKG_CONFIG_PATH=/opt/openmpi/lib/pkgconfig
   shell$ gcc hello_world_mpi.c -o hello_world_mpi -g \
               `pkg-config ompi-c --cflags --libs`
   shell$

Open MPI supplies multiple ``pkg-config`` configuration files; one for
each different wrapper compiler (language):

* ``ompi``: Synonym for ``ompi-c``; Open MPI applications using the C
  MPI bindings
* ``ompi-c``: Open MPI applications using the C MPI bindings
* ``ompi-cxx``: Open MPI applications using the C MPI bindings
* ``ompi-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:

          .. code-block::

             Requires: pmix
             Requires.private: pmix

          The end result is likely immaterial, but we document this
          just in case it ever becomes an issue someday.


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.

.. code-block::

   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:

.. code-block::

   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