build-package-way.mk 4.37 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
57
# On windows we have to supply the extra libs this one links to when building it.
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
76
# Build the ordinary .a library
ifeq "$$($1_$2_SplitObjs)" "YES"
77
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS)
78
	"$$(RM)" $$(RM_OPTS) $$@
79
	(echo $$($1_$2_$3_NON_HS_OBJS) `$$($1_$2_$3_MKSTUBOBJS)`; $$(FIND) $$(patsubst %.$$($3_osuf),%_$$($3_osuf)_split,$$($1_$2_$3_HS_OBJS)) -name '*.$$($3_osuf)' -print) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR)" $$(AR_OPTS) $$(EXTRA_AR_ARGS) $$@
Ian Lynagh's avatar
Ian Lynagh committed
80
else
81
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS)
82
	"$$(RM)" $$(RM_OPTS) $$@
83
	echo $$($1_$2_$3_ALL_OBJS) `$$($1_$2_$3_MKSTUBOBJS)` | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR)" $$(AR_OPTS) $$(EXTRA_AR_ARGS) $$@
Ian Lynagh's avatar
Ian Lynagh committed
84
endif
85
endif
Ian Lynagh's avatar
Ian Lynagh committed
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

$(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
103
104
$$($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
105
106
107
108
109
110

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

endef