Makefile 12.1 KB
Newer Older
1
############################################################################
2
3
4
5
6
#
#			fptools/Makefile
#
#		This is the main Makefile for fptools.
#
7
############################################################################
8

9
10
TOP=.
include $(TOP)/mk/boilerplate.mk
11

12
13
14
15
16
17
18
19
20
# find the projects that actually exist...
SUBDIRS = $(filter $(patsubst %/, %, $(wildcard */)), $(AllProjects))

# and filter only those that the user requested, if necessary
ifeq "$(ProjectsToBuild)" ""
Projects = $(SUBDIRS)
else
Projects = $(filter $(ProjectsToBuild), $(SUBDIRS))
endif
sof's avatar
sof committed
21

22
ifneq "$(Project)" ""
sof's avatar
sof committed
23
24
   include $(shell echo $(Project) | tr A-Z a-z)/mk/config.mk
endif
25

26
27
28
29
# -----------------------------------------------------------------------------
# Certain targets require that Project is set from the command line.

CURRENT_TARGET = $(MAKECMDGOALS)
30
31
32
33
34
35
project-check :
	@if [ "$(Project)" = "" ]; then \
		echo "	You need to set \"Project\" in order to make $(CURRENT_TARGET)"; \
		echo "	eg. make $(CURRENT_TARGET) Project=Ghc"; \
		exit 1; \
	fi
36

37
38
39
# -----------------------------------------------------------------------------
# Make sure configure is up-to-date

40
all install dist binary-dist :: configure
41
42
43
44
45
46
configure :: configure.in
	@echo "WARNING: configure needs to be regenerated.  Type"
	@echo "      make -f Makefile.config ./configure"
	@echo "and rerun make."
	@exit 16

47
# -----------------------------------------------------------------------------
48
49
# Making a binary distribution
#
50
# To make a particular binary distribution: 
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# set $(Project) to the name of the project, capitalised (eg. Ghc or Happy).

# `dist' `binary-dist'
#      Create a distribution tar file for this program. The tar file
#      should be set up so that the file names in the tar file start with
#      a subdirectory name which is the name of the package it is a
#      distribution for. This name can include the version number.
#
#      For example, the distribution tar file of GCC version 1.40 unpacks
#      into a subdirectory named `gcc-1.40'.
# 
#      The easiest way to do this is to create a subdirectory
#      appropriately named, use ln or cp to install the proper files in
#      it, and then tar that subdirectory.
# 
#      The dist target should explicitly depend on all non-source files
#      that are in the distribution, to make sure they are up to date in
#      the distribution. See Making Releases.
#
#	binary-dist is an FPtools addition for binary distributions
# 

binary-dist :: project-check
74

75
76
BIN_DIST_TMPDIR=$(FPTOOLS_TOP_ABS)
BIN_DIST_NAME=$(ProjectNameShort)-$(ProjectVersion)
77
78

#
79
# list of toplevel directories to include in binary distrib.
80
#
81
82
BIN_DIST_MAIN_DIR=$($(Project)MainDir)
BIN_DIST_DIRS=$($(Project)BinDistDirs)
83
84
85
86
87
88

binary-dist:: binary-dist-pre

BIN_DIST_TOP= distrib/Makefile-bin.in \
	      distrib/configure-bin.in \
	      distrib/INSTALL \
89
	      $(BIN_DIST_MAIN_DIR)/ANNOUNCE \
90
	      $(BIN_DIST_MAIN_DIR)/VERSION \
91
	      $(BIN_DIST_MAIN_DIR)/RELEASE \
92
	      $(BIN_DIST_MAIN_DIR)/LICENSE \
93
	      $(BIN_DIST_MAIN_DIR)/README \
sof's avatar
sof committed
94
95
96
	      glafp-utils/mkdirhier/mkdirhier \
	      install-sh \
	      config.guess \
sof's avatar
sof committed
97
98
	      config.sub   \
	      aclocal.m4
99

100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#
# binary-dist creates a binary bundle, set BIN_DIST_NAME
# to package name and do `make binary-dist Project=<project-name>'
# (normally this just a thing you would do from the toplevel of fptools)
#
.PHONY: binary-dist-pre binary-dist binary-pack

BIN_DIST_NAME=$(ProjectNameShort)-$(ProjectVersion)
BIN_DIST_TMPDIR=$(FPTOOLS_TOP_ABS)

binary-dist-pre::
	-rm -rf $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)
	-rm -f $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME).tar.gz
	@for i in $(BIN_DIST_DIRS); do 		 	 \
	  if test -d "$$i"; then 			 \
	   echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM); \
	   $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM); \
	   echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM); \
	   $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM); \
	   echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share; \
	   $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share; \
	   echo $(MAKE) -C $$i $(MFLAGS) install \
		prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
		exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
		bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM) \
		libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM) \
		libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM) \
		datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share; \
	   $(MAKE) -C $$i $(MFLAGS) install \
		prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
		exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
		bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM) \
		libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM) \
		libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM) \
		datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share; \
	  fi; \
	done

138
139
binary-dist::
	@for i in $(BIN_DIST_TOP); do \
140
	  if test -f "$$i"; then \
141
142
143
	     echo cp $$i $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME); \
	     cp $$i $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME); \
	  fi; \
144
	done;
145
146
147
148
149
150
151
152
153
154
155
156
157
	@echo "Configuring the Makefile for this project..."
	touch $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "package = $(ProjectNameShort)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "version = $(ProjectVersion)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "PACKAGE_SH_SCRIPTS = $($(Project)BinDistShScripts)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "PACKAGE_PRL_SCRIPTS = $($(Project)BinDistPrlScripts)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "PACKAGE_LIB_PRL_SCRIPTS = $($(Project)BinDistLibPrlScripts)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "PACKAGE_BINS = $($(Project)BinDistBins)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	echo "PACKAGE_LINKS = $($(Project)BinDistLinks)" >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	cat $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile-bin.in >> $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/Makefile.in
	@echo "Generating a shippable configure script.."
	$(MV) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/configure-bin.in $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/configure.in 
	( cd $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME); autoconf )
158
159
160
161
162
163
164
165
	if test -x $(BIN_DIST_MAIN_DIR)/mk/post-install-script ; then \
		cp $(BIN_DIST_MAIN_DIR)/mk/post-install-script \
			$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) ; \
	fi
	if test -x $(BIN_DIST_MAIN_DIR)/mk/post-inplace-script ; then \
		cp $(BIN_DIST_MAIN_DIR)/mk/post-inplace-script \
			$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) ; \
	fi
166
#
167
168
# binary dist'ing the documentation.  
# Which documentation to build/install is hardcoded below.
sof's avatar
sof committed
169
#
170

171
BINDIST_DOCS = $($(Project)BinDistDocs)
172
BINDIST_DOCS_WAYS = html ps
173
174
175

binary-dist ::
	@for way in $(BINDIST_DOCS_WAYS); do \
176
	   $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/$$way; \
177
	   for dir in $(BINDIST_DOCS); do \
178
	     echo Making $$way documentation in $$dir && \
179
180
	     $(MAKE) -C $$dir --no-print-directory $(MFLAGS) $$way >.doclog  2>&1 && \
	     if [ "$$way" = "html" ]; then \
181
		for subdir in `perl -n -e '/output will be in ([_\-A-Za-z0-9]*)/ && do { print "$$1 "; };' <.doclog`; do \
182
183
184
185
186
187
		   echo Copying HTML docs from $$subdir...; \
		   cp -Rf $$dir/$$subdir $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/$$way; \
		done \
	     else \
	        cp -f $$dir/*.$$way $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/$$way; \
	     fi && \
188
189
190
	     echo "Done."; \
	   done; \
	done
191
	@rm -f .doclog
sof's avatar
sof committed
192

193
194
# Rename scripts to $i.prl and $i.sh where necessary.
# ToDo: do this in a cleaner way...
sof's avatar
sof committed
195

196
ifneq "$($(Project)BinDistPrlScripts)" ""
sof's avatar
sof committed
197
binary-dist::
198
	@for i in $($(Project)BinDistPrlScripts); do \
sof's avatar
sof committed
199
	     echo "Renaming $$i to $$i.prl"; \
200
	    $(MV) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i  $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i.prl; \
201
	done
202
203
204
205
endif

ifneq "$($(Project)BinDistLibPrlScripts)" ""
binary-dist::
206
207
	@for i in $($(Project)BinDistLibPrlScripts); do \
	     echo "Renaming $$i to $$i.prl"; \
208
	    $(MV) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i  $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i.prl; \
209
	done
210
211
212
213
endif

ifneq "$($(Project)BinDistShScripts)" ""
binary-dist::
214
	@for i in $($(Project)BinDistShScripts); do \
215
	     echo "Renaming $$i to $$i.sh"; \
216
	    $(MV) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i  $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i.sh; \
sof's avatar
sof committed
217
	done
218
endif
219

220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
#
# Do this separately for now
# 
binary-pack::
	( cd $(BIN_DIST_TMPDIR); $(TAR) chzf $(BIN_DIST_NAME).tar.gz $(BIN_DIST_NAME) )

ifneq "$(way)" ""
package-way-dist::
	( cd $(BIN_DIST_TMPDIR); find $(BIN_DIST_NAME)/ \( -name "*$(_way).a" -o -name "*.$(way_)hi" \) -print | xargs tar cvf $(BIN_DIST_TMPDIR)/ghc-$(ProjectVersion)-$(way)-$(TARGETPLATFORM).tar )
	gzip $(BIN_DIST_TMPDIR)/ghc-$(ProjectVersion)-$(way)-$(TARGETPLATFORM).tar
endif

ifneq "$(way)" ""
remove-way-dist::
	( cd $(BIN_DIST_TMPDIR); find $(BIN_DIST_NAME)/ \( -name "*$(_way).a" -o -name "*.$(way_)hi" \) -print -exec rm -f {} \; )
endif

binary-dist::
	@echo "Mechanical and super-natty! Inspect the result and *if* happy; freeze, sell and get some sleep!"

# -----------------------------------------------------------------------------
241
242
243
244
# Building source distributions
#
# Do it like this: 
#
245
#	$ make
246
#	$ make dist Project=Ghc
247
248
249
#
# WARNING: `make dist' calls `make distclean' before tarring up the tree.
#
250
251
252
253
254
255
256
257
258
259
260

.PHONY: dist

#
# Directory in which we're going to build the src dist
#
SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)

#
# Files to include in source distributions
#
261
SRC_DIST_DIRS += docs distrib $(Projects)
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
SRC_DIST_FILES += \
	configure.in config.guess config.sub configure \
	aclocal.m4 acconfig.h README Makefile install-sh \
	mk/boilerplate.mk mk/config.h.in mk/config.mk.in mk/opts.mk \
	mk/paths.mk mk/suffix.mk mk/target.mk

dist dist-manifest dist-package :: project-check

# clean the tree first, leaving certain extra files in place (eg. configure)
dist :: distclean

dist ::
	-rm -rf $(SRC_DIST_DIR)
	-rm -f $(SRC_DIST_NAME).tar.gz
	mkdir $(SRC_DIST_DIR)
	mkdir $(SRC_DIST_DIR)/mk
	( cd $(FPTOOLS_TOP_ABS); $(FIND) $(SRC_DIST_DIRS) -type d \( -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -exec mkdir $(SRC_DIST_DIR)/{} \; \) ; )
	( cd $(FPTOOLS_TOP_ABS); $(FIND) $(SRC_DIST_DIRS) $(SRC_DIST_FILES) -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -name "*~" -prune -o -name ".cvsignore" -prune -o -name "\#*" -prune -o -name ".\#*" -prune -o -name "log" -prune -o -name "*-SAVE" -prune -o -name "*.orig" -prune -o -name "*.rej" -prune -o ! -type d -exec $(LN_S) $(FPTOOLS_TOP_ABS)/{} $(SRC_DIST_DIR)/{} \; )

# Automatic generation of a MANIFEST file for a source distribution
# tree that is ready to go.
dist-manifest ::
rrt's avatar
rrt committed
284
	cd $(SRC_DIST_DIR); $(FIND) . \( -type l -o -type f \) -exec ls -lLG {} \; | sed -e 's/\.\///' > MANIFEST.tmp ; mv MANIFEST.tmp MANIFEST
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301

dist-package :: dist-package-tar-gz

SRC_DIST_PATHS = $(patsubst %, $(SRC_DIST_NAME)/%, $(SRC_DIST_FILES) $(SRC_DIST_DIRS))

dist-package-tar-gz ::
	$(TAR) chzf $(SRC_DIST_NAME)-src.tar.gz $(SRC_DIST_NAME)

dist-package-zip ::
	cd ..; $(LN_S) $(FPTOOLS_TOP_ABS) $(SRC_DIST_NAME) && \
	       $(ZIP) $(ZIP_OPTS) -r $(SRC_DIST_NAME)-src.zip $(SRC_DIST_PATHS)

# -----------------------------------------------------------------------------

DIST_CLEAN_FILES += config.cache config.status

MAINTAINER_CLEAN_FILES += configure
302

303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
all ::
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
	for i in $(Projects); do \
	   if [ -d $$i ]; then \
	      $(MAKE) -C $$i boot all; \
	      if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
	      fi; \
	done

boot ::
	@echo "Please use \`make all' only from the top-level, or \`make boot' followed"
	@echo "by \`make all' in an individual project subdirectory (ghc, hslibs etc.)."

install ::
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
318
	for i in $(filter-out $(ProjectsDontInstall), $(Projects)); do \
319
	   if [ -d $$i ]; then \
320
	      $(MAKE) -C $$i install; \
321
322
323
324
325
	      if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
	      fi; \
	done

NO_ALL_TARGETS=YES
326
327
include $(TOP)/mk/target.mk

328
329
# -----------------------------------------------------------------------------