summaryrefslogtreecommitdiffstats
path: root/fortran/src/Makefile.am
blob: 12c38e2789c631554b705b86dadc3dd6c23a67ef (plain)
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5.  The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the files COPYING and Copyright.html.  COPYING can be found at the root
# of the source code distribution tree; Copyright.html can be found at the
# root level of an installed copy of the electronic HDF5 document set and
# is linked from the top-level documents page.  It can also be found at
# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
# access to either file, you may request a copy from help@hdfgroup.org.
##
## Makefile.am
## Run automake to generate a Makefile.in from this file.
#
# HDF5 Fortran Library Makefile(.in)
#

include $(top_srcdir)/config/commence.am
include $(top_srcdir)/config/lt_vers.am

# Include src directory in both Fortran and C flags (C compiler is used
# for linking).
INCLUDES=-I$(top_srcdir)/src
AM_FCFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/fortran/src

AM_FCLIBS=$(LIBHDF5)

# This is our main target, the fortran library
lib_LTLIBRARIES=libhdf5_fortran.la

# Add libtool numbers to the HDF5 Fortran library (from config/lt_vers.am)
libhdf5_fortran_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)

# Some Fortran compilers can't build shared libraries, so sometimes we
# want to build a shared C library and a static Fortran library.  If so,
# pass the -static flag to the library linker.
if FORTRAN_SHARED_CONDITIONAL
else
   AM_LDFLAGS+=-static
endif

# Include HDF5.f90 if parallel is disabled, HDF5mpiof*  if parallel is enabled
if BUILD_PARALLEL_CONDITIONAL
   PARALLEL_COND_SRC = H5FDmpiof.c HDF5mpio.f90 H5FDmpioff.f90
else
   PARALLEL_COND_SRC = HDF5.f90
endif

# Check if the compiler supports the Fortran 2003 standard
# which should include the intrinsic module iso_c_binding
if FORTRAN_2003_CONDITIONAL_F
   F_STATUS = _F03
else
   F_STATUS = _F90
endif

#   Condition for including/excluding the DBLE interfaces for when the 
#   default REAL is of type DOUBLE PRECISION.
#   We do not include the double precision interfaces if the defaut REAL is
#   DOUBLE PRECISION since this would lead to a non-unique conflict with the
#   generic interfaces declared as REAL.
if FORTRAN_DEFAULT_REALisDBLE_F
   F_DBLE = Exclude
else
   F_DBLE = Include
endif

# Source files for the library.
libhdf5_fortran_la_SOURCES=H5f90global.f90 \
          H5fortran_types.f90 H5_ff$(F_STATUS).f90 H5_ff.f90 H5Aff.f90 H5Dff.f90 H5Eff.f90    \
          H5Fff.f90 H5Gff.f90 H5Iff.f90 H5Lff.f90 H5Off.f90 H5Pff.f90 H5Rff.f90 H5Sff.f90    \
          H5Tff.f90 H5Zff.f90                                            \
	  H5_DBLE_Interface$(F_DBLE).f90 \
          H5f90kit.c H5_f.c H5Af.c H5Df.c H5Ef.c H5Ff.c H5Gf.c           \
          H5If.c H5Lf.c H5Of.c H5Pf.c H5Rf.c H5Sf.c H5Tf.c H5Zf.c        \
	  H5Aff$(F_STATUS).f90 H5Dff$(F_STATUS).f90 H5Eff$(F_STATUS).f90 H5Fff$(F_STATUS).f90 H5Lff$(F_STATUS).f90 \
	  H5Off$(F_STATUS).f90 H5Pff$(F_STATUS).f90 H5Rff$(F_STATUS).f90 H5Tff$(F_STATUS).f90 $(PARALLEL_COND_SRC)

# HDF5 Fortran library depends on HDF5 Library.
libhdf5_fortran_la_LIBADD=$(LIBHDF5)

# h5fc is generated during configure.
# Remove it only when distclean.
DISTCLEANFILES=h5fc

# H5fortran_types.f90 and H5f90i.h are automatically generaed by
# H5match_types, and must be cleaned explicitly.  H5fort_type_defines.h
# is generated by H5fortran_detect
MOSTLYCLEANFILES=H5fortran_types.f90 H5f90i_gen.h H5fort_type_defines.h \
         H5fortran_detect.f90

# Fortran module files can have different extensions and different names
# (e.g., different capitalizations) on different platforms.  Write rules
# for them explicitly rather than trying to teach automake about them.
# They should be installed as headers and removed during clean.
maintainer-clean-local: clean-local
distclean-local: clean-local
clean-local:
	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
	  $(RM) *.$(F9XMODEXT);                                         \
	fi

install-data-local:
	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
	  $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(DESTDIR)$(includedir)/. ; \
	fi
	$(CP) $(top_builddir)/$(subdir)/H5f90i_gen.h $(DESTDIR)$(includedir)/.
	$(CP) $(top_srcdir)/fortran/src/H5f90i.h $(DESTDIR)$(includedir)/.

uninstall-local:
	@if test -n "$(F9XMODEXT)" -a "X$(F9XMODEXT)" != "Xo"; then      \
	  if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(includedir)/HDF5.$(F9XMODEXT)"; then \
	    set -x; $(RM) $(DESTDIR)$(includedir)/*.$(F9XMODEXT);                 \
	  fi;                                                           \
	fi;								\
	$(RM) $(DESTDIR)$(bindir)/$(H5FC_NAME)
	$(RM) $(DESTDIR)$(includedir)/H5f90i*.h

# Also install and uninstall (uninstall-local above) h5fc script
install-exec-local:
	@$(INSTALL) h5fc $(DESTDIR)$(bindir)/$(H5FC_NAME)

# Custom rule for installing h5fc, since it will be named h5pfc if hdf5
# is configured for parallel mode
if BUILD_PARALLEL_CONDITIONAL
  H5FC_NAME = h5pfc
else
  H5FC_NAME = h5fc
endif

# Rules for automatically detecting which fortran types are present
# and matching them to C types.  This is accomplished using helper
# programs.
# It's a bit tricky to make sure that Automake builds things in the right
# order (especially when using 'gmake -j ...')
# H5test_kind is compiled and run to produce H5fortran_detect.f90.
# H5fortran_detect is compiled and run to produce H5fort_type_defines.h.
# H5match_types.c then includes this file and can be compiled into
# H5match_types.  When H5match_types is run, it creates H5f90i_gen.h
# and H5fortran_types.f90, which are included in the Fortran library.

# These are the helper programs we need to build.
noinst_PROGRAMS = H5match_types H5fortran_detect H5test_kind

# Tell Automake to create H5f90i_gen.h before it builds the library
# sources.  When it creates H5f90i_gen.h, it will create
# H5fortran_types.f90 as a side effect.
BUILT_SOURCES = H5f90i_gen.h

#Specify what Automake needs to create: first the H5fort_type_defines.h
# header, then H5match_types which includes that header, then
# it needs to run H5match_types.
H5fortran_types.f90 H5f90i_gen.h: H5match_types$(EXEEXT)
	$(RUNSERIAL) ./H5match_types$(EXEEXT)

# H5fort_type_defines.h is created by running H5fortran_detect.
# Obviously, H5fortran_detect needs to be built first.
H5fort_type_defines.h: H5fortran_detect$(EXEEXT)
	$(RUNSERIAL) ./H5fortran_detect$(EXEEXT) > H5fort_type_defines.h

H5match_types.$(OBJEXT): H5fort_type_defines.h

# Automake knows how to build fortran programs if we tell it the source
# files.
H5fortran_detect_SOURCES = H5fortran_detect.f90

# H5test_kind.f90 generates H5Fortran_detect.f90 depending on if 
# intrinsic function SIZEOF is available.

H5fortran_detect.f90: H5test_kind$(EXEEXT)
	$(RUNSERIAL) ./H5test_kind$(EXEEXT) > H5fortran_detect.f90

# H5test_kind.f90 is included in the distribution, and Automake knows
# how to compile a fortran program given its sources.

if FORTRAN_HAVE_SIZEOF
  H5test_kind_SOURCES = $(srcdir)/H5test_kind_SIZEOF.f90
else
  H5test_kind_SOURCES = $(srcdir)/H5test_kind.f90
endif

# Mark this directory as part of the Fortran API
FORTRAN_API=yes

# Hardcode the dependencies of these files. There isn't a known way of
# determining this automagically (like we do with the C files). So, when
# doing a parallel make, some modules could be made way before the
# modules they depend upon are actually made. *sigh*
H5f90global.lo:      $(srcdir)/H5f90global.f90 H5fortran_types.lo
H5fortran_types.lo:  H5fortran_types.f90
H5fortran_detect.lo: H5fortran_detect.f90
H5test_kind.lo:      $(srcdir)/H5test_kind.f90
H5test_kind_SIZEOF.lo: $(srcdir)/H5test_kind_SIZEOF.f90
H5_ff$(F_STATUS).lo: $(srcdir)/H5_ff$(F_STATUS).f90 H5f90global.lo
H5_ff.lo:            $(srcdir)/H5_ff.f90 H5f90global.lo H5_ff$(F_STATUS).lo
H5Aff.lo:            $(srcdir)/H5Aff.f90 H5f90global.lo
H5Dff.lo:            $(srcdir)/H5Dff.f90 H5f90global.lo
H5Aff$(F_STATUS).lo:  $(srcdir)/H5Aff$(F_STATUS).f90 H5f90global.lo
H5Dff$(F_STATUS).lo:  $(srcdir)/H5Dff$(F_STATUS).f90 H5f90global.lo
H5Eff$(F_STATUS).lo:  $(srcdir)/H5Eff$(F_STATUS).f90 H5f90global.lo
H5Fff$(F_STATUS).lo:  $(srcdir)/H5Fff$(F_STATUS).f90 H5f90global.lo
H5Lff$(F_STATUS).lo:  $(srcdir)/H5Lff$(F_STATUS).f90 H5f90global.lo
H5Off$(F_STATUS).lo:  $(srcdir)/H5Off$(F_STATUS).f90 H5f90global.lo
H5Pff$(F_STATUS).lo:  $(srcdir)/H5Pff$(F_STATUS).f90 H5f90global.lo
H5Rff$(F_STATUS).lo:  $(srcdir)/H5Rff$(F_STATUS).f90 H5f90global.lo
H5Tff$(F_STATUS).lo:  $(srcdir)/H5Tff$(F_STATUS).f90 H5f90global.lo
H5Eff.lo:            $(srcdir)/H5Eff.f90 H5f90global.lo
H5Fff.lo:            $(srcdir)/H5Fff.f90 H5f90global.lo
H5Gff.lo:            $(srcdir)/H5Gff.f90 H5f90global.lo
H5Iff.lo:            $(srcdir)/H5Iff.f90 H5f90global.lo
H5Lff.lo:            $(srcdir)/H5Lff.f90 H5f90global.lo
H5Off.lo:            $(srcdir)/H5Off.f90 H5f90global.lo
H5Pff.lo:            $(srcdir)/H5Pff.f90 H5f90global.lo
H5Rff.lo:            $(srcdir)/H5Rff.f90 H5f90global.lo
H5Sff.lo:            $(srcdir)/H5Sff.f90 H5f90global.lo
H5Tff.lo:            $(srcdir)/H5Tff.f90 H5f90global.lo
H5Zff.lo:            $(srcdir)/H5Zff.f90 H5f90global.lo
H5_DBLE_Interface$(F_DBLE).lo:  $(srcdir)/H5_DBLE_Interface$(F_DBLE).f90 H5Aff$(F_STATUS).lo H5Dff$(F_STATUS).lo H5Fff$(F_STATUS).lo H5Eff$(F_STATUS).lo H5Pff$(F_STATUS).lo
HDF5.lo:             $(srcdir)/HDF5.f90 H5f90global.lo H5_ff$(F_STATUS).lo H5_ff.lo H5Aff.lo H5Aff$(F_STATUS).lo \
                     H5Dff.lo H5Dff$(F_STATUS).lo  \
                     H5Eff.lo H5Eff$(F_STATUS).lo \
		     H5Fff.lo H5Fff$(F_STATUS).lo H5Gff.lo H5Iff.lo H5Lff.lo H5Lff$(F_STATUS).lo \
	             H5Off.lo H5Off$(F_STATUS).lo H5Pff.lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo H5Rff.lo \
                     H5Sff.lo H5Tff.lo H5Tff$(F_STATUS).lo H5Zff.lo \
                     H5_DBLE_Interface$(F_DBLE).lo 
H5FDmpioff.lo:       $(srcdir)/H5FDmpioff.f90 H5f90global.lo
HDF5mpio.lo:         $(srcdir)/H5FDmpioff.f90 H5f90global.lo H5_ff$(F_STATUS).lo H5_ff.lo \
		     H5Aff.lo H5Aff$(F_STATUS).lo \
                     H5Dff.lo H5Dff$(F_STATUS).lo \
		     H5Eff.lo H5Eff$(F_STATUS).lo \
                     H5Fff.lo H5Fff$(F_STATUS).lo H5Gff.lo H5Iff.lo H5Lff.lo H5Lff$(F_STATUS).lo \
		     H5Off.lo H5Off$(F_STATUS).lo H5Pff.lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo H5Rff.lo \
                     H5Sff.lo H5Tff.lo H5Tff$(F_STATUS).lo H5Zff.lo \
	             H5_DBLE_Interface$(F_DBLE).lo H5FDmpioff.lo

include $(top_srcdir)/config/conclude.am