build-package-way.mk 4.31 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
# -----------------------------------------------------------------------------
#
# (c) 2009 The University of Glasgow
#
# This file is part of the GHC build system.
#
# To understand how the build system works and how to modify it, see
#      http://hackage.haskell.org/trac/ghc/wiki/Building/Architecture
#      http://hackage.haskell.org/trac/ghc/wiki/Building/Modifying
#
# -----------------------------------------------------------------------------

Ian Lynagh's avatar
Ian Lynagh committed
13
14
15

define build-package-way # $1 = dir, $2 = distdir, $3 = way, $4 = stage

16
$(call distdir-way-opts,$1,$2,$3,$4)
Ian Lynagh's avatar
Ian Lynagh committed
17
18
19
20
21
22
$(call hs-suffix-rules,$1,$2,$3)
$$(foreach dir,$$($1_$2_HS_SRC_DIRS),\
  $$(eval $$(call hs-suffix-rules-srcdir,$1,$2,$3,$$(dir))))

$(call hs-objs,$1,$2,$3)

23
24
25
# The .a/.so library file, indexed by two different sets of vars:
# the first is indexed by the dir, distdir and way
# the second is indexed by the package id, distdir and way
26
$1_$2_$3_LIB = $1/$2/build/libHS$$($1_PACKAGE)-$$($1_$2_VERSION)$$($3_libsuf)
27
28
$$($1_PACKAGE)-$($1_$2_VERSION)_$2_$3_LIB = $$($1_$2_$3_LIB)

29
30
31
32
33
34
35
36
37
# hack: the DEPS_LIBS mechanism assumes that the distdirs for packges
# that depend on each other are the same, but that is not the case for
# ghc where we use stage1/stage2 rather than dist/dist-install.
# Really we should use a consistent scheme for distdirs, but in the
# meantime we work around it by defining ghc-<ver>_dist-install_way_LIB:
ifeq "$$($1_PACKAGE) $2" "ghc stage2"
$$($1_PACKAGE)-$($1_$2_VERSION)_dist-install_$3_LIB = $$($1_$2_$3_LIB)
endif

38
39
# All the .a/.so library file dependencies for this library
$1_$2_$3_DEPS_LIBS=$$(foreach dep,$$($1_$2_DEPS),$$($$(dep)_$2_$3_LIB))
Ian Lynagh's avatar
Ian Lynagh committed
40

Ian Lynagh's avatar
Ian Lynagh committed
41
ifneq "$$(BootingFromHc)" "YES"
42
$1_$2_$3_MKSTUBOBJS = $$(FIND) $1/$2/build -name "*_stub.$$($3_osuf)" -print
Ian Lynagh's avatar
Ian Lynagh committed
43
44
# HACK ^^^ we tried to use $(wildcard), but apparently it fails due to
# make using cached directory contents, or something.
Ian Lynagh's avatar
Ian Lynagh committed
45
46
else
$1_$2_$3_MKSTUBOBJS = true
47
$1_$2_$3_C_OBJS += $$(shell $$(FIND) $1/$2/build -name "*_stub.c" -print | sed 's/c$$$$/o/')
Ian Lynagh's avatar
Ian Lynagh committed
48
endif
Ian Lynagh's avatar
Ian Lynagh committed
49

50
51
52
$1_$2_$3_NON_HS_OBJS = $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS)  $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS)
$1_$2_$3_ALL_OBJS = $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_NON_HS_OBJS)

53
ifeq "$3" "dyn"
54

55
# Link a dynamic library
56
# On windows we have to supply the extra libs this one links to when building it.
57
ifeq "$$(HOSTPLATFORM)" "i386-unknown-mingw32"
58
59
60
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS) $$(ALL_RTS_LIBS) $$($1_$2_$3_DEPS_LIBS)
	"$$($1_$2_HC)" $$($1_$2_$3_ALL_OBJS) \
         `$$($1_$2_$3_MKSTUBOBJS)` \
61
         -shared -dynamic -dynload deploy \
62
	 $$(addprefix -l,$$($1_$2_EXTRA_LIBRARIES)) \
63
64
65
         -no-auto-link-packages $$(addprefix -package,$$($1_$2_DEPS)) \
         -o $$@
else
66
67
68
69
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS) $$(ALL_RTS_LIBS) $$($1_$2_$3_DEPS_LIBS)
	"$$($1_$2_HC)" $$($1_$2_$3_ALL_OBJS) \
         `$$($1_$2_$3_MKSTUBOBJS)` \
         -shared -dynamic -dynload deploy \
70
	     -dylib-install-name $(ghclibdir)/`basename "$$@" | sed 's/^libHS//;s/[-]ghc.*//'`/`basename "$$@"` \
71
72
73
74
         -no-auto-link-packages $$(addprefix -package,$$($1_$2_DEPS)) \
         -o $$@
endif
else
Ian Lynagh's avatar
Ian Lynagh committed
75
# Build the ordinary .a library
76
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS)
77
78
79
80
	"$$(RM)" $$(RM_OPTS) $$@ $$@.contents
ifeq "$$($1_$2_SplitObjs)" "YES"
	$$(FIND) $$(patsubst %.$$($3_osuf),%_$$($3_osuf)_split,$$($1_$2_$3_HS_OBJS)) -name '*.$$($3_osuf)' -print >> $$@.contents
	echo $$($1_$2_$3_NON_HS_OBJS) `$$($1_$2_$3_MKSTUBOBJS)` >> $$@.contents
Ian Lynagh's avatar
Ian Lynagh committed
81
else
82
	echo $$($1_$2_$3_ALL_OBJS) `$$($1_$2_$3_MKSTUBOBJS)` >> $$@.contents
Ian Lynagh's avatar
Ian Lynagh committed
83
endif
84
85
	"$$(AR)" $$(AR_OPTS) $$(EXTRA_AR_ARGS) $$@ @$$@.contents
	"$$(RM)" $$(RM_OPTS) $$@.contents
86
endif
Ian Lynagh's avatar
Ian Lynagh committed
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

$(call all-target,$1_$2,all_$1_$2_$3)
$(call all-target,$1_$2_$3,$$($1_$2_$3_LIB))

# Don't put bootstrapping packages in the bindist
ifneq "$4" "0"
BINDIST_HI += $$($1_$2_$3_HI)
BINDIST_LIBS += $$($1_$2_$3_LIB)
endif

# Build the GHCi library
ifeq "$3" "v"
$1_$2_GHCI_LIB = $1/$2/build/HS$$($1_PACKAGE)-$$($1_$2_VERSION).$$($3_osuf)
# Don't put bootstrapping packages in the bindist
ifneq "$4" "0"
BINDIST_LIBS += $$($1_$2_GHCI_LIB)
endif
104
105
$$($1_$2_GHCI_LIB) : $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS)
	"$$(LD)" -r -o $$@ $$(EXTRA_LD_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) `$$($1_$2_$3_MKSTUBOBJS)` $$($1_$2_EXTRA_OBJS)
Ian Lynagh's avatar
Ian Lynagh committed
106
107
108
109
110
111

$(call all-target,$1_$2,$$($1_$2_GHCI_LIB))
endif

endef