target.mk 34 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
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
##################################################################
# 		FPtools standard targets
#
# depend:
#
#  The depend target has to cope with a set of files that may have
#  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

depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS)
	@$(RM) .depend
	@touch .depend
ifneq "$(DOC_SRCS)" ""
	$(MKDEPENDLIT) -o .depend $(MKDEPENDLIT_OPTS) $(filter %.lit,$(DOC_SRCS))
endif
ifneq "$(MKDEPENDC_SRCS)" ""
	$(MKDEPENDC) -f .depend $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS) 
endif
ifneq "$(MKDEPENDHS_SRCS)" ""
ken's avatar
ken committed
85
	$(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)
86
87
88
endif


89
90
91
92
93
94
95
##################################################################
# 			boot
#
#  The boot target, at a minimum generates dependency information

.PHONY: boot

sof's avatar
sof committed
96
97
98
99
100
ifeq "$(NO_BOOT_TARGET)" "YES"
boot ::
else
boot :: depend
endif
101
102
103
104
105
106
107
108

##################################################################
# 		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
109
#      This target need not rebuild any documentation files
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
# 
# `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
161
#      produced by Bison, tags tables, and so on.
162
163
164
165
166
167
168
169
170
171
# 
#      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.
# 
rrt's avatar
rrt committed
172
173
174
175
# `dvi' `ps' `pdf' `html' `pdf'
#      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.
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#
# `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
196
197
#      (FPTOOLS: we use a close relative of the suggested script, situated
#       in glafp-utils/mkdirhier -- SOF)
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




###########################################
#
#	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)

227
ifneq "$(BootingFromHc)" "YES"
228
$(HS_PROG) :: $(HS_OBJS)
229
230
	$(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS)
else
sof's avatar
sof committed
231
# see bootstrap.mk
232
233
234
$(HS_PROG) :: $(HS_OBJS)
	$(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(HS_OBJS) $(HC_BOOT_LIBS)
endif
rrt's avatar
rrt committed
235

236
# for building a Haskell program, we add FptoolsHcOpts
rrt's avatar
rrt committed
237
SRC_HC_OPTS += $(FptoolsHcOpts)
rrt's avatar
rrt committed
238
endif
rrt's avatar
rrt committed
239

240
241
242
#----------------------------------------
#	C programs

rrt's avatar
rrt committed
243
244
245
ifneq "$(C_PROG)" ""
all :: $(C_PROG)

246
247
248
249
$(C_PROG) :: $(C_OBJS)
	$(CC) -o $@ $(CC_OPTS) $(LD_OPTS) $(C_OBJS) $(LIBS)
endif

250
251
#----------------------------------------
#	Libraries/archives
252
#
ken's avatar
ken committed
253
# Build $(LIBRARY) from $(LIBOBJS)+$(STUBOBJS)
254
255
256
257
258
259
260
#
# Inputs:
#   $(LIBOBJS)
#   $(STUBOBJS)
#
# Outputs:
#   Rule to build $(LIBRARY)
261

262
263
264
ifneq "$(LIBRARY)" ""
all :: $(LIBRARY)

rrt's avatar
rrt committed
265
ifneq "$(way)" "i"
266
267
define BUILD_LIB
$(RM) $@
268
$(AR) $(AR_OPTS) $@ $(STUBOBJS) $(LIBOBJS)
269
270
$(RANLIB) $@
endef
rrt's avatar
rrt committed
271
272
273
274
275
276
else
define BUILD_LIB
$(RM) $@
al -out:$@ $(STUBOBJS) $(LIBOBJS)
endef
endif
277
278
279
280
281
282
283
284
285

#
# 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
286
ifeq "$(SplitObjs)" "YES"
287

288
289
290
# can't split objs in way 'u', so we disable it here
ifneq "$(way)" "u"

291
292
SRC_HC_OPTS += -split-objs

293
294
295
# 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
296
ifeq "$(ArSupportsInput)" ""
297
define BUILD_LIB
298
$(RM) $@ $@.tmp
299
(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o') | xargs ar q $@.tmp
300
301
$(RANLIB) $@.tmp
$(MV) $@.tmp $@
302
endef
ken's avatar
ken committed
303
304
else
define BUILD_LIB
305
$(RM) $@ $@.tmp
ken's avatar
ken committed
306
echo $(STUBOBJS) > $@.list
307
$(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' >> $@.list
308
$(AR) $(AR_OPTS) $@.tmp $(ArSupportsInput) $@.list
ken's avatar
ken committed
309
$(RM) $@.list
310
311
$(RANLIB) $@.tmp
$(MV) $@.tmp $@
ken's avatar
ken committed
312
313
endef
endif
314
315
316

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

317
HC_SPLIT_PRE = \
318
319
    $(RM) $@; if [ ! -d $(basename $@)_split ]; then mkdir $(basename $@)_split; else \
    $(FIND) $(basename $@)_split -name '*.$(way_)o' | xargs $(RM) __rm_food; fi
320
ifeq "$(GhcWithInterpreter)" "YES"
321
HC_SPLIT_POST = $(LD) -r $(LD_X) -o $@ $(basename $@)_split/*.$(way_)o
322
323
else
HC_SPLIT_POST = touch $@
324
endif # GhcWithInterpreter == YES
325

326
327
SRC_HC_PRE_OPTS  += $(HC_SPLIT_PRE);
SRC_HC_POST_OPTS += $(HC_SPLIT_POST);
328

329
330
331
332
333
334
#
# If (Haskell) object files are split, cleaning up 
# consist of descending into the directories where
# the myriads of object files have been put.
#

335
extraclean ::
336
337
	$(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
338

339
endif # $(way) == u
340
endif # $(SplitObjs)
341
endif # $(HS_SRCS)
342

343
344
345
346
#
# Remove local symbols from library objects if requested.
#

347
ifeq "$(StripLibraries)" "YES"
rrt's avatar
rrt committed
348
ifeq "$(SplitObjs)" "YES"
349
SRC_HC_POST_OPTS += \
350
  for i in $(basename $@)_split/*; do \
351
	$(LD) -r $(LD_X) -o $$i.tmp $$i; \
352
353
354
355
	$(MV) $$i.tmp $$i; \
  done
else
SRC_HC_POST_OPTS += \
356
  $(LD) -r $(LD_X) -o $@.tmp $@; $(MV) $@.tmp $@
357
358
endif # SplitObjs
endif # StripLibraries
359

360
$(LIBRARY) : $(STUBOBJS) $(LIBOBJS)
361
	$(BUILD_LIB)
362
endif # LIBRARY = ""
363

sof's avatar
sof committed
364
365
366
#----------------------------------------
#	Building Win32 DLLs
#
367
368

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

rrt's avatar
rrt committed
371
ifneq "$(PACKAGE)" ""
372

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

ifneq "$(PACKAGE) $(IS_CBITS_LIB)" "std YES"
rrt's avatar
rrt committed
376
ifneq "$(PACKAGE)" "rts"
377
378
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
379
ifneq "$(PACKAGE)" "std"
380
381
382
383
384
  ifeq "$(IS_CBITS_LIB)" ""
  SRC_BLD_DLL_OPTS += -lHSstd_$(way_)imp -L$(GHC_LIB_DIR)/std 
  endif
endif
endif
rrt's avatar
rrt committed
385
386
endif

387
388
SRC_BLD_DLL_OPTS += -lgmp -L. -L$(GHC_RUNTIME_DIR)/gmp
ifeq "$(IS_CBITS_LIB)" ""
rrt's avatar
rrt committed
389
390
SRC_BLD_DLL_OPTS += $(patsubst %,-lHS%_$(way_)imp, $(PACKAGE_DEPS))
SRC_BLD_DLL_OPTS += $(patsubst %,-L../%, $(PACKAGE_DEPS))
391
392
endif
ifneq "$(HAS_CBITS)" ""
rrt's avatar
rrt committed
393
SRC_BLD_DLL_OPTS += -lHS$(PACKAGE)_cbits_imp -Lcbits
394
395
396
endif
SRC_BLD_DLL_OPTS += -lwsock32 -lwinmm

rrt's avatar
rrt committed
397
endif # PACKAGE != ""
398
399
400
401
402
403

SplitObjs = NO 

ifneq "$(LIBRARY)" ""

all :: DllVersionInfo.$(way_)o
sof's avatar
sof committed
404
405

ifeq "$(DLL_NAME)" ""
406
DLL_NAME = $(patsubst %.a,%.dll,$(subst lib,,$(LIBRARY)))
sof's avatar
sof committed
407
408
endif

rrt's avatar
rrt committed
409
ifneq "$(DLL_NAME)" ""
rrt's avatar
rrt committed
410
DLL_NAME := $(DLL_PEN)/$(DLL_NAME)
rrt's avatar
rrt committed
411
endif
rrt's avatar
rrt committed
412

sof's avatar
sof committed
413
414
all :: $(DLL_NAME)

sof's avatar
sof committed
415
ifeq "$(DLL_IMPLIB_NAME)" ""
416
DLL_IMPLIB_NAME = $(patsubst %.a,%_imp.a,$(LIBRARY))
sof's avatar
sof committed
417
418
endif

sof's avatar
sof committed
419
$(DLL_NAME) :: $(LIBRARY)
rrt's avatar
rrt committed
420
	$(BLD_DLL) --output-lib $(DLL_IMPLIB_NAME) -o $(DLL_NAME) $(LIBRARY) $(BLD_DLL_OPTS)
421
422
423
endif # LIBRARY != ""

endif # DLLized
sof's avatar
sof committed
424

sof's avatar
sof committed
425
426
427
428
429
430
#
# 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
431
#       version of binutils (to pick up windres bugfixes.)
sof's avatar
sof committed
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460

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
# 
461
DLL_OR_EXE=$(subst VersionInfo.$(way_)rc,,$@)
sof's avatar
sof committed
462
463
464
465
466
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)))

467
468
DllVersionInfo.$(way_)rc ExeVersionInfo.$(way_)rc:
	$(RM) DllVersionInfo.$(way_)rc
sof's avatar
sof committed
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
	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" >> $@

493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
#----------------------------------------
#	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 $).
#
533
534
535
ifeq "$(INTERP)" "$(SHELL)"
SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$(val)=\\\"$($(val))\\\";\" >> $@;")
else
536
SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$$\"\"$(val)=\\\"$($(val))\\\";\" >> $@;")
537
endif
538
539
540

all :: $(SCRIPT_PROG)

541
$(SCRIPT_PROG) : $(SCRIPT_OBJS)
542
543
	$(RM) $@
	@echo Creating $@...
sof's avatar
sof committed
544
ifeq "$(INTERP)" "perl"
sof's avatar
sof committed
545
	echo "#! "$(PERL) > $@
sof's avatar
sof committed
546
else
547
548
549
550
551
ifneq "$(INTERP)" ""
	@echo "#!"$(INTERP) > $@
else
	@touch $@
endif
sof's avatar
sof committed
552
endif
553
554
555
ifneq "$(SCRIPT_PREFIX_FILES)" ""
	@cat $(SCRIPT_PREFIX_FILES) >> $@
endif
556
ifneq "$(SCRIPT_SUBST)" ""
557
	@eval $(SCRIPT_SUBST) 
558
endif
559
560
	@cat $(SCRIPT_OBJS) >> $@
	@chmod a+x $@
sof's avatar
sof committed
561
	@echo Done.
562
563
endif

564
565
# ---------------------------------------------------------------------------
# Symbolic links
566

567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
# 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
591

sof's avatar
sof committed
592
#
593
# Don't want to overwrite $(LINK)s that aren't symbolic
594
# links. Testing for symbolic links is problematic to do in
sof's avatar
sof committed
595
596
597
# a portable fashion using a /bin/sh test, so we simply rely
# on perl.
#
598
599
600
601
602
$(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
603
	 else \
604
605
606
607
608
609
610
611
612
613
	   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
614
	@$(INSTALL_DIR) $(bindir)
615
616
617
618
619
620
621
	@if ( $(PERL) -e '$$fn="$(bindir)/$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
	   echo "Creating a symbol link from $(LINK_TARGET) to $(LINK) in $(bindir)"; \
	   $(RM) $(bindir)/$(LINK); \
	   $(LN_S) $(LINK_TARGET) $(bindir)/$(LINK); \
	 else \
	   echo "Creating a symbol link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \
	   echo "Perhaps remove \`$(bindir)/$(LINK)' manually?"; \
sof's avatar
sof committed
622
623
	   exit 1; \
	 fi;
624

625
endif # LINK 
626

sof's avatar
sof committed
627

628
629
630
631
632
633
634
635
636
###########################################
#
#	Targets: install install-strip uninstall
#
###########################################

# For each of these variables that is defined, you
# get one install rule
#
sof's avatar
sof committed
637
638
639
640
641
642
#	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)
643
644
645
646
647
648
649
650
#
# 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
651
.PHONY: install install-docs installdirs install-strip install-dirs uninstall install-docs show-install
sof's avatar
sof committed
652
653
654
655
656
657

show-install :
	@echo "bindir = $(bindir)"
	@echo "libdir = $(libdir)"
	@echo "libexecdir = $(libexecdir)  # by default, same as libdir"
	@echo "datadir = $(datadir)  # unused for ghc project"
658
659
660
661
662

#
# Sometimes useful to separate out the creation of install directories 
# from the installation itself.
#
sof's avatar
sof committed
663
install-dirs ::
sof's avatar
sof committed
664
665
666
667
	@$(INSTALL_DIR) $(bindir)
	@$(INSTALL_DIR) $(libdir)
	@$(INSTALL_DIR) $(libexecdir)
	@$(INSTALL_DIR) $(datadir)
668
669

# Better do this first...
sof's avatar
sof committed
670
671
672
# but we won't for the moment, do it on-demand from
# within the various install targets instead.
#install:: install-dirs
673
674

ifneq "$(INSTALL_PROGS)" ""
sof's avatar
sof committed
675
676
677
678
679
680
681
682
683
684

#
# 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
685
INSTALL_PROGS := $(foreach p, $(INSTALL_PROGS), $(addsuffix $(if $(suffix $(p)),,$(exeext)), $(basename $(p))))
sof's avatar
sof committed
686

687
install:: $(INSTALL_PROGS)
sof's avatar
sof committed
688
	@$(INSTALL_DIR) $(bindir)
sof's avatar
sof committed
689
	@for i in $(INSTALL_PROGS); do \
sof's avatar
sof committed
690
		    echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \
sof's avatar
sof committed
691
		    $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ;  \
sof's avatar
sof committed
692
	done
sof's avatar
sof committed
693
694
endif

sof's avatar
sof committed
695
696
697
698
#
# Just like INSTALL_PROGS, but prefix with install sites bin/lib/data and
# install without stripping.
#
sof's avatar
sof committed
699
700
ifneq "$(INSTALL_SCRIPTS)" ""
install:: $(INSTALL_SCRIPTS)
sof's avatar
sof committed
701
	@$(INSTALL_DIR) $(bindir)
sof's avatar
sof committed
702
	for i in $(INSTALL_SCRIPTS); do \
703
		$(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir); \
sof's avatar
sof committed
704
705
706
707
708
	done
endif

ifneq "$(INSTALL_LIB_SCRIPTS)" ""
install:: $(INSTALL_LIB_SCRIPTS)
sof's avatar
sof committed
709
	@$(INSTALL_DIR) $(libdir)
710
	for i in $(INSTALL_LIB_SCRIPTS); do \
711
		$(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir); \
sof's avatar
sof committed
712
	done
sof's avatar
sof committed
713
endif
714

715
716
ifneq "$(INSTALL_LIBEXEC_SCRIPTS)" ""
install:: $(INSTALL_LIBEXEC_SCRIPTS)
sof's avatar
sof committed
717
	@$(INSTALL_DIR) $(libexecdir)
718
	for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
719
		$(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir); \
720
721
722
	done
endif

723
724
ifneq "$(INSTALL_LIBS)" ""
install:: $(INSTALL_LIBS)
sof's avatar
sof committed
725
	@$(INSTALL_DIR) $(libdir)
sof's avatar
sof committed
726
	for i in $(INSTALL_LIBS); do \
sof's avatar
sof committed
727
728
729
		case $$i in \
		  *.a) \
		    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
730
		    $(RANLIB) $(libdir)/`basename $$i` ;; \
sof's avatar
sof committed
731
732
		  *.dll) \
		    $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
733
734
		  *.so) \
		    $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
sof's avatar
sof committed
735
736
737
		  *) \
		    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
		esac; \
sof's avatar
sof committed
738
	done
739
740
741
endif

ifneq "$(INSTALL_LIBEXECS)" ""
sof's avatar
sof committed
742
743
744
745
746
747
#
# 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))))

748
install:: $(INSTALL_LIBEXECS)
sof's avatar
sof committed
749
	@$(INSTALL_DIR) $(libexecdir)
sof's avatar
sof committed
750
	-for i in $(INSTALL_LIBEXECS); do \
sof's avatar
sof committed
751
		$(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \
sof's avatar
sof committed
752
	done
753
754
755
756
endif

ifneq "$(INSTALL_DATAS)" ""
install:: $(INSTALL_DATAS)
sof's avatar
sof committed
757
	@$(INSTALL_DIR) $(datadir)
sof's avatar
sof committed
758
759
760
	for i in $(INSTALL_DATAS); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
	done
761
762
endif

763
764
765
766
767
768
769
770
ifneq "$(INSTALL_DATAS_WITH_DIRS)" ""
install:: $(INSTALL_DATAS_WITH_DIRS)
	@$(INSTALL_DIR) $(datadir)
	for i in $(INSTALL_DATAS_WITH_DIRS); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir)/`dirname $$i`; \
	done
endif

771
772
773
774
775
776
777
778
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
779
780
781
ifneq "$(INSTALL_DOCS)" ""
install-docs:: $(INSTALL_DOCS)
	@$(INSTALL_DIR) $(datadir)	
rrt's avatar
rrt committed
782
783
784
	for i in $(INSTALL_DOCS); do \
		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
	done
rrt's avatar
rrt committed
785
786
787
788
789
790
791
endif

ifneq "$(INSTALL_SGML_DOC)" ""
ifneq "$(SGMLDocWays)" ""
install-docs:: $(foreach i,$(SGMLDocWays),$(INSTALL_SGML_DOC).$i)
	@$(INSTALL_DIR) $(datadir)	
	for i in $(SGMLDocWays); do \
rrt's avatar
rrt committed
792
		if [ $$i = "html" ]; then \
rrt's avatar
rrt committed
793
794
			$(CP) -r $(INSTALL_SGML_DOC) $(datadir); \
		else \
rrt's avatar
rrt committed
795
			$(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
rrt's avatar
rrt committed
796
797
798
		fi \
	done
endif
rrt's avatar
rrt committed
799
800
endif

801
802
803
804
#
# Use with care..
#
uninstall:: 
sof's avatar
sof committed
805
806
	@for i in $(INSTALL_PROGS) "" ; do			\
	  if test "$$i"; then 					\
807
808
		echo rm -f $(bindir)/`basename $$i`;		\
		rm -f $(bindir)/`basename $$i`;			\
sof's avatar
sof committed
809
	  fi; 							\
810
	done
sof's avatar
sof committed
811
812
	@for i in $(INSTALL_LIBS) ""; do			\
	  if test "$$i"; then 					\
813
814
		echo rm -f $(libdir)/`basename $$i`;		\
		rm -f $(libdir)/`basename $$i`;			\
sof's avatar
sof committed
815
	  fi;							\
816
	done
sof's avatar
sof committed
817
818
	@for i in $(INSTALL_LIBEXECS) ""; do			\
	  if test "$$i"; then 					\
819
820
		echo rm -f $(libexecdir)/`basename $$i`;	\
		rm -f $(libexecdir)/`basename $$i`;		\
sof's avatar
sof committed
821
	  fi;							\
822
	done
sof's avatar
sof committed
823
824
	@for i in $(INSTALL_DATAS) ""; do			\
	  if test "$$i"; then 					\
825
826
		echo rm -f $(datadir)/`basename $$i`;		\
		rm -f $(datadir)/`basename $$i`;		\
sof's avatar
sof committed
827
	  fi;							\
828
829
830
831
832
833
834
835
836
837
	done

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

838
##############################################################################
839
#
rrt's avatar
rrt committed
840
#	Targets: check tags show
841
#
842
##############################################################################
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859

#------------------------------------------------------------
# 			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
860
.PHONY: TAGS tags
861

sof's avatar
sof committed
862
tags TAGS:: $(TAGS_HS_SRCS) $(TAGS_C_SRCS)
863
864
	@$(RM) TAGS
	@touch TAGS
sof's avatar
sof committed
865
ifneq "$(TAGS_HS_SRCS)" ""
sof's avatar
sof committed
866
	$(HSTAGS) $(HSTAGS_OPTS) -- $(TAGS_HS_SRCS)
867
endif
sof's avatar
sof committed
868
ifneq "$(TAGS_C_SRCS)" ""
sof's avatar
sof committed
869
	etags -a $(TAGS_C_SRCS)
870
endif
sof's avatar
sof committed
871
	@( 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?
872
873
874
875
876
877
878
879

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

show:
880
	@echo '$(VALUE)="$($(VALUE))"'
881

882
################################################################################
883
#
884
885
886
887
#			SGML Documentation
#
################################################################################

888
.PHONY: dvi ps html pdf rtf
889

890
891
ifneq "$(SGML_DOC)" ""

rrt's avatar
rrt committed
892
893
all :: $(SGMLDocWays)

894
895
896
# multi-file SGML document: main document name is specified in $(SGML_DOC),
# sub-documents (.sgml files) listed in $(SGML_SRCS).

897
ifeq "$(SGML_SRCS)" ""
898
SGML_SRCS = $(wildcard *.sgml)
899
endif
900

chak's avatar
chak committed
901
902
903
904
905
906
SGML_TEX  = $(addsuffix .tex,$(SGML_DOC))
SGML_DVI  = $(addsuffix .dvi,$(SGML_DOC))
SGML_PS   = $(addsuffix .ps,$(SGML_DOC))
SGML_PDF  = $(addsuffix .pdf,$(SGML_DOC))
SGML_RTF  = $(addsuffix .rtf,$(SGML_DOC))
SGML_HTML = $(addsuffix .html,$(SGML_DOC))
907
# HTML output goes in a subdirectory on its own.
chak's avatar
chak committed
908
SGML_TEXT = $(addsuffix .txt,$(SGML_DOC))
909

sof's avatar
sof committed
910
$(SGML_DVI) $(SGML_PS) $(SGML_HTML) $(SGML_TEXT) $(SGML_PDF) :: $(SGML_SRCS)
911

912
913
dvi  :: $(SGML_DVI)
ps   :: $(SGML_PS)
914
915
916
pdf  :: $(SGML_PDF)
rtf  :: $(SGML_RTF)
html :: $(SGML_HTML)
917
txt  :: $(SGML_TEXT)
918

919
CLEAN_FILES += $(SGML_TEXT) $(SGML_TEX) $(SGML_PS) $(SGML_DVI) $(SGML_PDF) $(SGML_RTF) $(SGML_HTML) $(SGML_DOC)-*.html
920
# can't use $(SGML_SRCS) here, it was maybe used elsewhere
921

922
extraclean ::
923
924
	$(RM) -rf DBTOHTML_OUTPUT_*
	$(RM) -rf *.junk/
925
	$(RM) -rf $(SGML_DOC)
926
endif
927

928
##############################################################################
929
930
931
#
#	Targets: clean
#
932
##############################################################################
933

934
935
936
937
# 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.

938
.PHONY: mostlyclean clean distclean maintainer-clean
939
940
941
942

mostlyclean::
	rm -f $(MOSTLY_CLEAN_FILES)

943
944
# extraclean is used for adding actions to the clean target.
extraclean::
945

946
947
948
949
950
clean:: extraclean
	rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES)

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

952
maintainer-clean:: extraclean
953
954
	@echo 'This command is intended for maintainers to use; it'
	@echo 'deletes files that may need special tools to rebuild.'
955
	rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES) $(DIST_CLEAN_FILES) $(MAINTAINER_CLEAN_FILES)
956

957
################################################################################
958
959
960
#
#			Way management
#
961
################################################################################
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998

# 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
999
1000
1001
1002
1003
# $(suffix $@)     returns .p_o
# $(subst .,.p_o)  returns p_o
# $(subst _,.,p_o) returns p.o   (clever)
# $(basename p.o)  returns p
# 
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
$(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
1015

1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
# -------------------------------------------------------------------------
# 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

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
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
1054
1055
1056
1057
1058
1059
1060


##################################################################
#
# 		Recursive stuff
#
# This was once at the top of the file, allegedly because it was
1061
# needed for some targets, e.g. when building DLLs in libraries.  But
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
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
1110
1111
1112
1113
1114
1115
1116
1117
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
# 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.
#
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

#
# Selectively building subdirectories.
#
#
ifneq "$(SUBDIRS)" ""
$(SUBDIRS) ::
	  $(MAKE) -C $@ $(MFLAGS)
endif