target.mk 36.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#################################################################################
#
#			target.mk
#
#		Standard targets for fptools
#
#################################################################################

#
# This file contain three groups of target rules:
#
# 1.  FPtools targets
#	depend*
#	runtests*
#
# 2.  GNU standard targets
#	all*
#	install* uninstall installcheck installdirs
rrt's avatar
rrt committed
19
#       install-docs*
20
21
#	clean* distclean* mostlyclean* maintainer-clean*
#	tags*
rrt's avatar
rrt committed
22
#	dvi ps (no info) FPTOOLS adds: pdf rtf html
23
24
25
26
27
28
29
30
31
32
33
34
35
#	check
#
# 3. Some of the above targets have a version that
#    recursively invokes that target in sub-directories.
#    This relies on the importing Makefile setting SUBDIRS
#
#    The recursive targets are marked with a * above
#

# 
# 
#

36
37
38
39
40
41
##################################################################
# Pre-compute the list of sources so we don't have to do this 
# multiple times.  See paths.mk.

PRE_SRCS := $(ALL_SRCS)

42
43
44
45
46
##################################################################
# Include package building machinery

include $(TOP)/mk/package.mk

47
48
49
50
51
###################################################################
# Suffix rules for Haskell, C and literate 

include $(TOP)/mk/suffix.mk

52
53
54
55
56
##################################################################
# 		FPtools standard targets
#
# depend:
#
57
#  The depend target has to cope with a set of files that may have
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#  different ways of computing their dependencies, i.e., a Haskell
#  module's dependencies are computed differently from C files.
#
# Note that we don't compute dependencies automatically, i.e., have the
# .depend file be a target that is dependent on the Haskell+C sources,
# and then have the `depend' target depend on `.depend'. The reason for
# this is that when GNU make is processing the `include .depend' statement
# it records .depend as being a Makefile. Before doing any other processing,
# `make' will try to check to see if the Makefiles are up-to-date. And,
# surprisingly enough, .depend has a rule for it, so if any of the source
# files change, it will be invoked, *regardless* of what target you're making.
#
# So, for now, the dependencies has to be re-computed manually via `make depend'
# whenever a module changes its set of imports. Doing what was outlined above
# is only a small optimisation anyway, it would avoid the recomputation of
# dependencies if the .depend file was newer than any of the source modules.
#
.PHONY: depend

# Compiler produced files that are targets of the source's imports.
MKDEPENDHS_OBJ_SUFFICES=o

80
ifneq "$(BootingFromHc)" "YES"
81
82
83
PKGCONF_DEP = $(STAMP_PKG_CONF)
endif

84
depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP)
85
86
	@$(RM) .depend
	@touch .depend
87
ifneq "$(DOC_SRCS)" ""
88
	$(MKDEPENDLIT) -o .depend $(MKDEPENDLIT_OPTS) $(filter %.lit,$(DOC_SRCS))
89
90
endif
ifneq "$(MKDEPENDC_SRCS)" ""
91
	$(MKDEPENDC) -f .depend $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS) 
92
93
endif
ifneq "$(MKDEPENDHS_SRCS)" ""
94
	$(MKDEPENDHS) -M -optdep-f -optdep.depend $(foreach way,$(WAYS),-optdep-s -optdep$(way)) $(foreach obj,$(MKDEPENDHS_OBJ_SUFFICES),-osuf $(obj)) $(MKDEPENDHS_OPTS) $(filter-out -split-objs, $(HC_OPTS)) $(MKDEPENDHS_SRCS)
95
96
97
endif


98
99
100
101
102
103
104
##################################################################
# 			boot
#
#  The boot target, at a minimum generates dependency information

.PHONY: boot

sof's avatar
sof committed
105
106
107
108
109
ifeq "$(NO_BOOT_TARGET)" "YES"
boot ::
else
boot :: depend
endif
110
111
112
113
114
115
116
117

##################################################################
# 		GNU Standard targets
#
#	Every Makefile should define the following targets
# 
# `all'
#      Compile the entire program. This should be the default target.
rrt's avatar
rrt committed
118
#      This target need not rebuild any documentation files
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
# 
# `install'
#      Compile the program and copy the executables, libraries, and so on
#      to the file names where they should reside for actual use. If
#      there is a simple test to verify that a program is properly
#      installed, this target should run that test.
# 
#      The commands should create all the directories in which files are
#      to be installed, if they don't already exist. This includes the
#      directories specified as the values of the variables prefix and
#      exec_prefix , as well as all subdirectories that are needed. One
#      way to do this is by means of an installdirs target as described
#      below.
# 
#      Use `-' before any command for installing a man page, so that make
#      will ignore any errors.  This is in case there are systems that
#      don't have the Unix man page documentation system installed.
# 
# `uninstall'
#      Delete all the installed files that the `install' target would
#      create (but not the noninstalled files such as `make all' would
#      create).
# 
# `clean'
# 
#      Delete all files from the current directory that are normally
#      created by building the program.  Don't delete the files that
#      record the configuration. Also preserve files that could be made
#      by building, but normally aren't because the distribution comes
#      with them.
# 
#      Delete `.dvi' files here if they are not part of the
#      distribution.
# 
# `distclean'
#      Delete all files from the current directory that are created by
#      configuring or building the program. If you have unpacked the
#      source and built the program without creating any other files,
#      `make distclean' should leave only the files that were in the
#      distribution.
# 
# `mostlyclean'
#      Like `clean', but may refrain from deleting a few files that
#      people normally don't want to recompile. For example, the
#      `mostlyclean' target for GCC does not delete `libgcc.a', because
#      recompiling it is rarely necessary and takes a lot of time.
# 
# `maintainer-clean'
#      Delete everything from the current directory that can be
#      reconstructed with this Makefile.  This typically includes
#      everything deleted by distclean , plus more: C source files
rrt's avatar
rrt committed
170
#      produced by Bison, tags tables, and so on.
171
172
173
174
175
176
177
178
179
180
# 
#      One exception, however: `make maintainer-clean' should not delete
#      `configure' even if `configure' can be remade using a rule in the
#      Makefile. More generally, `make maintainer-clean' should not delete
#      anything that needs to exist in order to run `configure' and then
#      begin to build the program.
# 
# `TAGS'
#      Update a tags table for this program.
# 
181
# `dvi' `ps' `pdf' `html' `rtf' 
rrt's avatar
rrt committed
182
183
184
#      Generate DVI/PS/PDF files for LaTeX/DocBook docs. Not everything is
#      supported everywhere, but the intention is to standardise on DocBook
#      producing all formats.
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#
# `check'
#      Perform self-tests (if any). The user must build the program
#      before running the tests, but need not install the program; you
#      should write the self-tests so that they work when the program is
#      built but not installed.
# 
# The following targets are suggested as conventional names, for programs
# in which they are useful.
# 
# installcheck
#      Perform installation tests (if any). The user must build and
#      install the program before running the tests. You should not
#      assume that `$(bindir)' is in the search path.
# 
# installdirs
#      It's useful to add a target named `installdirs' to create the
#      directories where files are installed, and their parent
#      directories. There is a script called `mkinstalldirs' which is
#      convenient for this; find it in the Texinfo package.
sof's avatar
sof committed
205
206
#      (FPTOOLS: we use a close relative of the suggested script, situated
#       in glafp-utils/mkdirhier -- SOF)
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




###########################################
#
#	Targets: "all"
#
###########################################

# For each of these variables that is defined
# we generate one "all" rule and one rule for the variable itself:
#
#	HS_PROG		Haskell program
#	C_PROG		C program
#	LIBRARY		Library
#	SCRIPT_PROG	Script (e.g. Perl script)
#
# For details of exactly what rule is generated, see the
# relevant section below

.PHONY: all

#----------------------------------------
#	Haskell programs

ifneq "$(HS_PROG)" ""
all :: $(HS_PROG)

236
ifneq "$(BootingFromHc)" "YES"
237
238
$(HS_PROG) :: $(OBJS)
	$(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(OBJS)
239
else
sof's avatar
sof committed
240
# see bootstrap.mk
241
242
$(HS_PROG) :: $(OBJS)
	$(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(OBJS) $(HC_BOOT_LIBS)
243
endif
rrt's avatar
rrt committed
244
endif
rrt's avatar
rrt committed
245

246
247
248
#----------------------------------------
#	C programs

rrt's avatar
rrt committed
249
250
251
ifneq "$(C_PROG)" ""
all :: $(C_PROG)

252
253
254
255
$(C_PROG) :: $(C_OBJS)
	$(CC) -o $@ $(CC_OPTS) $(LD_OPTS) $(C_OBJS) $(LIBS)
endif

256
257
#----------------------------------------
#	Libraries/archives
258
#
ken's avatar
ken committed
259
# Build $(LIBRARY) from $(LIBOBJS)+$(STUBOBJS)
260
261
262
263
264
265
266
#
# Inputs:
#   $(LIBOBJS)
#   $(STUBOBJS)
#
# Outputs:
#   Rule to build $(LIBRARY)
267

268
269
270
ifneq "$(LIBRARY)" ""
all :: $(LIBRARY)

rrt's avatar
rrt committed
271
ifneq "$(way)" "i"
272
273
define BUILD_LIB
$(RM) $@
274
$(AR) $(AR_OPTS) $@ $(STUBOBJS) $(LIBOBJS)
275
276
$(RANLIB) $@
endef
rrt's avatar
rrt committed
277
278
279
280
281
282
else
define BUILD_LIB
$(RM) $@
al -out:$@ $(STUBOBJS) $(LIBOBJS)
endef
endif
283
284
285
286
287
288
289
290
291

#
# For Haskell object files, we might have chosen to split
# up the object files. Test for whether the library being
# built is consisting of Haskell files by (hackily) checking
# whether HS_SRCS is empty or not.
#

ifneq "$(HS_SRCS)" ""
rrt's avatar
rrt committed
292
ifeq "$(SplitObjs)" "YES"
293

294
295
296
# can't split objs in way 'u', so we disable it here
ifneq "$(way)" "u"

297
298
SRC_HC_OPTS += -split-objs

299
300
301
# We generate the archive into a temporary file libfoo.a.tmp, then
# rename it at the end.  This avoids the problem that ar may sometimes
# fail, leaving a partially built archive behind.
ken's avatar
ken committed
302
ifeq "$(ArSupportsInput)" ""
303
define BUILD_LIB
304
$(RM) $@ $@.tmp
reid's avatar
reid committed
305
(echo $(STUBOBJS) $(C_OBJS) $(GC_C_OBJS); $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print) | xargs $(AR) $@
306
$(RANLIB) $@
307
endef
ken's avatar
ken committed
308
309
else
define BUILD_LIB
310
$(RM) $@ $@.tmp
311
312
echo $(STUBOBJS) > $@.list
echo $(C_OBJS) >> $@.list
reid's avatar
reid committed
313
echo $(GC_C_OBJS) >> $@.list
314
$(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print >> $@.list
315
$(AR) $(AR_OPTS) $@ $(ArSupportsInput) $@.list
ken's avatar
ken committed
316
$(RM) $@.list
317
$(RANLIB) $@
ken's avatar
ken committed
318
319
endef
endif
320
321
322

# Extra stuff for compiling Haskell files with $(SplitObjs):

323
HC_SPLIT_PRE = \
324
    $(RM) $@; if [ ! -d $(basename $@)_split ]; then mkdir $(basename $@)_split; else \
325
    $(FIND) $(basename $@)_split -name '*.$(way_)o' -print | xargs $(RM) __rm_food; fi
326
ifeq "$(GhcWithInterpreter)" "YES"
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
ifeq "$(LdIsGNULd)" "YES"
# If ld is GNU ld, we can use a linker script to pass the names of the
# input files.  This avoids problems with limits on the length of the
# ld command line, which we run into for large Haskell modules.
HC_SPLIT_POST = \
  ( cd $(basename $@)_split; \
    $(RM) ld.script; \
    touch ld.script; \
    echo "INPUT(" *.$(way_)o ")" >>ld.script; \
    $(LD) -r $(LD_X) -o ../$(notdir $@) ld.script; \
  )
else
HC_SPLIT_POST = \
  ( cd $(basename $@)_split; \
    $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o; \
  )
endif # LdIsGNULd == YES
344
345
else
HC_SPLIT_POST = touch $@
346
endif # GhcWithInterpreter == YES
347

348
349
SRC_HC_PRE_OPTS  += $(HC_SPLIT_PRE);
SRC_HC_POST_OPTS += $(HC_SPLIT_POST);
350

351
352
353
354
355
356
#
# If (Haskell) object files are split, cleaning up 
# consist of descending into the directories where
# the myriads of object files have been put.
#

357
extraclean ::
358
359
	$(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
	-rmdir $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) > /dev/null 2>&1
360

361
endif # $(way) == u
362
endif # $(SplitObjs)
363
endif # $(HS_SRCS)
364

365
366
367
368
#
# Remove local symbols from library objects if requested.
#

369
ifeq "$(StripLibraries)" "YES"
rrt's avatar
rrt committed
370
ifeq "$(SplitObjs)" "YES"
371
SRC_HC_POST_OPTS += \
372
  for i in $(basename $@)_split/*.$(way_)o; do \
373
	$(LD) -r $(LD_X) -o $$i.tmp $$i; \
374
375
376
377
	$(MV) $$i.tmp $$i; \
  done
else
SRC_HC_POST_OPTS += \
378
  $(LD) -r $(LD_X) -o $@.tmp $@; $(MV) $@.tmp $@
379
380
endif # SplitObjs
endif # StripLibraries
381

sof's avatar
sof committed
382
383
384
385
# Note: $(STUBOBJS) isn't depended on here, but included when building the lib.
#       (i.e., the assumption is that $(STUBOBJS) are created as a side-effect
#       of building $(LIBOBJS)).
$(LIBRARY) : $(LIBOBJS)
386
	$(BUILD_LIB)
387
endif # LIBRARY = ""
388

sof's avatar
sof committed
389
390
391
#----------------------------------------
#	Building Win32 DLLs
#
392
393

ifeq "$(DLLized)" "YES"
rrt's avatar
rrt committed
394
SRC_CC_OPTS += -DDLLized
395

rrt's avatar
rrt committed
396
ifneq "$(PACKAGE)" ""
397

rrt's avatar
rrt committed
398
SRC_BLD_DLL_OPTS += --export-all --output-def=HS$(PACKAGE)$(_cbits)$(_way).def DllVersionInfo.$(way_)o
rrt's avatar
rrt committed
399
400

ifneq "$(PACKAGE) $(IS_CBITS_LIB)" "std YES"
rrt's avatar
rrt committed
401
ifneq "$(PACKAGE)" "rts"
402
403
SRC_BLD_DLL_OPTS += -lHSstd_cbits_imp -L$(GHC_LIB_DIR)/std/cbits
SRC_BLD_DLL_OPTS += -lHSrts_$(way_)imp -L$(GHC_RUNTIME_DIR)
rrt's avatar
rrt committed
404
ifneq "$(PACKAGE)" "std"
405
406
407
408
409
  ifeq "$(IS_CBITS_LIB)" ""
  SRC_BLD_DLL_OPTS += -lHSstd_$(way_)imp -L$(GHC_LIB_DIR)/std 
  endif
endif
endif
rrt's avatar
rrt committed
410
411
endif

412
413
SRC_BLD_DLL_OPTS += -lgmp -L. -L$(GHC_RUNTIME_DIR)/gmp
ifeq "$(IS_CBITS_LIB)" ""
rrt's avatar
rrt committed
414
415
SRC_BLD_DLL_OPTS += $(patsubst %,-lHS%_$(way_)imp, $(PACKAGE_DEPS))
SRC_BLD_DLL_OPTS += $(patsubst %,-L../%, $(PACKAGE_DEPS))
416
417
endif
ifneq "$(HAS_CBITS)" ""
rrt's avatar
rrt committed
418
SRC_BLD_DLL_OPTS += -lHS$(PACKAGE)_cbits_imp -Lcbits
419
420
421
endif
SRC_BLD_DLL_OPTS += -lwsock32 -lwinmm

rrt's avatar
rrt committed
422
endif # PACKAGE != ""
423
424
425
426
427
428

SplitObjs = NO 

ifneq "$(LIBRARY)" ""

all :: DllVersionInfo.$(way_)o
sof's avatar
sof committed
429
430

ifeq "$(DLL_NAME)" ""
431
DLL_NAME = $(patsubst %.a,%.dll,$(subst lib,,$(LIBRARY)))
sof's avatar
sof committed
432
433
endif

rrt's avatar
rrt committed
434
ifneq "$(DLL_NAME)" ""
rrt's avatar
rrt committed
435
DLL_NAME := $(DLL_PEN)/$(DLL_NAME)
rrt's avatar
rrt committed
436
endif
rrt's avatar
rrt committed
437

sof's avatar
sof committed
438
439
all :: $(DLL_NAME)

sof's avatar
sof committed
440
ifeq "$(DLL_IMPLIB_NAME)" ""
441
DLL_IMPLIB_NAME = $(patsubst %.a,%_imp.a,$(LIBRARY))
sof's avatar
sof committed
442
443
endif

sof's avatar
sof committed
444
$(DLL_NAME) :: $(LIBRARY)
rrt's avatar
rrt committed
445
	$(BLD_DLL) --output-lib $(DLL_IMPLIB_NAME) -o $(DLL_NAME) $(LIBRARY) $(BLD_DLL_OPTS)
446
447
448
endif # LIBRARY != ""

endif # DLLized
sof's avatar
sof committed
449

sof's avatar
sof committed
450
451
452
453
454
455
#
# Version information is baked into a DLL by having the DLL include DllVersionInfo.o.
# The version info contains two user tweakables: DLL_VERSION and DLL_VERSION_NAME.
# (both are given sensible defaults though.)
#
# Note: this will not work as expected with Cygwin B20.1; you need a more recent
456
#       version of binutils (to pick up windres bugfixes.)
sof's avatar
sof committed
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485

ifndef DLL_VERSION
DLL_VERSION=$(ProjectVersion)
endif

ifndef DLL_VERSION_NAME
DLL_VERSION_NAME="http://www.haskell.org/ghc"
endif

ifndef DLL_DESCRIPTION
DLL_DESCRIPTION="A GHC-compiled DLL"
endif

ifndef EXE_VERSION
EXE_VERSION=$(ProjectVersion)
endif

ifndef EXE_VERSION_NAME
EXE_VERSION_NAME="http://www.haskell.org/ghc"
endif

ifndef EXE_DESCRIPTION
EXE_DESCRIPTION="A GHC-compiled binary"
endif

#
# Little bit of lo-fi mangling to get at the right set of settings depending
# on whether we're generating the VERSIONINFO for a DLL or EXE
# 
486
DLL_OR_EXE=$(subst VersionInfo.$(way_)rc,,$@)
sof's avatar
sof committed
487
488
489
490
491
VERSION_FT=$(subst Dll, 0x2L, $(subst Exe, 0x1L, $(DLL_OR_EXE)))
VERSION_RES_NAME=$(subst Exe,$(EXE_VERSION_NAME), $(subst Dll, $(DLL_VERSION_NAME),$(DLL_OR_EXE)))
VERSION_RES=$(subst Exe,$(EXE_VERSION), $(subst Dll, $(DLL_VERSION),$(DLL_OR_EXE)))
VERSION_DESC=$(subst Exe,$(EXE_DESCRIPTION), $(subst Dll, $(DLL_DESCRIPTION),$(DLL_OR_EXE)))

492
493
DllVersionInfo.$(way_)rc ExeVersionInfo.$(way_)rc:
	$(RM) DllVersionInfo.$(way_)rc
sof's avatar
sof committed
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
	echo "1 VERSIONINFO"  		    > $@
	echo "FILEVERSION 1,0,0,1"         >> $@
	echo "PRODUCTVERSION 1,0,0,1"      >> $@
	echo "FILEFLAGSMASK 0x3fL"         >> $@
	echo "FILEOS 0x4L"                 >> $@
	echo "FILETYPE $(VERSION_FT)"      >> $@
	echo "FILESUBTYPE 0x0L"            >> $@
	echo "BEGIN"                       >> $@
	echo " BLOCK \"StringFileInfo\""   >> $@
	echo " BEGIN"                      >> $@
	echo "  BLOCK \"040904B0\""        >> $@
	echo "  BEGIN"                     >> $@
	echo "   VALUE \"CompanyName\", \"$(VERSION_RES_NAME)\\0\"" >> $@
	echo "   VALUE \"FileVersion\", \"$(VERSION_RES)\\0\"" >> $@
	echo "   VALUE \"ProductVersion\", \"$(VERSION_RES)\\0\"" >> $@
	echo "   VALUE \"FileDescription\", \"$(VERSION_DESC)\\0\"" >> $@
	echo "  END" >> $@
	echo " END" >> $@
	echo " BLOCK \"VarFileInfo\""  >> $@
	echo " BEGIN" >> $@
	echo "  VALUE \"Translation\", 0x0409, 1200" >> $@
	echo " END" >> $@
	echo "END" >> $@

518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
#----------------------------------------
#	Script programs

ifneq "$(SCRIPT_PROG)" ""

# To produce a fully functional script, you may
# have to add some configuration variables at the top of 
# the script, i.e., the compiler driver needs to know
# the path to various utils in the build tree for instance.
#
# To have the build rule for the script automatically do this
# for you, set the variable SCRIPT_SUBST_VARS to the list of
# variables you need to put in.

#
# SCRIPT_SUBST creates a string of echo commands that
# will when evaluated append the (perl)variable name and its value 
# to the target it is used for, i.e.,
#
#    A=foo
#    B=bar
#    SCRIPT_SUBST_VARS = A B
#    SCRIPT_SUBST=echo "$""A=\"foo\";" >> $@; echo "$""B=\"bar\";" >> $@
#
#    so if you have a rule like the following
#    
#     foo:
#         @(RM) $@
#         @(TOUCH) $@
#         @eval $(SCRIPT_SUBST)
#
#    `make foo' would create a file `foo' containing the following
#
#    % cat foo
#    $A=foo;
#    $B=bar;
#    %
#
# ToDo: make this work for shell scripts (drop the initial $).
#
558
559
560
ifeq "$(INTERP)" "$(SHELL)"
SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$(val)=\\\"$($(val))\\\";\" >> $@;")
else
561
SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$$\"\"$(val)=\\\"$($(val))\\\";\" >> $@;")
562
endif
563
564
565

all :: $(SCRIPT_PROG)

566
$(SCRIPT_PROG) : $(SCRIPT_OBJS)
567
568
	$(RM) $@
	@echo Creating $@...
sof's avatar
sof committed
569
ifeq "$(INTERP)" "perl"
sof's avatar
sof committed
570
	echo "#! "$(PERL) > $@
sof's avatar
sof committed
571
else
572
573
574
575
576
ifneq "$(INTERP)" ""
	@echo "#!"$(INTERP) > $@
else
	@touch $@
endif
sof's avatar
sof committed
577
endif
578
579
580
ifneq "$(SCRIPT_PREFIX_FILES)" ""
	@cat $(SCRIPT_PREFIX_FILES) >> $@
endif
581
ifneq "$(SCRIPT_SUBST)" ""
582
	@eval $(SCRIPT_SUBST) 
583
endif
584
585
	@cat $(SCRIPT_OBJS) >> $@
	@chmod a+x $@
sof's avatar
sof committed
586
	@echo Done.
587
588
endif

589
590
# ---------------------------------------------------------------------------
# Symbolic links
591

592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
# links to programs: we sometimes install a program as
# <name>-<version> with a link from <name> to the real program.

ifneq "$(LINK)" ""

all :: $(LINK)

CLEAN_FILES += $(LINK)

ifeq "$(LINK_TARGET)" ""
ifneq "$(SCRIPT_PROG)" ""
LINK_TARGET = $(SCRIPT_PROG)
else
ifneq "$(HS_PROG)" ""
LINK_TARGET = $(HS_PROG)
else
ifneq "$(C_PROG)" ""
LINK_TARGET = $(C_PROG)
else
LINK_TARGET = dunno
endif
endif
endif
endif
616

sof's avatar
sof committed
617
#
618
# Don't want to overwrite $(LINK)s that aren't symbolic
619
# links. Testing for symbolic links is problematic to do in
sof's avatar
sof committed
620
621
622
# a portable fashion using a /bin/sh test, so we simply rely
# on perl.
#
623
624
625
626
627
$(LINK) : $(LINK_TARGET)
	@if ( $(PERL) -e '$$fn="$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
	   echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK)"; \
	   $(RM) $(LINK); \
	   $(LN_S) $(LINK_TARGET) $(LINK); \
sof's avatar
sof committed
628
	 else \
629
630
631
632
633
634
635
636
637
638
	   echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) failed: \`$(LINK)' already exists"; \
	   echo "Perhaps remove \`$(LINK)' manually?"; \
	   exit 1; \
	 fi;


#
# install links to script drivers.
#
install ::
chak's avatar
chak committed
639
	@$(INSTALL_DIR) $(bindir)
640
	@if ( $(PERL) -e '$$fn="$(bindir)/$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
641
	   echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir)"; \
642
643
644
	   $(RM) $(bindir)/$(LINK); \
	   $(LN_S) $(LINK_TARGET) $(bindir)/$(LINK); \
	 else \
645
	   echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \
646
	   echo "Perhaps remove \`$(bindir)/$(LINK)' manually?"; \
sof's avatar
sof committed
647
648
	   exit 1; \
	 fi;
649

650
endif # LINK 
651

sof's avatar
sof committed
652

653
654
655
656
657
658
659
660
661
###########################################
#
#	Targets: install install-strip uninstall
#
###########################################

# For each of these variables that is defined, you
# get one install rule
#
sof's avatar
sof committed
662
663
664
665
666
667
#	INSTALL_PROGS 	     executable programs in $(bindir)
#	INSTALL_SCRIPTS	     executable scripts in $(bindir)
#	INSTALL_LIBS	     platform-dependent libraries in $(libdir) (ranlib'ed)
#	INSTALL_LIB_SCRIPTS  platform-dependent scripts   in $(libdir)
#	INSTALL_LIBEXECS     platform-dependent execs in $(libdir)
#	INSTALL_DATAS	     platform-independent files in $(datadir)
668
#	INSTALL_IFACES	     platform-dependent interface files in $(ifacedir)
669
670
671
672
673
674
675
676
#
# If the installation directory variable is undefined, the install rule simply
# emits a suitable error message.
#
# Remember, too, that the installation directory variables ($(bindir) and
# friends can be overridden from their original settings in mk/config.mk.in
# || mk/build.mk
#
rrt's avatar
rrt committed
677
.PHONY: install install-docs installdirs install-strip install-dirs uninstall install-docs show-install
sof's avatar
sof committed
678
679
680
681
682
683

show-install :
	@echo "bindir = $(bindir)"
	@echo "libdir = $(libdir)"
	@echo "libexecdir = $(libexecdir)  # by default, same as libdir"
	@echo "datadir = $(datadir)  # unused for ghc project"
684
685
686
687
688

#
# Sometimes useful to separate out the creation of install directories 
# from the installation itself.
#
sof's avatar
sof committed
689
install-dirs ::
sof's avatar
sof committed
690
691
692
693
	@$(INSTALL_DIR) $(bindir)
	@$(INSTALL_DIR) $(libdir)
	@$(INSTALL_DIR) $(libexecdir)
	@$(INSTALL_DIR) $(datadir)
694
695

# Better do this first...
sof's avatar
sof committed
696
697
698
# but we won't for the moment, do it on-demand from
# within the various install targets instead.
#install:: install-dirs
699

700
701
702
703
704
705
706
707
708
709
710
#
# Setting user/group ownership for the installed entities
#
ifneq "$(INSTALL_OWNER)" ""
SRC_INSTALL_OPTS += -o $(INSTALL_OWNER)
endif
ifneq "$(INSTALL_GROUP)" ""
SRC_INSTALL_OPTS += -g $(INSTALL_GROUP)
endif


711
ifneq "$(INSTALL_PROGS)" ""
sof's avatar
sof committed
712
713
714
715
716
717
718
719
720
721

#
# Here's an interesting one - when using the win32 version
# of install (provided via the cygwin toolkit), we have to
# supply the .exe suffix, *if* there's no other suffix.
#
# The rule below does this by ferreting out the suffix of each
# entry in the INSTALL_PROGS list. If there's no suffix, use
# $(exeext).
# 
rrt's avatar
rrt committed
722
INSTALL_PROGS := $(foreach p, $(INSTALL_PROGS), $(addsuffix $(if $(suffix $(p)),,$(exeext)), $(basename $(p))))
sof's avatar
sof committed
723

724
install:: $(INSTALL_PROGS)
sof's avatar
sof committed
725
	@$(INSTALL_DIR) $(bindir)
sof's avatar
sof committed
726
	@for i in $(INSTALL_PROGS); do \
sof's avatar
sof committed
727
		    echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \
sof's avatar
sof committed
728
		    $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ;  \
sof's avatar
sof committed
729
	done
sof's avatar
sof committed
730
731
endif

sof's avatar
sof committed
732
733
734
735
#
# Just like INSTALL_PROGS, but prefix with install sites bin/lib/data and
# install without stripping.
#
sof's avatar
sof committed
736
737
ifneq "$(INSTALL_SCRIPTS)" ""
install:: $(INSTALL_SCRIPTS)
sof's avatar
sof committed
738
	@$(INSTALL_DIR) $(bindir)
sof's avatar
sof committed
739
	for i in $(INSTALL_SCRIPTS); do \
740
		$(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir); \
sof's avatar
sof committed
741
742
743
744
745
	done
endif

ifneq "$(INSTALL_LIB_SCRIPTS)" ""
install:: $(INSTALL_LIB_SCRIPTS)
sof's avatar
sof committed
746
	@$(INSTALL_DIR) $(libdir)
747
	for i in $(INSTALL_LIB_SCRIPTS); do \
748
		$(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir); \
sof's avatar
sof committed
749
	done
sof's avatar
sof committed
750
endif
751

752
753
ifneq "$(INSTALL_LIBEXEC_SCRIPTS)" ""
install:: $(INSTALL_LIBEXEC_SCRIPTS)
sof's avatar
sof committed
754
	@$(INSTALL_DIR) $(libexecdir)
755
	for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
756
		$(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir); \
757
758
759
	done
endif

760
761
ifneq "$(INSTALL_LIBS)" ""
install:: $(INSTALL_LIBS)
sof's avatar
sof committed
762
	@$(INSTALL_DIR) $(libdir)
sof's avatar
sof committed
763
	for i in $(INSTALL_LIBS); do \
sof's avatar
sof committed
764
765
766
		case $$i in \
		  *.a) \
		    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
767
		    $(RANLIB) $(libdir)/`basename $$i` ;; \
sof's avatar
sof committed
768
769
		  *.dll) \
		    $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
770
771
		  *.so) \
		    $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
sof's avatar
sof committed
772
773
774
		  *) \
		    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
		esac; \
sof's avatar
sof committed
775
	done
776
777
778
endif

ifneq "$(INSTALL_LIBEXECS)" ""
sof's avatar
sof committed
779
780
781
782
783
784
#
# See above comment next to defn of INSTALL_PROGS for what
# the purpose of this one-liner is.
# 
INSTALL_LIBEXECS := $(foreach p, $(INSTALL_LIBEXECS), $(addsuffix $(subst _,,$(subst __,$(exeext),_$(suffix $(p))_)), $(basename $(p))))

785
install:: $(INSTALL_LIBEXECS)
sof's avatar
sof committed
786
	@$(INSTALL_DIR) $(libexecdir)
sof's avatar
sof committed
787
	-for i in $(INSTALL_LIBEXECS); do \
sof's avatar
sof committed
788
		$(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \
sof's avatar
sof committed
789
	done
790
791
792
793
endif

ifneq "$(INSTALL_DATAS)" ""
install:: $(INSTALL_DATAS)
sof's avatar
sof committed
794
	@$(INSTALL_DIR) $(datadir)
sof's avatar
sof committed
795
796
797
	for i in $(INSTALL_DATAS); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
	done
798
799
endif

800
801
802
803
804
805
806
807
808
809
810
811
812
ifneq "$(INSTALL_IFACES)" ""
install:: $(INSTALL_IFACES)
	@$(INSTALL_DIR) $(ifacedir)
	for i in $(INSTALL_IFACES); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir); \
	done
endif

ifneq "$(INSTALL_IFACES_WITH_DIRS)" ""
install:: $(INSTALL_IFACES_WITH_DIRS)
	@$(INSTALL_DIR) $(ifacedir)
	for i in $(INSTALL_IFACES_WITH_DIRS); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir)/`dirname $$i`; \
813
814
815
	done
endif

816
817
818
819
820
821
822
823
ifneq "$(INSTALL_INCLUDES)" ""
install:: $(INSTALL_INCLUDES)
	@$(INSTALL_DIR) $(includedir)
	for i in $(INSTALL_INCLUDES); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(includedir); \
	done
endif

rrt's avatar
rrt committed
824
ifneq "$(INSTALL_DOCS)" ""
825
826
827
828
829
830
831
832
833
ifneq "$(XMLDocWays)" ""
install-docs:: $(INSTALL_DOCS)
	@$(INSTALL_DIR) $(datadir)	
	for i in $(INSTALL_DOCS); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
	done
endif
endif

834
# TODO: The following could be an entry for an Obfuscated Makefile Contest...
835
836
ifneq "$(INSTALL_XML_DOC)" ""
ifneq "$(XMLDocWays)" ""
837
install-docs:: $(foreach i,$(XMLDocWays),$(INSTALL_XML_DOC)$(patsubst %.html-no-chunks,%.html,$(patsubst %.htmlhelp,%.chm,$(patsubst %.html,%/index.html,.$(i)))))
838
839
840
841
	@$(INSTALL_DIR) $(datadir)	
	@for i in $(XMLDocWays); do \
		if [ $$i = "html" ]; then \
			$(INSTALL_DIR) $(datadir)/html; \
ross's avatar
ross committed
842
843
844
			$(INSTALL_DIR) $(datadir)/html/$(INSTALL_XML_DOC); \
			echo "( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) )" ; \
			( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) ) ; \
845
		else \
846
847
			echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.htmlhelp/.chm/ | sed s/\.html-no-chunks/.html/` $(datadir); \
			$(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.htmlhelp/.chm/ | sed s/\.html-no-chunks/.html/` $(datadir); \
848
		fi; \
849
		if [ $$i = "html-no-chunks" ]; then \
850
851
			echo $(CP) $(FPTOOLS_CSS_ABS) $(datadir); \
			$(CP) $(FPTOOLS_CSS_ABS) $(datadir); \
852
853
854
		fi \
	done
endif
855
endif
rrt's avatar
rrt committed
856

857
858
859
860
#
# Use with care..
#
uninstall:: 
sof's avatar
sof committed
861
862
	@for i in $(INSTALL_PROGS) "" ; do			\
	  if test "$$i"; then 					\
863
864
		echo rm -f $(bindir)/`basename $$i`;		\
		rm -f $(bindir)/`basename $$i`;			\
sof's avatar
sof committed
865
	  fi; 							\
866
	done
sof's avatar
sof committed
867
868
	@for i in $(INSTALL_LIBS) ""; do			\
	  if test "$$i"; then 					\
869
870
		echo rm -f $(libdir)/`basename $$i`;		\
		rm -f $(libdir)/`basename $$i`;			\
sof's avatar
sof committed
871
	  fi;							\
872
	done
sof's avatar
sof committed
873
874
	@for i in $(INSTALL_LIBEXECS) ""; do			\
	  if test "$$i"; then 					\
875
876
		echo rm -f $(libexecdir)/`basename $$i`;	\
		rm -f $(libexecdir)/`basename $$i`;		\
sof's avatar
sof committed
877
	  fi;							\
878
	done
sof's avatar
sof committed
879
880
	@for i in $(INSTALL_DATAS) ""; do			\
	  if test "$$i"; then 					\
881
882
		echo rm -f $(datadir)/`basename $$i`;		\
		rm -f $(datadir)/`basename $$i`;		\
sof's avatar
sof committed
883
	  fi;							\
884
885
886
887
888
889
890
891
892
893
	done

#
# install-strip is from the GNU Makefile standard.
#
ifneq "$(way)" ""
install-strip::
	@$(MAKE) EXTRA_INSTALL_OPTS='-s' install                                	
endif

894
##############################################################################
895
#
rrt's avatar
rrt committed
896
#	Targets: check tags show
897
#
898
##############################################################################
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915

#------------------------------------------------------------
# 			Check

.PHONY: check

check:: $(TESTS)
	@for i in $(filter-out %.lhs .hs, $(TESTS)) ''; do	\
	  if (test -f "$$i"); then 		\
	    echo Running: `basename $$i` ;	\
	    cd test; `basename $$i` ;		\
	  fi;					\
	done;

#------------------------------------------------------------
# 			Tags

sof's avatar
sof committed
916
.PHONY: TAGS tags
917

sof's avatar
sof committed
918
tags TAGS:: $(TAGS_HS_SRCS) $(TAGS_C_SRCS)
919
920
	@$(RM) TAGS
	@touch TAGS
sof's avatar
sof committed
921
ifneq "$(TAGS_HS_SRCS)" ""
922
	$(HSTAGS) $(HSTAGS_OPTS) $(TAGS_HS_SRCS)
923
endif
sof's avatar
sof committed
924
ifneq "$(TAGS_C_SRCS)" ""
sof's avatar
sof committed
925
	etags -a $(TAGS_C_SRCS)
926
endif
sof's avatar
sof committed
927
	@( DEREFFED=`ls -l Makefile | sed -e 's/.*-> \(.*\)/\1/g'` && $(RM) `dirname $$DEREFFED`/TAGS && $(CP) TAGS `dirname $$DEREFFED` ) 2>/dev/null || echo TAGS file generated, perhaps copy over to source tree?
928
929
930
931
932
933
934
935

#------------------------------------------------------------
# 			Makefile debugging
# to see the effective value used for a Makefile variable, do
#  make show VALUE=MY_VALUE
#

show:
936
	@echo '$(VALUE)="$($(VALUE))"'
937

938
939
940
941
942
943
################################################################################
#
#			DocBook XML Documentation
#
################################################################################

944
.PHONY: html html-no-chunks htmlhelp fo dvi ps pdf
945
946
947
948
949
950
951
952
953
954
955
956

ifneq "$(XML_DOC)" ""

all :: $(XMLDocWays)

# multi-file XML document: main document name is specified in $(XML_DOC),
# sub-documents (.xml files) listed in $(XML_SRCS).

ifeq "$(XML_SRCS)" ""
XML_SRCS = $(wildcard *.xml)
endif

957
XML_HTML           = $(addsuffix /index.html,$(basename $(XML_DOC)))
958
959
XML_HTML_NO_CHUNKS = $(addsuffix .html,$(XML_DOC))
XML_HTMLHELP       = $(addsuffix -htmlhelp/index.html,$(basename $(XML_DOC)))
960
961
962
963
964
965
966
967
XML_FO             = $(addsuffix .fo,$(XML_DOC))
XML_DVI            = $(addsuffix .dvi,$(XML_DOC))
XML_PS             = $(addsuffix .ps,$(XML_DOC))
XML_PDF            = $(addsuffix .pdf,$(XML_DOC))

$(XML_HTML) $(XML_NO_CHUNKS_HTML) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF) :: $(XML_SRCS)

html           :: $(XML_HTML)
968
969
html-no-chunks :: $(XML_HTML_NO_CHUNKS)
htmlhelp       :: $(XML_HTMLHELP)
970
971
972
973
974
fo             :: $(XML_FO)
dvi            :: $(XML_DVI)
ps             :: $(XML_PS)
pdf            :: $(XML_PDF)

975
CLEAN_FILES += $(XML_HTML_NO_CHUNKS) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF)
976
977

extraclean ::
978
	$(RM) -rf $(XML_DOC).out $(FPTOOLS_CSS) $(basename $(XML_DOC)) $(basename $(XML_DOC))-htmlhelp
979
980
981
982
983

validate ::
	$(XMLLINT) --valid --noout $(XMLLINT_OPTS) $(XML_DOC).xml
endif

984
##############################################################################
985
986
987
#
#	Targets: clean
#
988
##############################################################################
989

990
991
992
993
# we have to be careful about recursion here; since all the clean
# targets are recursive, we don't want to make eg. distclean depend on
# clean because that would result in far too many recursive calls.

994
.PHONY: mostlyclean clean distclean maintainer-clean
995
996
997
998

mostlyclean::
	rm -f $(MOSTLY_CLEAN_FILES)

999
1000
# extraclean is used for adding actions to the clean target.
extraclean::
1001

1002
1003
1004
1005
1006
clean:: extraclean
	rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES)

distclean:: extraclean
	rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES) $(DIST_CLEAN_FILES)
1007

1008
maintainer-clean:: extraclean
1009
1010
	@echo 'This command is intended for maintainers to use; it'
	@echo 'deletes files that may need special tools to rebuild.'
1011
	rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES) $(DIST_CLEAN_FILES) $(MAINTAINER_CLEAN_FILES)
1012

1013
################################################################################
1014
1015
1016
#
#			Way management
#
1017
################################################################################
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054

# Here is the ingenious jiggery pokery that allows you to build multiple versions
# of a program in a single build tree.
#
# The ways setup requires the following variables to be set:
#
# Expects:	$(WAYS)			the possible "way" strings to one of 
#					which $(way) will be set


# So how does $(way) ever get set to anything?  Answer, we recursively
# invoke make, setting $(way) on the command line.
# When do we do this recursion?  Answer: whenever the programmer
# asks make to make a target that involves a way suffix.
# We must remember *not* to recurse again; but that's easy: we
# just see if $(way) is set:

ifeq "$(way)" ""

# If $(WAYS) = p mc, then WAY_TARGETS expands to
#	%.p_lhs %.p_hs %.p_o ... %.mc_lhs %.p_hs ...
# and OTHER_WAY_TARGETS to
#	%_p.a %_p %_mc.a %_mc
# where the suffixes are from $(SUFFIXES)
#
# We have to treat libraries and "other" targets differently, 
# because their names are of the form
#	libHS_p.a and Foo_p
# whereas everything else has names of the form
#	Foo.p_o

FPTOOLS_SUFFIXES := o hi hc

WAY_TARGETS     = $(foreach way,$(WAYS),$(foreach suffix, $(FPTOOLS_SUFFIXES), %.$(way)_$(suffix)))
LIB_WAY_TARGETS = $(foreach way,$(WAYS),%_$(way).a %_$(way))

# $@ will be something like Foo.p_o
sof's avatar
sof committed
1055
1056
1057
1058
1059
# $(suffix $@)     returns .p_o
# $(subst .,.p_o)  returns p_o
# $(subst _,.,p_o) returns p.o   (clever)
# $(basename p.o)  returns p
# 
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
$(WAY_TARGETS) :
	$(MAKE) way=$(basename $(subst _,.,$(subst .,,$(suffix $@)))) $@

# $(@F) will be something like libHS_p.a, or Foo_p
# $(basename $(@F)) will be libHS_p, or Foo_p
# The sed script extracts the "p" part.

$(LIB_WAY_TARGETS) :
	$(MAKE) $(MFLAGS) $@ way=$(subst .,,$(suffix $(subst _,.,$(basename $@))))

endif	# if way
1071

1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
# -------------------------------------------------------------------------
# Object and interface files have suffixes tagged with their ways

ifneq "$(way)" ""
SRC_HC_OPTS += -hisuf $(way_)hi -hcsuf $(way_)hc -osuf $(way_)o
endif

# -------------------------------------------------------------------------
# Rules to invoke the current target recursively for each way

1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
ifneq "$(WAYS)" ""
ifeq "$(way)" ""

# NB: the targets exclude 
#	boot runtests
# since these are way-independent
all docs TAGS clean distclean mostlyclean maintainer-clean install ::
	@echo "------------------------------------------------------------------------"
	@echo "===fptools== Recursively making \`$@' for ways: $(WAYS) ..."
	@echo "PWD = $(shell pwd)"
	@echo "------------------------------------------------------------------------"
# Don't rely on -e working, instead we check exit return codes from sub-makes.
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
	for i in $(WAYS) ; do \
	  echo "------------------------------------------------------------------------"; \
	  echo "==fptools== $(MAKE) way=$$i $@;"; \
	  echo "PWD = $(shell pwd)"; \
	  echo "------------------------------------------------------------------------"; \
	  $(MAKE) way=$$i --no-print-directory $(MFLAGS) $@ ; \
	  if [ $$? -eq 0 ] ; then true; else exit $$x_on_err; fi; \
	done
	@echo "------------------------------------------------------------------------"
	@echo "===fptools== Finished recursively making \`$@' for ways: $(WAYS) ..."
	@echo "PWD = $(shell pwd)"
	@echo "------------------------------------------------------------------------"

endif
endif
1110
1111
1112
1113
1114
1115
1116


##################################################################
#
# 		Recursive stuff
#
# This was once at the top of the file, allegedly because it was
1117
# needed for some targets, e.g. when building DLLs in libraries.  But
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
# since this reason is a little short on information, and I'm having
# trouble with subdirectory builds happening before the current
# directory when building hslibs (bad interaction with including
# _hsc.o files in the cbits lib) so I'm moving the recursive makes to
# the end --SDM 12/12/2001
#
##################################################################

# Here are the diabolically clever rules that
# 
# (a) for each "recursive target" <t>
#     propagates "make <t>" to directories in SUBDIRS
#
# (b) when SUBDIRS is empty,
#     for each "multi-way-target" <t>
#     calls "make way=w <t>" for each w in $(WAYS)
#
#     This has the effect of making the standard target
#     in each of the specified ways (as well as in the normal way

# Controlling variables
#	WAYS    = extra (beyond the normal way) ways to build things in
# 	SUBDIRS = subdirectories to recurse into

# No ways, so iterate over the SUBDIRS

# note about recursively invoking make: we'd like make to drop all the
# way back to the top level if it fails in any of the
# sub(sub-...)directories.  This is done by setting the -e flag to the
# shell during the loop, which causes an immediate failure if any of
# the shell commands fail.

# One exception: if the user gave the -i or -k flag to make in the
# first place, we'd like to reverse this behaviour.  So we check for
# these flags, and set the -e flag appropriately.  NOTE: watch out for
# the --no-print-directory flag which is passed to recursive
# invocations of make.
#
1156
#ifeq "$(way)" ""
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
ifneq "$(SUBDIRS)" ""

# we override the 'boot', 'all' and 'install' targets in the top
# level Makefile. Some of the sub-projects also set 'boot' to empty.

ifeq "$(NO_ALL_TARGET)" "YES"
ALL_TARGET     =
else
ALL_TARGET     = all
endif

ifeq "$(NO_BOOT_TARGET)" "YES"
BOOT_TARGET    =
else
BOOT_TARGET    = boot
endif

ifeq "$(NO_INSTALL_TARGET)" "YES"
INSTALL_TARGET =
INSTALL_DOCS_TARGET =
else
INSTALL_TARGET = install
INSTALL_DOCS_TARGET = install-docs
endif

$(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean maintainer-clean $(INSTALL_TARGET) $(INSTALL_DOCS_TARGET) html ps dvi txt::
	@echo "------------------------------------------------------------------------"
	@echo "===fptools== Recursively making \`$@' in $(SUBDIRS) ..."
	@echo "PWD = $(shell pwd)"
	@echo "------------------------------------------------------------------------"
# Don't rely on -e working, instead we check exit return codes from sub-makes.
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
	for i in $(SUBDIRS); do \
	  echo "------------------------------------------------------------------------"; \
	  echo "==fptools== $(MAKE) $@ $(MFLAGS);"; \
	  echo " in $(shell pwd)/$$i"; \
	  echo "------------------------------------------------------------------------"; \
	  $(MAKE) --no-print-directory -C $$i $(MFLAGS) $@; \
	  if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
	done
	@echo "------------------------------------------------------------------------"
	@echo "===fptools== Finished making \`$@' in $(SUBDIRS) ..."
	@echo "PWD = $(shell pwd)"
	@echo "------------------------------------------------------------------------"

endif
1203
#endif
1204
1205
1206
1207
1208
1209
1210
1211
1212

#
# Selectively building subdirectories.
#
#
ifneq "$(SUBDIRS)" ""
$(SUBDIRS) ::
	  $(MAKE) -C $@ $(MFLAGS)
endif
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226

# -----------------------------------------------------------------------------
# Further cleaning

# Sometimes we want to clean things only after the recursve cleaning
# has heppened (eg. if the files we're about to remove would affect
# the recursive traversal).

distclean::
	rm -f $(LATE_DIST_CLEAN_FILES)

maintainer-clean::
	rm -f $(LATE_DIST_CLEAN_FILES)