package.mk 12.2 KB
Newer Older
1
# -----------------------------------------------------------------------------
2
# $Id: package.mk,v 1.55 2005/05/13 10:05:33 krasimir Exp $
3
4
5

ifneq "$(PACKAGE)" ""

6
# FIXME: does anyone do this any more?
7
8
STANDALONE_PACKAGE = NO

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -----------------------------------------------------------------------------
# Directory layouts, installation etc.

# Here Windows & Unix differ.  On Windows, the value of $(prefix) is known
# to the compiler, and spliced into package.conf in place of $topdir at
# runtime.
#
# On Unix, we only use absolute paths in package.conf, except that when
# building a binary distribution we use $libdir and $datadir in package.conf
# which are then replaced by the correct values at install time.
#

ifeq "$(Windows)" "YES"

PKG_LIBDIR  = $$topdir
PKG_DATADIR = $$topdir

else

ifeq "$(BIN_DIST)" ""
PKG_LIBDIR  = $(libdir)
PKG_DATADIR = $(datadir)
else
PKG_LIBDIR  = $$libdir
PKG_DATADIR = $$datadir
endif

endif # Unix

IMPORT_DIR_INSTALLED = $(PKG_LIBDIR)/imports
IMPORT_DIR_INPLACE   = $(FPTOOLS_TOP_ABS)/libraries/$(PACKAGE)

41
INCLUDE_DIR_INSTALLED = $(PKG_LIBDIR)/include
42
43
44
45
46
47
48
49
50
51
52
53
54
55
INCLUDE_DIR_INPLACE   = $(FPTOOLS_TOP_ABS)/libraries/$(PACKAGE)/include

LIB_DIR_INSTALLED    = $(PKG_LIBDIR)
LIB_DIR_INPLACE	     = $(FPTOOLS_TOP_ABS)/libraries/$(PACKAGE)

DATA_DIR_INSTALLED   = $(PKG_DATADIR)
DATA_DIR_INPLACE     = $(FPTOOLS_TOP_ABS)/libraries/$(PACKAGE)

HTML_DIR_INPLACE     = $(FPTOOLS_TOP_ABS)/libraries/$(PACKAGE)/html
HTML_DIR_INSTALLED   = $(PKG_DATADIR)/html/libraries/$(PACKAGE)

HADDOCK_IFACE_INPLACE   = $(HTML_DIR_INPLACE)/$(PACKAGE).haddock
HADDOCK_IFACE_INSTALLED = $(HTML_DIR_INSTALLED)/$(PACKAGE).haddock

56
57
58
# -----------------------------------------------------------------------------
# Build the package configuration file and tell the compiler about it.

59
60
61
# We want to build two versions of the package configuration: one for use
# in the 

62
63
ifeq "$(way)" ""

64
ifeq "$(STANDALONE_PACKAGE)" "NO"
65
PACKAGE_CPP_OPTS += -I$(GHC_INCLUDE_DIR) -Iinclude
66
else
67
PACKAGE_CPP_OPTS += -Iinclude
68
69
endif

70
71
72
PACKAGE_CPP_OPTS += -DPACKAGE=${PACKAGE}
PACKAGE_CPP_OPTS += -DVERSION=${VERSION}

73
74
PACKAGE_CPP_OPTS += -DPKG_LIBDIR='"$(PKG_LIBDIR)"'
PACKAGE_CPP_OPTS += -DPKG_DATADIR='"$(PKG_DATADIR)"'
75

ross's avatar
ross committed
76
package.conf.inplace   : package.conf.in
77
78
79
	$(CPP) $(RAWCPP_FLAGS) -P \
		-DIMPORT_DIR='"$(IMPORT_DIR_INPLACE)"' \
		-DLIB_DIR='"$(LIB_DIR_INPLACE)"' \
80
81
82
83
		-DINCLUDE_DIR='"$(INCLUDE_DIR_INPLACE)"' \
		-DDATA_DIR='"$(DATA_DIR_INPLACE)"' \
		-DHTML_DIR='"$(HTML_DIR_INPLACE)"' \
		-DHADDOCK_IFACE='"$(HADDOCK_IFACE_INPLACE)"' \
84
		-DFPTOOLS_TOP_ABS='"${FPTOOLS_TOP_ABS}"' \
85
		-x c $(PACKAGE_CPP_OPTS) $< | \
86
	grep -v '^#pragma GCC' | \
87
	sed -e 's/""//g' -e 's/:[ 	]*,/: /g' >$@
88

ross's avatar
ross committed
89
package.conf.installed : package.conf.in
90
91
92
	$(CPP) $(RAWCPP_FLAGS) -P -DINSTALLING \
		-DIMPORT_DIR='"$(IMPORT_DIR_INSTALLED)"' \
		-DLIB_DIR='"$(LIB_DIR_INSTALLED)"' \
93
94
95
96
		-DINCLUDE_DIR='"$(INCLUDE_DIR_INSTALLED)"' \
		-DDATA_DIR='"$(DATA_DIR_INSTALLED)"' \
		-DHTML_DIR='"$(HTML_DIR_INSTALLED)"' \
		-DHADDOCK_IFACE='"$(HADDOCK_IFACE_INSTALLED)"' \
97
		 -x c $(PACKAGE_CPP_OPTS) $< | \
98
	grep -v '^#pragma GCC' | \
99
	sed -e 's/""//g' -e 's/:[ 	]*,/: /g' >$@
reid's avatar
reid committed
100

101
# we could be more accurate here and add a dependency on
102
# driver/package.conf, but that doesn't work too well because of
103
104
105
106
107
# make's limited accuracy with modification times: when doing 'make
# boot' in multiple packages, make won't detect that the package
# configuration needs updating if it was updated already in the last
# second.
#
108
109
110
111
# The stamp file goes in $(GHC_DRIVER_DIR), so that if someone happens
# to 'make clean' in ghc without cleaning in libraries too, the packages
# will be correctly re-installed.
#
112
113
ifeq "$(STANDALONE_PACKAGE)" "NO"

114
STAMP_PKG_CONF = $(GHC_DRIVER_DIR)/stamp-pkg-conf-$(PACKAGE)
115
116
CLEAN_FILES += $(STAMP_PKG_CONF)

117
ifneq "$(BootingFromHc)" "YES"
118
boot all :: $(STAMP_PKG_CONF)
119
endif
120

ross's avatar
ross committed
121
$(STAMP_PKG_CONF) : package.conf.inplace package.conf.installed
122
123
	$(GHC_PKG_INPLACE) --force --update-package <package.conf.inplace
	$(GHC_PKG_INPLACE)  -f $(GHC_DRIVER_DIR)/package.conf --force --update-package <package.conf.installed
124
	@touch $(STAMP_PKG_CONF)
125

ross's avatar
ross committed
126
CLEAN_FILES += package.conf.installed package.conf.inplace 
127

128
129
else # $(STANDALONE_PACKAGE) == "YES"

ross's avatar
ross committed
130
PACKAGE_CPP_OPTS += -DPACKAGE_DEPS='$(subst " ","$(comma) ",$(patsubst %,"%",$(PACKAGE_DEPS)))'
reid's avatar
reid committed
131
132
133
PACKAGE_CPP_OPTS += -DLIBRARY=\"HS$(PACKAGE)\"
PACKAGE_CPP_OPTS += -DLIBDIR=\"$(libdir)\"

134
135
136
137
# Let the package configuration file refer to $(libdir) as
# ${pkglibdir}.  Note we can't use ${libdir} because ghc-pkg already
# redefines it to point to GHC's libdir (bug or feature?).
#
138
139
140
141
142
143
install :: package.conf.installed
	$(GHC_PKG) --force --update-package <package.conf.installed

# Invoke this rule by hand in order to use the package in-place
install-inplace-pkg : package.conf.inplace
	$(GHC_PKG) --force --update-package <package.conf.inplace
144
145
146

endif # $(STANDALONE_PACKAGE)

147
148
149
150
151
152
153
endif # $(way) == ""

# -----------------------------------------------------------------------------
# Building the static library libHS<pkg>.a

SRC_HSC2HS_OPTS += -I.

154
155
ifeq "$(STANDALONE_PACKAGE)" "NO"
HC = $(GHC_INPLACE)
156
IGNORE_PACKAGE_FLAG = -package-name  $(PACKAGE)-$(VERSION)
157
else
sof's avatar
sof committed
158
159
# Only use -ignore-package if supported by HC; i.e., ghc-6.3 and later.
# (Don't like the use of slow $(shell ..) in Makefiles, but can't see a way around it here.)
160
ifeq "$(strip $(GHC))" ""
161
IGNORE_PACKAGE_FLAG = -ignore-package $(PACKAGE)
sof's avatar
sof committed
162
163
else
# Making the assumption here that standalone packages will be using mk/config.mk:GHC
164
IGNORE_PACKAGE_FLAG = $(shell if (test $(GhcCanonVersion) -ge 603); then echo "-ignore-package"; else echo "-package-name"; fi) $(PACKAGE)
165
endif 
166
167
endif # STANDALONE_PACKAGE

168
ifeq "$(NON_HS_PACKAGE)" ""
169
SRC_HC_OPTS	+= $(IGNORE_PACKAGE_FLAG)
170
171
SRC_HC_OPTS 	+= $(GhcLibHcOpts)
SRC_HC_OPTS     += $(patsubst %, -package %, $(PACKAGE_DEPS))
172
endif
173

174
175
176
177
178
179
180
181
#	-fgenerics switches on generation of support code for 
#		derivable type classes.  This is now off by default,
#		but we switch it on for the libraries so that we generate
#		the code in case someone importing wants it.
ifeq "$(NON_HS_PACKAGE)" ""
SRC_HC_OPTS	+= -fgenerics
endif

sof's avatar
sof committed
182
ifndef LIBRARY
183
LIBRARY      	= libHS$(PACKAGE)$(_way).a
sof's avatar
sof committed
184
endif
185

186
187
188
ifeq "$(WAYS)" ""
WAYS = $(GhcLibWays)
endif
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206

all :: $(LIBRARY)

# POSSIBLE alternative version using --make:
#
# lib : $(HS_SRCS)
# 	$(GHC_INPLACE) $(HC_OPTS) --make $(HS_SRCS)
# 
# $(LIBNAME) : lib
# 	$(RM) $@
# 	$(AR) $(AR_OPTS) $@ $(HS_OBJS)
# 	$(RANLIB) $@
# 
# %.o : %.hs
# 	$(GHC_INPLACE) $(HC_OPTS) --make $<
# %.o : %.lhs
# 	$(GHC_INPLACE) $(HC_OPTS) --make $<

207
208
# -----------------------------------------------------------------------------
# Installation; need to install .hi files as well as libraries
209
210
211
212
213
214

ifeq "$(DLLized)" "YES"
INSTALL_PROGS += $(DLL_NAME)
INSTALL_LIBS += $(patsubst %.a,%_imp.a, $(LIBRARY))
endif

215
216
# The interface files are put inside the $(libdir), since they
# might (potentially) be platform specific..
217

218
219
220
221
222
ifeq "$(HIERARCHICAL_LIB)" "YES"
ifacedir = $(libdir)/imports
else
ifacedir = $(libdir)/hslibs-imports/$(PACKAGE)
endif
223

224
225
226
# If the lib consists of a hierachy of modules, we must retain the directory
# structure when we install the interfaces.
ifeq "$(HIERARCHICAL_LIB)" "YES"
227
INSTALL_IFACES_WITH_DIRS += $(HS_IFACES)
228
ifneq "$(ALL_DIRS)" ""
229
230
install ::
	@for i in $(ALL_DIRS); do \
231
		$(INSTALL_DIR) $(ifacedir)/$$i; \
232
	done
233
endif
234
else
235
INSTALL_IFACES += $(HS_IFACES)
236
237
endif

238
239
240
# -----------------------------------------------------------------------------
# Dependencies

241
ifeq "$(STANDALONE_PACKAGE)" "NO"
242
MKDEPENDHS = $(GHC_INPLACE)
243
244
245
246
247
248
249
endif

SRC_MKDEPENDC_OPTS += $(addprefix -I,$(ALL_DIRS))

ifeq "$(STANDALONE_PACKAGE)" "NO"
SRC_MKDEPENDC_OPTS += -I$(GHC_INCLUDE_DIR)
endif
250

251
252
endif # $(PACKAGE) != ""

253
254
255
256
257
258
259
#--------------------------------------------------------------
# Installation

ifneq "$(NO_INSTALL_LIBRARY)" "YES"
INSTALL_LIBS  += $(LIBRARY) $(GHCI_LIBRARY)
endif

260
261
262
#--------------------------------------------------------------
# Building dynamically-linkable libraries for GHCi
#
263
# Build $(GHCI_LIBRARY) whenever we build $(LIBRARY)
264
265
266
267
268
269
#
# Why?  GHCi can only link .o files (at the moment), not .a files
# so we have to build libFoo.o as well as libFoo.a
#
# Furthermore, GHCi currently never loads 
# profiling libraries (or other non-std ways)
270
271

ifneq "$(LIBRARY)" ""
272
273
274
275

ifeq "$(way)" ""
ifeq "$(GhcWithInterpreter)" "YES"

sof's avatar
sof committed
276
ifndef GHCI_LIBRARY
277
GHCI_LIBRARY = $(patsubst lib%.a,%.o,$(LIBRARY))
sof's avatar
sof committed
278
endif
279

280
ifneq "$(NO_INSTALL_LIBRARY)" "YES"
281
INSTALL_LIBS += $(GHCI_LIBRARY)
282
endif
283

284
285
286
287
288
289
290
291
292
293
CLEAN_FILES  += $(GHCI_LIBRARY)

all :: $(GHCI_LIBRARY)

ifneq "$(DONT_WANT_STD_GHCI_LIB_RULE)" "YES"
# If you don't want to build GHCI_LIBRARY the 'standard' way,
# set DONT_WANT_STD_GHCI_LIB_RULE to YES. The Prelude and
# hslibs/Win32 uses this 'feature', which will go away soon
# when we can use a "fixed" ld.
#
294
$(GHCI_LIBRARY) : $(LIBOBJS)
295
	$(LD) -r $(LD_X) -o $@ $(STUBOBJS) $(LIBOBJS)
296
297
298
299
300

endif # DONT_WANT_STD_GHCI_LIB_RULE
endif # GhcWithInterpreter
endif # way

301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
ifeq "$(GhcBuildDylibs)" "YES"

    # Build dynamic libraries.
    # Currently, this is a hack. Anyone, PLEASE clean it up.

    # For now, we pretend that there are two operating systems in the world;
    # Darwin, and Everything Else. Furthermore, we pretend that Everything Else
    # behaves like Linux.
    
ifeq "$(darwin_TARGET_OS)" "1"
    # Darwin: Shared libraries end in .dylib
DYLD_LIBRARY = $(patsubst %.a,%_dyn.dylib,$(LIBRARY))

    # About the options used for Darwin:
    # -dynamiclib
    #   Apple's way of saying -shared
    # -flat_namespace -undefined suppress:
    #   Without these options, we'd have to specify the correct dependencies
    #   for each of the dylibs. Twolevel namespaces are in general a good thing
    #   (they make things more robust), so we should fix this sooner or later.
    # -install_name
    #   Causes the dynamic linker to ignore the DYLD_LIBRARY_PATH when loading
    #   this lib and instead look for it at its absolute path.
    #   When installing the .dylibs (see target.mk), we'll change that path to
    #   point to the place they are installed.
    #   Note: I'm not yet sure about this, but I think it will be convenient for
    #         users not to have to set up DYLD_LIBRARY_PATH to point to the GHC
    #         library dir. -- Wolfgang
329

330
331
332
333
334
335
336
337
338
$(DYLD_LIBRARY) : $(LIBOBJS) $(STUBOBJS)
	$(CC) -dynamiclib -o $@ $(STUBOBJS) $(LIBOBJS) -flat_namespace -undefined suppress -install_name `pwd`/$@
else
DYLD_LIBRARY = $(patsubst %.a,%_dyn.so,$(LIBRARY))

$(DYLD_LIBRARY) : $(LIBOBJS) $(STUBOBJS)
	$(CC) -shared -o $@ $(STUBOBJS) $(LIBOBJS)
endif

339
ifneq "$(NO_INSTALL_LIBRARY)" "YES"
340
INSTALL_LIBS += $(DYLD_LIBRARY)
341
342
endif

343
344
345
346
CLEAN_FILES += $(DYLD_LIBRARY)

all :: $(DYLD_LIBRARY)

347
endif # $(GhcBuildDylibs) == "YES"
348

349
endif # $(LIBRARY) /= ""
350

351
352
353
# -----------------------------------------------------------------------------
# Doc building with Haddock

354
ifneq "$(PACKAGE)" ""
355
356
ifneq "$(NO_HADDOCK_DOCS)" "YES"

Dinko Tenev's avatar
Dinko Tenev committed
357
HS_PPS = $(addsuffix .raw-hs, $(basename $(filter-out $(EXCLUDED_HADDOCK_SRCS), $(HS_SRCS)))) $(EXTRA_HADDOCK_SRCS)
358

359
HTML_DIR = ../html/$(PACKAGE)
360
HTML_DOC = $(HTML_DIR)/haddock.css $(HTML_DIR)/haddock.js
361
362

ifneq "$(HS_PPS)" ""
363

364
CLEAN_FILES += $(HS_PPS) $(addsuffix .tmp, $(HS_SRCS))
365

366
367
368
369
370
371
372
ifeq "$(HADDOCK)" ""
html ::
	@echo Haddock must be installed in order to build HTML library documentation.
	@echo Please install Haddock and re-configure.
	@exit 1
endif

373
374
html :: $(HTML_DOC)

375
376
377
extraclean :: 
	$(RM) -rf $(HTML_DIR)

378
$(HTML_DOC) : $(HS_PPS)
379
	@$(INSTALL_DIR) $(HTML_DIR)
380
	$(HADDOCK) $(HADDOCK_OPTS) -h -o $(HTML_DIR) $(HS_PPS) \
381
		--package=$(PACKAGE) \
382
		--dump-interface=$(PACKAGE).haddock \
383
		--use-index=../doc-index.html --use-contents=../index.html \
384
385
		$(foreach pkg, $(PACKAGE_DEPS), \
		   --read-interface=../$(pkg),../$(pkg)/$(pkg).haddock)
386

387
388
CLEAN_FILES += $(PACKAGE).haddock

389
%.raw-hs : %.lhs
390
	$(HC) $(HC_OPTS) -D__HADDOCK__ -E -optP-P $< -o $@
391
392

%.raw-hs : %.hs
393
	$(HC) $(HC_OPTS) -D__HADDOCK__ -E -optP-P $< -o $@
394

395
396
397
HTML_INSTALL_DIR = $(datadir)/html/libraries/$(PACKAGE)
#  NOT the same as HTML_DIR_INSTALLED when BIN_DIST is on

398
install-docs :: $(HTML_DOC)
399
	@$(INSTALL_DIR) $(HTML_INSTALL_DIR)
400
401
402
403
404
	for i in $(HTML_DIR)/*; do \
	  echo $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(HTML_INSTALL_DIR); \
	  $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(HTML_INSTALL_DIR); \
	done; \
	$(INSTALL_DATA) $(INSTALL_OPTS) $(PACKAGE).haddock $(HTML_INSTALL_DIR); \
405
406

endif # HS_PPS
407
endif # NO_HADDOCK_DOCS
408
endif # $(PACKAGE) /= ""
409
410
411

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