11.3. Extracting flags from the wrapper compilers
If you cannot use the wrapper compiler for some reason, there are multiple supported ways to extract the compiler/linker flags that you will need.
11.3.1. Using the
The wrapper compiler supports a
--showme command line option
that will show what commands would have been invoked.
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.
It is almost never a good idea to hard-code these results
Makefile (or other build system). It is almost always
best to run (for example)
pmixcc --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:
PMIX_COMPILE_FLAGS = $(shell pmixcc --showme:compile) PMIX_LINK_FLAGS = $(shell pmixcc --showme:link) my_app: my_app.c $(CC) $(PMIX_COMPILE_FLAGS) my_app.c $(PMIX_LINK_FLAGS) -o my_app
Alternatively, PMIx also installs
pkg-config is configured to
find these files (e.g., if you add
$libdir/pkgconfig — which
$prefix/lib/pkgconfig — to the
PKG_CONFIG_PATH environment variable), then compiling / linking
PMIx programs can be performed like this:
shell$ export PKG_CONFIG_PATH=/opt/pmix/lib/pkgconfig shell$ gcc hello_world.c -o hello_world -g \ `pkg-config pmix --cflags --libs` shell$
pkg-config file works properly, but it
probably isn’t technically correct.
Specifically: PMIx will list all of its dependent
libraries that are necessary to link PMIx-based application,
even if a given dependency has a
.pc file and should
therefore be listed as a
Requires.private in PMIx’s
For example, PMIx lists
-lhwloc in both
Libs.private. But since HWLOC provides its own
pmix.pc file, it would be more correct for PMIx to
Requires: hwloc Requires.private: hwloc
The end result is likely immaterial, but we document this just in case it ever becomes an issue someday.
This method is not directly suitable for getting all the compiler / linker flags needed to compile PMIx-based applications because it does not include the relevant flags to find PMIx’s headers and libraries. But it does show a breakdown of all other flags.
shell$ pmix_info --all | grep Build Build CFLAGS: Build LDFLAGS: Build LIBS: -ldl -levent_core -levent_pthreads -lhwloc
This installation is only adding options in the
xLIBS areas of the
wrapper compilers; all other values are blank (remember: the
-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 option:build option:build:cflags: option:build:ldflags: option:build:libs:-ldl -levent_core -levent_pthreads -lhwloc