Makefile.buildingblocks 8.25 KB
Newer Older
thomas.forbriger's avatar
thomas.forbriger committed
1
2
# this is <Makefile.buildingblocks>
# ----------------------------------------------------------------------------
3
# $Id$
thomas.forbriger's avatar
thomas.forbriger committed
4
5
6
7
8
9
10
11
12
13
14
# 
# Copyright (c) 2010 by Thomas Forbriger (BFO Schiltach) 
# 
# some building blocks for Makefiles
#
# The code in this file should be used by copy and paste operations to be
# added to individual Makefiles. Include operations are not appropriate, since
# this complicates reading dependencies across directories.
# 
# REVISIONS and CHANGES 
#    16/08/2010   V1.0   Thomas Forbriger
15
16
#    27/07/2011   V1.1   give precedence to $LOCINCLUDEDIR over 
#                        $SERVERINCLUDEDIR 
thomas.forbriger's avatar
thomas.forbriger committed
17
18
# 
# ============================================================================
19
20
21
22
23
24
25
 
PROGRAMS=fidase fidasex

.PHONY: all
all: install

.PHONY: install
26
27
install: $(addprefix $(LOCBINDIR)/,$(PROGRAMS))
$(LOCBINDIR)/%: %
28
29
	mkdir -pv $(dir $@)
	/bin/mv -fv $< $@
30

thomas.forbriger's avatar
thomas.forbriger committed
31
#
32
33
34
# This is the sequence of standard targets
# ----------------------------------------
# created by the template generator "new"
thomas.forbriger's avatar
thomas.forbriger committed
35
36
37
38
39
40
41
42
43
44
45
46

all:

flist: Makefile
	echo $^ | tr ' ' '\n' | sort > $@

.PHONY: edit
edit: flist; vim $<

.PHONY: clean
clean: ; 
	-find . -name \*.bak | xargs --no-run-if-empty /bin/rm -v
47
	-/bin/rm -vf flist *.o *.d *.a $(PROGRAMS) *.xxx
thomas.forbriger's avatar
thomas.forbriger committed
48
49

# ============================================================================
50
51
# a variable definition to check variable settings
# ------------------------------------------------
thomas.forbriger's avatar
thomas.forbriger committed
52

53
54
55
56
57
58
59
60
61
62
63
64
65
# if you want to check whether variable TF_PUBLICATIONPATH is non-empty,
# insert line
#
## $(call CHECKVAR,TF_PUBLICATIONPATH)
#
# in your Makefile
#
# if you want to check whether variable AVAR, BVAR, and CVAR are non-empty,
# insert line
#
## $(call CHECKVARS,AVAR BVAR CVAR)
#
# in your Makefile
66
67
68
#
# check mandatory environment variable settings
# ---------------------------------------------
69
70
71

CHECKVAR=$(if $($(1)),,$(error ERROR: missing variable $(1)))
CHECKVARS=$(foreach var,$(1),$(call CHECKVAR,$(var)))
thomas.forbriger's avatar
thomas.forbriger committed
72

73
74
75
$(call CHECKVARS,LOCINCLUDEDIR LOCLIBDIR LOCBINDIR)
$(call CHECKVARS,TF_BROWSER TF_WWWBASEDIR)

76
77
78
79
80
81
#----------------------------------------------------------------------

FLAGS += $(MYFLAGS) -fPIC
FFLAGS += -ff2c -Wall -ffixed-line-length-0 -fno-backslash $(FLAGS)
CFLAGS += $(FLAGS)
CXXFLAGS+=-Wall $(FLAGS)
82
83
LDFLAGS=$(addprefix -L,$(LOCLIBDIR) $(subst :, ,$(SERVERLIBDIR)))
CPPFLAGS=$(addprefix -I,$(LOCINCLUDEDIR) $(subst :, ,$(SERVERINCLUDEDIR))) \
84
85
  $(FLAGS)

86
87
88
89
90
#======================================================================
# Fortran dependencies
# --------------------
%.d: %.f
	echo $<: $(shell cat $< | egrep '^ +include' | cut -f 2 -d \' | sort | uniq) > $@
91
include $(patsubst %.f,%.d,$(wildcard *.f))
92

93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#======================================================================
# dependencies
# ------------
#
# The compiler is used to create dependency files, which are included below.

%.d: %.cc
	$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $< \
      | sed '\''s,\($(notdir $*)\)\.o[ :]*,$(dir $@)\1.o $@ : ,g'\'' \
        > $@; \
      [ -s $@ ] || rm -f $@'

%.d: %.c
	$(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \
      | sed '\''s,\($(notdir $*)\)\.o[ :]*,$(dir $@)\1.o $@ : ,g'\'' \
        > $@; \
      [ -s $@ ] || rm -f $@'

111
include $(patsubst %.cc,%.d,$(SRCFILES)) 
112
113
114
115
116
117
118
119
120
121
122
123
124

#======================================================================
# header files
# ------------
#
# Since we extensively document the class structures within the header files,
# these should be stripped for the production version (otherwise the compiler
# has to scan all comments on each compile). Stripping is done by the rule
# below and is controlled by the variables REMCMMNT and EMPTYPRINT (see
# above).

# comment stripping
# -----------------
125
126
EMPTYPRINT=0
$(call CHECKVARS,TF_REMCMMNT EMPTYPRINT)
127
128
129
130
131
132
133

# awk rule assumes that the first non-comment line starts with '#'
# and that the first (copyright) comment end with pattern "^ */"
%.h.strip: %.h
	awk 'BEGIN {hot=1;} /^ \*\// { if (hot) { hot=2; print; next;} }\
        /^#/ { hot=0; } \
        { if (hot==2) { print ""; } else if (hot) { print; } }' $< > $@
134
	$(TF_REMCMMNT) $< | awk 'BEGIN {hot=0;} \
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
        /^ *$$/ { if ((hot) && ($(EMPTYPRINT))) { print ""; } next; } \
        /^#/ { hot=1; } { if (hot) print; }' >> $@

#----------------------------------------------------------------------
.PRECIOUS: %.h.strip
      
$(call CHECKVAR,INCINSTALLPATH)
$(INCINSTALLPATH)/%.h: %.h.strip
	mkdir -vp $(dir $@)
	-rm -fv $@
	/bin/cp -vpd $< $@

# install header files
# INSTHEADER contains full qualified paths to library header files
# like /home/thof/include/aff/series.h
# usually then INCINSTALLPATH=/home/thof/include/aff
thomas.forbriger's avatar
thomas.forbriger committed
151
.PHONY: install-include
152
153
154
155
156
157
158
159
160
161
162
163
164
165
install-include: $(INSTHEADER)

#======================================================================
# create the binary library
# -------------------------
LIBOBS=$(ALLOBS) $(patsubst %.cc,%.o,$(SRC))
LIBOBS=$(patsubst %.cc,%.o,$(SRC))

# INSTHEADER contains full qualified paths to library header files
# like /home/thof/include/aff/series.h
libaff.a: $(INSTHEADER) $(LIBOBS)
	ar rcv $@ $(LIBOBS)
	ranlib $@

166
167
libdatrwxx.so: $(patsubst %.cc,%.o,$(LIBSRC))
	$(CXX) $(CXXFLAGS) -shared -o $@ $^
168
169

LIBRARIES=libaff.a libdatrwxx.so
170

171
.PHONY: install
172
173
install: $(addprefix $(LOCLIBDIR)/,$(LIBRARIES))
$(LOCLIBDIR)/%: install-include %
174
175
	mkdir -pv $(dir $@)
	/bin/mv -fv $(word 2,$^) $@
176
177
178
179

# install-include where no header files are to be installed
.PHONY: install-include
install-include:
180

181
182
183
184
185
186
187
188
189
190
191
192
193
#======================================================================
# reinstall target
# is necessary in case of header file problems (e.g. remcmmnt not installed)
.PHONY: clean-include
clean-include: 
	/bin/rm -fv $(INSTHEADER)

.PHONY: reinstall
reinstall:
	$(MAKE) clean
	$(MAKE) clean-include
	$(MAKE) install

194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#======================================================================
# documentation part
# ------------------
#
# targets commonly used:
# ----------------------
#
# make doxyclean        removes all documentation
# make doxydoc          creates doxygen documentation in the DOXYWWWPATH
# make doxyview         creates doxygen documentation and launches netscape to
#                       browse in the documentation
# make doxyconf         edit the doxygen configuration file
#
# If you launch "make doxydoc" the documentation will be written to
# DOXYWWWPATH (see below). This is meant to export the documentation through
# your homepage. The doxyfull directory is just a symbolic link to this
# directory.
#

thomas.forbriger's avatar
thomas.forbriger committed
213
$(call CHECKVARS,TF_WWWBASEDIR TF_BROWSER)
214

thomas.forbriger's avatar
thomas.forbriger committed
215
DOXYWWWPATH=$(TF_WWWBASEDIR)/libaff
216
217
218

.PHONY: doxyclean doxyview doxydoc doxyconf

219
doxyclean: ;/bin/rm -rfv $(DOXYWWWPATH) doxydoc.xxx
220
221
222
223
224
225

DOXYSRC=$(README) $(HEADERS) $(SRC) \
  tests/f77procs.P tests/f77procs.f \
  tests/f77common.inc tests/f77common_com.P

# create doxygen intermediate configuration
226
PWD=$(shell env pwd)
227
228
229
doxydoc.xxx: doxydoc.cfg
	sed 's,<OUTPUTDIRECTORY>,$(DOXYWWWPATH),g;s,<STRIPFROMPATH>,$(PWD),g' \
	  $< > $@
230
231
232
# create commented version of doxygen configuration
doxycomm.xxx: doxydoc.cfg
	/bin/cp -vf $< $@; doxygen -u $@
233
234
235
236
237
238
239
240
241
242

$(DOXYWWWPATH)/html/index.html: doxydoc.xxx $(DOXYSRC)
	mkdir -vp $(DOXYWWWPATH)
	doxygen $<

doxydoc: $(DOXYWWWPATH)/html/index.html

doxyview: $(DOXYWWWPATH)/html/index.html
	$(TF_BROWSER) file:$< &

thomas.forbriger's avatar
thomas.forbriger committed
243
244
245
246
247
248
#======================================================================
# ASCII documentation (Fortran and C code)
# ----------------------------------------
%.doc:
	/usr/bin/awk 'BEGIN{ hot=0; } \
        /^cS/ { hot=1; \
249
          print "  c"; \
250
	    print FILENAME; \
251
          print "  c"; \
thomas.forbriger's avatar
thomas.forbriger committed
252
253
254
255
256
257
258
259
260
261
          next; } \
        /^cE/ { hot=0; } \
        { if (hot==1) { print "  " $$0; } }' $^ > $@

%.doc: 
	/usr/bin/awk 'BEGIN{ hot=0; } \
        /^\/\*S\*\// { hot=1; next; } \
        /^\/\*E\*\// { hot=0; } \
        { if (hot==1) { print "  " $$0; } }' $^ > $@

thomas.forbriger's avatar
thomas.forbriger committed
262
263
264
265
266
#======================================================================
# create package
# --------------
# is delegated to Makefile.packages
ifdef TF_MAKEPKG
thomas.forbriger's avatar
thomas.forbriger committed
267
268
269
270
271
272
273
274
275
276
277
278
279
280
.PHONY: package
package: $(TF_MAKEPKG)
	$(MAKE) -f $< \
	  PACKAGE=convsff \
	  PACKAGEEXPORT="trunk/src/conv/sff:src" \
	  PACKAGETARGETS="src:all" \
	  PACKAGELIBS="-"
.PHONY: fullpackage
fullpackage: $(TF_MAKEPKG)
	$(MAKE) -f $< \
	  PACKAGE=convsffwithlibs \
	  PACKAGEEXPORT="trunk/src/conv/sff:src" \
	  PACKAGETARGETS="src:all" \
	  PACKAGELIBS="libsff libtf libsffu libts libaff libtime libgsexx libsffxx libdatrwxx libtfxx libtsxx"
thomas.forbriger's avatar
thomas.forbriger committed
281
282
endif

thomas.forbriger's avatar
thomas.forbriger committed
283
# ----- END OF Makefile.buildingblocks -----