hwloc: null check for cpuset
[mpich-dev.git] / Makefile.am
1 # -*- Mode: Makefile; -*-
2 #
3 # (C) 2011 by Argonne National Laboratory.
4 #     See COPYRIGHT in top-level directory.
5 #
6
7 ACLOCAL_AMFLAGS = -I confdb -I src/hwloc/config
8
9 # automake requires that we initialize variables to something, even just empty,
10 # before appending to them with "+="
11 AM_CFLAGS = @VISIBILITY_CFLAGS@ @HWLOC_EMBEDDED_CFLAGS@
12 AM_CPPFLAGS = @HWLOC_EMBEDDED_CPPFLAGS@
13 AM_FFLAGS =
14 AM_FCFLAGS =
15 include_HEADERS =
16 nodist_include_HEADERS =
17 nodist_noinst_HEADERS =
18 BUILT_SOURCES =
19 bin_PROGRAMS =
20 bin_SCRIPTS =
21 dist_noinst_SCRIPTS = autogen.sh
22 noinst_DATA =
23 dist_noinst_DATA =
24 noinst_HEADERS =
25 noinst_LIBRARIES =
26 noinst_LTLIBRARIES =
27 sysconf_DATA =
28 nodist_pkgconfig_DATA =
29 CLEANFILES =
30 DISTCLEANFILES =
31 MAINTAINERCLEANFILES =
32 SUFFIXES = 
33 EXTRA_DIST =
34 DOC_SUBDIRS =
35 MANDOC_SUBDIRS =
36 HTMLDOC_SUBDIRS =
37 INSTALL_DATA_LOCAL_TARGETS =
38 doc1_src_txt =
39 doc3_src_txt =
40
41 # add (+=) target names to this variable to add them to the dependencies of the
42 # 'clean-local' target
43 CLEAN_LOCAL_TARGETS =
44
45 # used by nodist_pkgconfig_DATA
46 pkgconfigdir = @pkgconfigdir@
47
48 # contains all of the "errnames.txt" files that are used by maint/extracterrmsgs
49 # to build src/mpi/errhan/defmsg.h
50 errnames_txt_files = 
51
52 external_subdirs = @mplsrcdir@ @opasrcdir@ @zmsrcdir@ @hwlocsrcdir@
53 external_ldflags = @mpllibdir@ @opalibdir@ @zmlibdir@ @hwloclibdir@
54 external_libs = @WRAPPER_LIBS@
55 mpi_convenience_libs =
56 pmpi_convenience_libs = @opalib@ @mpllib@ @zmlib@ @hwloclib@
57
58 # NOTE on our semi-unconventional usage of DIST_SUBDIRS:
59 # The automake manual recommends thinking of DIST_SUBDIRS as the list of all
60 # *configured* subdirectories.  The normal autotools model involves
61 # unconditional configure steps for all/most directories with conditional make
62 # steps (i.e., conditional inclusion in SUBDIRS).  But in the MPICH case we
63 # almost always configure exactly the directories that will be included in
64 # SUBDIRS.  So most additions to DIST_SUBDIRS should be conditional on the same
65 # condition as the corresponding SUBDIRS addition.
66 DIST_SUBDIRS = ${external_subdirs}
67 SUBDIRS = ${external_subdirs}
68
69 ## Automake attempts to guess the correct linker among the various compilers
70 ## for each language (see "How the Linker is Chosen" in the AM manual).
71 ## However, this process is static and doesn't assume that you will "disable"
72 ## Fortran support for a library and still actually build that library.
73 ## lib@MPILIBNAME@.la contains both C and F77 source, so AM picks "F77LD" as the
74 ## linker.  Instead we manually override automake's choice based on the value of
75 ## enable_f77.
76 if BUILD_F77_BINDING
77 # link with libtool+F77LD
78 lib_lib@MPILIBNAME@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \
79         $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \
80         $(AM_FFLAGS) $(FFLAGS) $(lib_lib@MPILIBNAME@_la_LDFLAGS) \
81         $(LDFLAGS) -o $@
82 lib_lib@PMPILIBNAME@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \
83         $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \
84         $(AM_FFLAGS) $(FFLAGS) $(lib_lib@PMPILIBNAME@_la_LDFLAGS) \
85         $(LDFLAGS) -o $@
86 else !BUILD_F77_BINDING
87 # link with libtool+CCLD
88 lib_lib@MPILIBNAME@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
89         $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
90         $(lib_lib@MPILIBNAME@_la_CFLAGS) $(CFLAGS) \
91         $(lib_lib@MPILIBNAME@_la_LDFLAGS) $(LDFLAGS) -o $@
92 lib_lib@PMPILIBNAME@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
93         $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
94         $(lib_lib@PMPILIBNAME@_la_CFLAGS) $(CFLAGS) \
95         $(lib_lib@PMPILIBNAME@_la_LDFLAGS) $(LDFLAGS) -o $@
96 endif !BUILD_F77_BINDING
97
98 if BUILD_F77_BINDING
99 if BUILD_FC_BINDING
100 lib_lib@MPIFCLIBNAME@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC \
101         $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
102         $(AM_FCFLAGS) $(FCFLAGS) $(lib_lib@MPIFCLIBNAME@_la_LDFLAGS) \
103         $(LDFLAGS) -o $@
104 else !BUILD_FC_BINDING
105 lib_lib@MPIFCLIBNAME@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \
106         $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \
107         $(AM_FFLAGS) $(FFLAGS) $(lib_lib@MPIFCLIBNAME@_la_LDFLAGS) \
108         $(LDFLAGS) -o $@
109 endif !BUILD_FC_BINDING
110 endif BUILD_F77_BINDING
111
112 ## Create lists of files for different libraries
113 ##
114 ## mpi_sources: When compiled with -DMPICH_MPI_FROM_PMPI, these files
115 ## provide "MPI_" public functions for the C bindings and end up in
116 ## lib@MPILIBNAME@.  When compiled without this macro, these files
117 ## provide "PMPI_" public functions for the C bindings as well as a
118 ## few other internal MPICH functions, all of which end up in
119 ## lib@PMPILIBNAME@ (which is the same as lib@MPILIBNAME@ on systems
120 ## that support weak symbols).
121 ##
122 ## mpi_f77_sources: When compiled with -DMPICH_MPI_FROM_PMPI, these
123 ## files provide the "mpi_" public functions for the F77 bindings and
124 ## end up in lib@MPIFCLIBNAME@.
125 ##
126 ## mpi_fc_sources: When compiled with -DMPICH_MPI_FROM_PMPI, these
127 ## files provide the "mpi_" public functions for the F90+ bindings and
128 ## end up in lib@MPIFCLIBNAME@.
129 ##
130 ## mpi_cxx_sources: When compiled with -DMPICH_MPI_FROM_PMPI, these
131 ## files provide the "MPI" public functions for the C++ bindings and
132 ## end up in lib@MPICXXLIBNAME@.
133 ##
134 ## mpi_core_sources: These files are internal non-public functions
135 ## that are used by all bindings.
136 mpi_sources =
137 mpi_f77_sources =
138 mpi_fc_sources =
139 mpi_fc_modules =
140 mpi_cxx_sources =
141 mpi_core_sources =
142
143 lib_LTLIBRARIES =
144
145 # include our subdir automake fragments
146 include maint/Makefile.mk
147 include src/Makefile.mk
148
149 if BUILD_PROFILING_LIB
150 # dropping mpi_fc_sources and mpi_cxx_sources from libmpmpi since they
151 # don't contribute any PMPI symbols.
152 lib_LTLIBRARIES += lib/lib@PMPILIBNAME@.la
153 lib_lib@PMPILIBNAME@_la_SOURCES = $(mpi_sources) $(mpi_f77_sources) $(mpi_core_sources)
154 lib_lib@PMPILIBNAME@_la_LDFLAGS = $(external_ldflags) $(ABIVERSIONFLAGS)
155 lib_lib@PMPILIBNAME@_la_CPPFLAGS = $(AM_CPPFLAGS) -DF77_USE_PMPI
156 lib_lib@PMPILIBNAME@_la_LIBADD = $(external_libs) $(pmpi_convenience_libs)
157 EXTRA_lib_lib@PMPILIBNAME@_la_DEPENDENCIES = $(pmpi_convenience_libs)
158
159 # lib@MPILIBNAME@.la might depend on lib@PMPILIBNAME@.la.  We add them
160 # in that order to lib_LTLIBRARIES so libtool doesn't get
161 # confused. (see https://bugzilla.redhat.com/show_bug.cgi?id=91110)
162 lib_LTLIBRARIES += lib/lib@MPILIBNAME@.la
163 lib_lib@MPILIBNAME@_la_SOURCES = $(mpi_sources)
164 lib_lib@MPILIBNAME@_la_LDFLAGS = $(ABIVERSIONFLAGS)
165 lib_lib@MPILIBNAME@_la_CPPFLAGS = $(AM_CPPFLAGS) -DMPICH_MPI_FROM_PMPI
166 lib_lib@MPILIBNAME@_la_LIBADD = lib/lib@PMPILIBNAME@.la $(mpi_convenience_libs)
167
168 else !BUILD_PROFILING_LIB
169
170 lib_LTLIBRARIES += lib/lib@MPILIBNAME@.la
171 lib_lib@MPILIBNAME@_la_SOURCES = $(mpi_sources) $(mpi_core_sources)
172 lib_lib@MPILIBNAME@_la_LDFLAGS = $(external_ldflags) $(ABIVERSIONFLAGS)
173 lib_lib@MPILIBNAME@_la_CPPFLAGS = $(AM_CPPFLAGS)
174 lib_lib@MPILIBNAME@_la_LIBADD = $(external_libs) $(pmpi_convenience_libs) $(mpi_convenience_libs)
175 EXTRA_lib_lib@MPILIBNAME@_la_DEPENDENCIES = $(pmpi_convenience_libs) $(mpi_convenience_libs)
176 endif !BUILD_PROFILING_LIB
177
178 if BUILD_F77_BINDING
179 lib_LTLIBRARIES += lib/lib@MPIFCLIBNAME@.la
180 lib_lib@MPIFCLIBNAME@_la_CPPFLAGS = $(AM_CPPFLAGS)
181 if BUILD_PROFILING_LIB
182 lib_lib@MPIFCLIBNAME@_la_CPPFLAGS += -DMPICH_MPI_FROM_PMPI -DUSE_ONLY_MPI_NAMES
183 endif BUILD_PROFILING_LIB
184 lib_lib@MPIFCLIBNAME@_la_SOURCES = $(mpi_f77_sources)
185 if BUILD_FC_BINDING
186 modinc_HEADERS = $(mpi_fc_modules)
187 lib_lib@MPIFCLIBNAME@_la_SOURCES += $(mpi_fc_sources)
188 endif BUILD_FC_BINDING
189 lib_lib@MPIFCLIBNAME@_la_LDFLAGS = $(ABIVERSIONFLAGS)
190 lib_lib@MPIFCLIBNAME@_la_LIBADD = lib/lib@MPILIBNAME@.la
191 endif BUILD_F77_BINDING
192
193 if BUILD_CXX_BINDING
194 lib_LTLIBRARIES += lib/lib@MPICXXLIBNAME@.la
195 lib_lib@MPICXXLIBNAME@_la_SOURCES = $(mpi_cxx_sources)
196 lib_lib@MPICXXLIBNAME@_la_LDFLAGS = $(ABIVERSIONFLAGS)
197 lib_lib@MPICXXLIBNAME@_la_LIBADD = lib/lib@MPILIBNAME@.la
198 endif BUILD_CXX_BINDING
199
200 # build the current directory and then the examples directory after everything else
201 SUBDIRS += . examples
202 DIST_SUBDIRS += . examples test
203
204 EXTRA_DIST += README CHANGES COPYRIGHT README.envvar
205
206 # README.vin is tricky, we don't actually distribute it when we use release.pl,
207 # but we do need to distribute it in order for ./autogen.sh to work
208 # correctly on a distribution tarball.  For now we distribute it when we "make
209 # dist".
210 EXTRA_DIST += README.vin
211
212 testing:
213         ( cd test && $(MAKE) $(AM_MAKEFLAGS) testing )
214
215 test-clean:
216         ( cd test && $(MAKE) $(AM_MAKEFLAGS) clean )
217 CLEAN_LOCAL_TARGETS += test-clean
218
219 ## FIXME: this should live in src/env/Makefile.mk. Moving it there
220 ## will not cause a problem, but it will break the build if another
221 ## Makefile.mk also decides to create a install-exec-hook target. A
222 ## better approach might be to have each Makefile.mk append to a
223 ## common set of rules.
224 install-exec-hook:
225         for e in ${DESTDIR}${bindir}/@MPICC_NAME@ ${DESTDIR}${bindir}/@MPICXX_NAME@ \
226                 ${DESTDIR}${bindir}/@MPIF77_NAME@ ${DESTDIR}${bindir}/@MPIFORT_NAME@ ; do \
227                 if test -e $${e} ; then \
228                         sed -e 's|__PREFIX_TO_BE_FILLED_AT_INSTALL_TIME__|${prefix}|g' \
229                                 -e 's|__EXEC_PREFIX_TO_BE_FILLED_AT_INSTALL_TIME__|${exec_prefix}|g' \
230                                 -e 's|__SYSCONFDIR_TO_BE_FILLED_AT_INSTALL_TIME__|${sysconfdir}|g' \
231                                 -e 's|__INCLUDEDIR_TO_BE_FILLED_AT_INSTALL_TIME__|${includedir}|g' \
232                                 -e 's|__LIBDIR_TO_BE_FILLED_AT_INSTALL_TIME__|${libdir}|g' $${e} > $${e}.tmp ; \
233                         $(INSTALL_SCRIPT) $${e}.tmp $${e} ; \
234                         rm -f $${e}.tmp ; \
235                 fi ; \
236         done ; \
237         if test -e ${DESTDIR}${bindir}/@MPICXX_NAME@ ; then \
238                 if test "@MPICXX_NAME@" != "@MPICPP_NAME@" ; then \
239                         cd ${DESTDIR}${bindir} && ln -f -s @MPICXX_NAME@ @MPICPP_NAME@ ; \
240                 fi ; \
241         fi ; \
242         if test -e ${DESTDIR}${bindir}/@MPIFORT_NAME@ ; then \
243                 if test "@MPIFORT_NAME@" != "@MPIF90_NAME@" ; then \
244                         cd ${DESTDIR}${bindir} && ln -f -s @MPIFORT_NAME@ @MPIF90_NAME@ ; \
245                 fi ; \
246         fi ; \
247         if test -e ${DESTDIR}${bindir}/@MPIFORT_NAME@ -a ! -e ${DESTDIR}${bindir}/@MPIF77_NAME@ ; then \
248                 if test "@MPIFORT_NAME@" != "@MPIF77_NAME@" ; then \
249                         cd ${DESTDIR}${bindir} && ln -f -s @MPIFORT_NAME@ @MPIF77_NAME@ ; \
250                 fi ; \
251         fi ; \
252         if test -e ${DESTDIR}${libdir}/lib@MPILIBNAME@@SHLIB_EXT@ ; then \
253                 if test "@MPILIBNAME@" != "mpl" ; then \
254                         cd ${DESTDIR}${libdir} && ln -f -s lib@MPILIBNAME@@SHLIB_EXT@ libmpl@SHLIB_EXT@ ; \
255                 fi ; \
256                 if test "@MPILIBNAME@" != "opa" ; then \
257                         cd ${DESTDIR}${libdir} && ln -f -s lib@MPILIBNAME@@SHLIB_EXT@ libopa@SHLIB_EXT@ ; \
258                 fi ; \
259                 if test "@MPILIBNAME@" != "mpich" ; then \
260                         cd ${DESTDIR}${libdir} && ln -f -s lib@MPILIBNAME@@SHLIB_EXT@ libmpich@SHLIB_EXT@ ; \
261                 fi ; \
262         fi ; \
263         if test -e ${DESTDIR}${libdir}/lib@MPIFCLIBNAME@@SHLIB_EXT@ ; then \
264                 if test "@MPIFCLIBNAME@" != "fmpich" ; then \
265                         cd ${DESTDIR}${libdir} && ln -f -s lib@MPIFCLIBNAME@@SHLIB_EXT@ libfmpich@SHLIB_EXT@ ; \
266                 fi ; \
267                 if test "@MPIFCLIBNAME@" != "mpichf90" ; then \
268                         cd ${DESTDIR}${libdir} && ln -f -s lib@MPIFCLIBNAME@@SHLIB_EXT@ libmpichf90@SHLIB_EXT@ ; \
269                 fi ; \
270         fi ; \
271         if test -e ${DESTDIR}${libdir}/lib@MPICXXLIBNAME@@SHLIB_EXT@ ; then \
272                 if test "@MPICXXLIBNAME@" != "mpichcxx" ; then \
273                         cd ${DESTDIR}${libdir} && ln -f -s lib@MPICXXLIBNAME@@SHLIB_EXT@ libmpichcxx@SHLIB_EXT@ ; \
274                 fi ; \
275         fi
276
277 # the configure step checks for the 'lib' dir to decide whether a source
278 # directory has been previously used for an in-path build before allowing a
279 # VPATH build to continue
280 distclean-local:
281         -rm -rf $(top_builddir)/lib
282         -rm -rf $(top_builddir)/bin
283         -rm -rf $(top_builddir)/include
284         -rm -rf $(top_builddir)/share
285
286 # created by confdb/aclocal_cache.m4
287 DISTCLEANFILES += config.system
288
289 # we can only have one clean-local, so we hook into it via conditionally
290 # defined variables in the dependencies section
291 clean-local: $(CLEAN_LOCAL_TARGETS)
292
293 uninstall-local:
294         for x in @MPICPP_NAME@ @MPIF90_NAME@ @MPIF77_NAME@ ; do \
295                 rm -f ${DESTDIR}${bindir}/$$x ; \
296         done ; \
297         for x in mpl opa mpich fmpich mpichf90 mpichcxx ; do \
298                 rm -f ${DESTDIR}${libdir}/lib$$x@SHLIB_EXT@ ; \
299         done
300
301 # --------------------------------------------------------------------------
302 #  coverage rules
303 # --------------------------------------------------------------------------
304
305 .PHONY: coverage
306
307 if BUILD_COVERAGE
308
309 # $(lib_lib@MPILIBNAME@_la_SOURCES) already contains $(mpi_sources)
310 # We don't include the $(lib_lib@PMPILIBNAME@_la_SOURCES) here because of gcov's
311 # inability to correctly handle multiple object files with the same source file.
312 gcov_sources = $(lib_lib@MPILIBNAME@_la_SOURCES)
313
314 # local var meaning (for profiling foo/bar/baz.c):
315 #   dir=foo/bar
316 #   bname=baz.c
317 #   aux=baz
318 #
319 # Note that we delete all extra ".gcov" files that were not the direct goal,
320 # even though they contain useful information.  A more robust solution is needed
321 # in the long run, probably one that uses "--long-file-names --preserve-paths"
322 # and some postprocessing in a perl script.
323 #
324 # Gcov has no good way to deal with source files that have been compiled twice
325 # into two different object files, such as
326 #   bcast.c --> {bcast.o,lib_libpmpi_la-bcast.o}
327 # It still generates a bcast.c.gcov output for each object file.  Long file
328 # names and preserved paths do not help with this problem.
329 # What we can do in this case is to move the second files to a separate
330 # directory, rename name, and run gcov on the new files.
331 # For the web-based coverage reports, the gcov output for the two files
332 # needs to be merged; see maint/gcovmerge .
333 # To make it easier to re-run the coverage generation, we copy, rather than
334 # move, when there are two object files for each source file.
335 # A change to the build procedure broke this target.  This is a partial though
336 # nearly complete fix to the broken build process.  The generated coverage
337 # files after the fix appear mostly correct, though there appear to also be
338 # errors in the gcov output itself (the format of this output changes
339 # frequently).  However, the coverage analysis is still valuable and has
340 # identified missing tests.
341 #
342 # The problem:
343 #   The source file is foo.c
344 #   gcov expects foo.o, foo.gcno, and foo.gcda files
345 #   The MPICH build process, unfortunately, does not produce a foo.o file;
346 #   instead, it produces a .libs/lib_lib@MPILIBNAME@_la-foo.o file (and
347 #   similarly .libs/lib_lib@MPILIBNAME@_la_foo.gcno etc.
348 #   This change broke this coverage target.  If further changes to the
349 #   naming conventions for object files are made, make sure that the
350 #   coverage target is also modified to correspond to those changes.
351 #
352 coverage:
353         @for file in $(gcov_sources) ; do \
354             dir=`dirname $$file` ; \
355             bname=`basename $$file` ; \
356             aux=`echo $$bname | sed -e 's,\.*$$,,'` ; \
357             sname=`echo $$bname | sed -e 's/\.[^\.]*$$//'` ;\
358             if [ -s "$$dir/$$sname.o" ] ; then \
359                 echo "( $(GCOV) -b -f -o $$file $$file && mv $$bname.gcov $$dir )" ; \
360                 ( $(GCOV) -b -f -o $$file $$file && mv $$bname.gcov $$dir ) ; \
361             elif [ -s "$$dir/lib_lib@MPILIBNAME@_la-$$sname.o" ] ; then \
362                 if [ ! -d $$dir-mpi ] ; then mkdir $$dir-mpi ; fi ; \
363                 echo "Copying name-mangled files to $$dir-mpi" ; \
364                 for pfile in $$dir/.libs/lib_lib@MPILIBNAME@_la-$$sname.* ; do \
365                      nfile=`echo $$pfile | sed -e 's/lib_lib@MPILIBNAME@_la-//'` ;\
366                      nfile=`basename $$nfile` ; \
367                      echo "cp -p $$pfile $$dir-mpi/$$nfile" ; \
368                      cp -p $$pfile $$dir-mpi/$$nfile ; \
369                 done ; \
370                 for pfile in $$dir/lib_lib@MPILIBNAME@_la-$$sname.o ; do \
371                      nfile=`echo $$pfile | sed -e 's/lib_lib@MPILIBNAME@_la-//'` ;\
372                      nfile=`basename $$nfile` ; \
373                      echo "( cd $$dir-mpi && $(GCOV) -b -f $$nfile )" ; \
374                      ( cd $$dir-mpi && $(GCOV) -b -f $$nfile ) ; \
375                      if [ ! -s $$dir-mpi/$$bname.gcov ] ; then \
376                         echo "No $$bname.gcov file created" ;\
377                      else \
378                         mv $$dir-mpi/$$bname.gcov $$dir ; \
379                      fi ; \
380                 done ; \
381             else \
382                 echo "Missing object file for source $$file" ; \
383             fi ; \
384             if [ -s "$$dir/lib_lib@PMPILIBNAME@_la-$$sname.o" ] ; then \
385                 if [ ! -d $$dir-pmpi ] ; then mkdir $$dir-pmpi ; fi ; \
386                 echo "Copying name-mangled files to $$dir-pmpi" ; \
387                 for pfile in $$dir/.libs/lib_lib@PMPILIBNAME@_la-$$sname.* ; do \
388                      nfile=`echo $$pfile | sed -e 's/lib_lib@PMPILIBNAME@_la-//'` ;\
389                      nfile=`basename $$nfile` ; \
390                      echo "cp -p $$pfile $$dir-pmpi/$$nfile" ; \
391                      cp -p $$pfile $$dir-pmpi/$$nfile ; \
392                 done ; \
393                 for pfile in $$dir/lib_lib@PMPILIBNAME@_la-$$sname.o ; do \
394                      nfile=`echo $$pfile | sed -e 's/lib_lib@PMPILIBNAME@_la-//'` ;\
395                      nfile=`basename $$nfile` ; \
396                      echo "( cd $$dir-pmpi && $(GCOV) -b -f $$nfile )" ; \
397                      ( cd $$dir-pmpi && $(GCOV) -b -f $$nfile ) ; \
398                      if [ -s $$dir/$$bname.gcov ] ; then \
399                          echo "gcovmerge $$dir-pmpi/$$bname.gcov $$dir/$$bname.gcov > $$dir/$$bname.gcov.merge" ; \
400                          $(srcdir)/maint/gcovmerge $$dir-pmpi/$$bname.gcov \
401                                 $$dir/$$bname.gcov > $$dir/$$bname.gcov.merge ;\
402                      else \
403                          echo "Did not find file $$dir/$$bname.gcov" ; \
404                          echo "mv $$dir-pmpi/$$bname.gcov $$dir/$$bname.gcov";\
405                          mv $$dir-pmpi/$$bname.gcov $$dir/$$bname.gcov ; \
406                      fi ;\
407                 done ; \
408             fi ; \
409             rm -f *.gcov ; \
410         done
411         for subdir in $(SUBDIRS) - ; do \
412             if test "x$$subdir" = "x-" ; then break ; fi ; \
413 ## SUBDIRS contains "."
414             if test "x$$subdir" = "x." ; then \
415                 : ; \
416             else \
417                 if grep coverage: $$subdir/Makefile >/dev/null 2>&1 ; then  \
418                    ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) coverage ) ; \
419                 fi \
420             fi \
421         done
422
423 CLEAN_LOCAL_TARGETS += coverage-clean
424 # heavy handed, but it gets the job done
425 coverage-clean:
426         -find $(top_builddir) -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" | \
427             xargs -n 10 rm -f
428
429 else !BUILD_COVERAGE
430 coverage:
431         @echo 'ERROR: MPICH was not configured with "--enable-coverage"'
432         exit 1
433 endif !BUILD_COVERAGE
434
435 # --------------------------------------------------------------------------
436 #  documentation rules
437 # --------------------------------------------------------------------------
438
439 # Tell make (via the automake SUFFIXES var) that our phony suffixes exist and
440 # should be considered when dissecting suffix-based implicit rules.  These phony
441 # suffix files should NOT be added to a .PHONY target, otherwise make will not
442 # use the implicit rules to attempt to build them.
443 SUFFIXES += .man-phony .html-phony .man1-phony .html1-phony .man3-phony .html3-phony .txt
444
445 # "make V=1" support for our documentation recipes
446 doctextman_verbose = $(doctextman_verbose_$(V))
447 doctextman_verbose_ = $(doctextman_verbose_$(AM_DEFAULT_VERBOSITY))
448 doctextman_verbose_0 = @echo "   DOCTEXTMAN  " $@;
449 doctexthtml_verbose = $(doctexthtml_verbose_$(V))
450 doctexthtml_verbose_ = $(doctexthtml_verbose_$(AM_DEFAULT_VERBOSITY))
451 doctexthtml_verbose_0 = @echo "   DOCTEXTHTML  " $@;
452
453 # build dir paths for doc generation, used to override subdir (esp. ROMIO) doc
454 # generation locations/options
455 mandoc_path1=$(abs_top_builddir)/man/man1
456 mandoc_path3=$(abs_top_builddir)/man/man3
457 htmldoc_path1=$(abs_top_builddir)/www/www1
458 htmldoc_path3=$(abs_top_builddir)/www/www3
459 doctext_docnotes=$(abs_top_srcdir)/maint/docnotes
460 # Provide an easily replaced url root for the generated index file.
461 # You can override this with URL desired in the index file generated by doctext.
462 # You can ignore this if you don't use mapnames or tohtml to add links
463 # to the MPI manual pages to documents.
464 htmldoc_root3="--your-url-here--"
465
466 # Implicit suffix rules to cause the docs to be built.  These are a bit of a
467 # hack, but using the implicit rules like this instead of a shell for loop
468 # permits make -jN to work.
469 .c.man-phony:
470         $(doctextman_verbose)$(DOCTEXT) -man -mpath $(mandoc_path3) -ext 3 \
471             -heading MPI -quotefmt -nolocation $(doctext_docnotes) $<
472 .c.html-phony:
473         $(doctexthtml_verbose)$(DOCTEXT) -html -mpath $(htmldoc_path3) \
474             -heading MPI -quotefmt -nolocation \
475             -index $(htmldoc_path3)/mpi.cit -indexdir $(htmldoc_root3) \
476                 $(doctext_docnotes) $<
477
478 .txt.man1-phony:
479         $(doctextman_verbose)$(DOCTEXT) -man -mpath $(mandoc_path1) -ext 1 \
480             -heading MPI -quotefmt -nolocation $(doctext_docnotes) $<
481 .txt.html1-phony:
482         $(doctexthtml_verbose)$(DOCTEXT) -html -mpath $(htmldoc_path1) \
483             -heading MPI -quotefmt -nolocation $(doctext_docnotes) $<
484 .txt.man3-phony:
485         $(doctextman_verbose)$(DOCTEXT) -man -mpath $(mandoc_path3) -ext 3 \
486             -heading MPI -quotefmt -nolocation $(doctext_docnotes) $<
487 .txt.html3-phony:
488         $(doctexthtml_verbose)$(DOCTEXT) -html -mpath $(htmldoc_path3) \
489             -heading MPI -quotefmt -nolocation \
490             -index $(htmldoc_path3)/mpi.cit -indexdir $(htmldoc_root3) \
491                 $(doctext_docnotes) $<
492
493 # use mandoc-local target to force directory creation before running DOCTEXT
494 mandoc:
495         test -d $(mandoc_path1) || $(MKDIR_P) $(mandoc_path1)
496         test -d $(mandoc_path3) || $(MKDIR_P) $(mandoc_path3)
497         $(MAKE) $(AM_MAKEFLAGS) mandoc-local
498 mandoc-local: $(mpi_sources:.c=.man-phony) $(doc1_src_txt:.txt=.man1-phony) \
499         $(doc3_src_txt:.txt=.man3-phony)
500         for subdir in $(MANDOC_SUBDIRS) - ; do \
501             if test "x$$subdir" = "x-" ; then break ; fi ; \
502 ## MANDOC_SUBDIRS might accidentally contain "."
503             if test "x$$subdir" = "x." ; then \
504                 : ; \
505             else \
506                 if grep 'mandoc:' $$subdir/Makefile >/dev/null 2>&1 ; then  \
507 ## make 'mandoc' in subdirectory but tell sub-make to output to the top-level
508                    ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) \
509                         mandoc_path1=$(mandoc_path1) \
510                         mandoc_path3=$(mandoc_path3) \
511                         doctext_docnotes=$(doctext_docnotes) \
512                         mandoc ) ; \
513                 fi \
514             fi \
515         done
516 #      FIXME: the 'mancnst' script need to be committed for this to work
517 #      (cd $(abs_top_builddir) && $(abs_top_srcdir)/doc/mansrc/mancnst)
518
519 # use htmldoc-local target to force directory creation before running DOCTEXT
520 # Note that the mpi.cit is appended to by each update, so it must be removed
521 # and recreated when the documentation files are updated
522 htmldoc:
523         test -d $(top_builddir)/www/www1 || $(MKDIR_P) $(top_builddir)/www/www1
524         test -d $(top_builddir)/www/www3 || $(MKDIR_P) $(top_builddir)/www/www3
525         rm -f $(htmldoc_path3)/mpi.cit
526         $(MAKE) $(AM_MAKEFLAGS) htmldoc-local
527
528 htmldoc-local: $(mpi_sources:.c=.html-phony) $(doc1_src_txt:.txt=.html1-phony) \
529         $(doc3_src_txt:.txt=.html3-phony)
530         for subdir in $(HTMLDOC_SUBDIRS) - ; do \
531             if test "x$$subdir" = "x-" ; then break ; fi ; \
532 ## HTMLDOC_SUBDIRS might accidentally contain "."
533             if test "x$$subdir" = "x." ; then \
534                 : ; \
535             else \
536                 if grep 'htmldoc:' $$subdir/Makefile >/dev/null 2>&1 ; then  \
537 ## make 'htmldoc' in subdirectory but tell sub-make to output to the top-level
538                    ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) \
539                         htmldoc_path1=$(htmldoc_path1) \
540                         htmldoc_path3=$(htmldoc_path3) \
541                         doctext_docnotes=$(doctext_docnotes) \
542                         htmldoc ) ; \
543                 fi \
544             fi \
545         done
546         $(srcdir)/maint/createhtmlindex -wwwroot=$(top_builddir)
547
548 # install-man does not have a special "-local" target for some reason
549 INSTALL_DATA_LOCAL_TARGETS += install-man-local
550 # this is a variation on the recipe that was previously generated by simplemake
551 install-man-local:
552         @dir= ; \
553         if test -d $(builddir)/man ; then \
554          dir=$(builddir)/man ; \
555         elif test -d $(srcdir)/man ; then \
556          dir=$(srcdir)/man ; \
557         fi ; \
558         export dir ; \
559         if test ! -z $$dir && test -d $$dir && cd $$dir ; then \
560          for name in * ; do \
561           if [ "$$name" = "*" ] ; then continue ; fi ; \
562           if [ -f $$name ] ; then \
563             echo "$(INSTALL_DATA) $$name ${DESTDIR}${mandir}/$$name" ; \
564             $(INSTALL_DATA) $$name ${DESTDIR}${mandir}/$$name ; \
565           elif [ -d $$name ] ; then \
566             if [ ! -d ${DESTDIR}${mandir}/$$name ] ; then $(MKDIR_P) ${DESTDIR}${mandir}/$$name ; fi ;\
567             ( cd $$name && for name2 in * ; do \
568                 if [ "$$name2" = "*" ] ; then continue ; fi ; \
569                 if [ -f $$name2 ] ; then \
570                     echo "$(INSTALL_DATA) $$name2 ${DESTDIR}${mandir}/$$name/$$name2" ; \
571                     $(INSTALL_DATA) $$name2 ${DESTDIR}${mandir}/$$name/$$name2 ; \
572                 elif [ -d $$name2 ] ; then  \
573                     echo "cp -rp $$name2 ${DESTDIR}${mandir}/$$name" ; \
574                     cp -rp $$name2 ${DESTDIR}${mandir}/$$name ; \
575                 fi \
576             done ) ; \
577           else \
578             echo "Unknown file type for $$name" ; \
579           fi ; \
580          done ; \
581         fi
582
583 INSTALL_DATA_LOCAL_TARGETS += install-html-local
584 install-html-local:
585         @dir= ; \
586         if test -d $(builddir)/www ; then \
587          dir=$(builddir)/www ; \
588         elif test -d $(srcdir)/www ; then \
589          dir=$(srcdir)/www ; \
590         fi ; \
591         export dir ; \
592         if test ! -z $$dir && test -d $$dir && cd $$dir ; then \
593          if [ ! -e ${DESTDIR}${htmldir} ] ; then $(MKDIR_P) ${DESTDIR}${htmldir} ; fi ; \
594          for name in * ; do \
595           if [ "$$name" = "*" ] ; then continue ; fi ; \
596           if [ -f $$name ] ; then \
597             echo "$(INSTALL_DATA) $$name ${DESTDIR}${htmldir}/$$name" ; \
598             $(INSTALL_DATA) $$name ${DESTDIR}${htmldir}/$$name ; \
599           elif [ -d $$name ] ; then \
600             if [ ! -d ${DESTDIR}${htmldir}/$$name ] ; then $(MKDIR_P) ${DESTDIR}${htmldir}/$$name ; fi ;\
601             ( cd $$name && for name2 in * ; do \
602                 if [ "$$name2" = "*" ] ; then continue ; fi ; \
603                 if [ -f $$name2 ] ; then \
604                     echo "$(INSTALL_DATA) $$name2 ${DESTDIR}${htmldir}/$$name/$$name2" ; \
605                     $(INSTALL_DATA) $$name2 ${DESTDIR}${htmldir}/$$name/$$name2 ; \
606                 elif [ -d $$name2 ] ; then  \
607                     echo "cp -rp $$name2 ${DESTDIR}${htmldir}/$$name" ; \
608                     cp -rp $$name2 ${DESTDIR}${htmldir}/$$name ; \
609                 fi \
610             done ) ; \
611           else \
612             echo "Unknown file type for $$name" ; \
613           fi ; \
614          done ; \
615         fi
616
617 .PHONY: mandoc mandoc-local htmldoc htmldoc-local install-html-local install-man-local
618
619 # build the latex docs in the old style
620 latexdoc:
621         for dir in $(DOC_SUBDIRS) ; do \
622                 (cd $$dir && ${MAKE} latexdoc ) ; done
623
624 # install-pdf will not be run by default in a "make install" unless we do this
625 INSTALL_DATA_LOCAL_TARGETS += install-pdf-local
626 # note that these PDFs are currently built in the srcdir, even in a VPATH
627 # build...
628 install-pdf-local:
629         if [ ! -e ${DESTDIR}${docdir} ] ; then $(MKDIR_P) ${DESTDIR}${docdir} ; fi
630         if [ -s $(srcdir)/doc/userguide/user.pdf ] ; then $(INSTALL_DATA) $(srcdir)/doc/userguide/user.pdf ${DESTDIR}${docdir}/user.pdf ; fi
631         if [ -s $(srcdir)/doc/installguide/install.pdf ] ; then $(INSTALL_DATA) $(srcdir)/doc/installguide/install.pdf ${DESTDIR}${docdir}/install.pdf ; fi
632         if [ -s $(srcdir)/doc/logging/logging.pdf ] ; then $(INSTALL_DATA) $(srcdir)/doc/logging/logging.pdf ${DESTDIR}${docdir}/logging.pdf ; fi
633
634 include $(top_srcdir)/doc/Makefile.mk
635
636 # use the _TARGETS var as a workaround for being unable to define multiple
637 # -local targets
638 install-data-local: $(INSTALL_DATA_LOCAL_TARGETS)
639