build-package.mk 4.6 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 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

# Build a package with the stage-1 compiler, multiple ways.  A typical
# libraries/foo/ghc.mk will look like this:
#
# $(eval $(call build-package,libraries/base,dist-install))
#
# The package metadata is generated from the .cabal file and placed in
# package-data.mk.  It will look something like this:
#
# libraries/base_dist_MODULES = GHC.Base Data.Tuple ...
# libraries/base_dist_PACKAGE = base
# libraries/base_dist_VERSION = 4.0.0.0
# libraries/base_dist_HC_OPTS = -package ghc-prim-0.1.0.0 -XRank2Types ...
# libraries/base_dist_C_SRCS  = cbits/PrelIOUtils.c ...
# libraries/base_dist_S_SRCS  = cbits/foo.S ...
# libraries/base_dist_CC_OPTS = -Iinclude ...
# libraries/base_dist_LD_OPTS = -package ghc-prim-0.1.0.0

define build-package
32
$(call trace, build-package($1,$2,$3))
Ian Lynagh's avatar
Ian Lynagh committed
33 34 35 36 37 38 39 40
# $1 = dir
# $2 = distdir
# $3 = GHC stage to use (0 == bootstrapping compiler)

ifeq "$$(findstring $3,0 1 2)" ""
$$(error $1/$2: stage argument to build-package should be 0, 1, or 2)
endif

41 42 43 44 45 46 47 48 49
$(call clean-target,$1,$2,$1/$2)

distclean : clean_$1_$2_config

maintainer-clean : distclean

.PHONY: clean_$1_$2_config
clean_$1_$2_config:
	"$$(RM)" $$(RM_OPTS) $1/config.log $1/config.status $1/include/Hs*Config.h
50
	"$$(RM)" $$(RM_OPTS_REC) $1/autom4te.cache
51 52 53 54 55 56 57 58 59 60 61 62

ifneq "$$($1_$2_NOT_NEEDED)" "YES"
$$(eval $$(call build-package-helper,$1,$2,$3))
endif
endef


define build-package-helper
# $1 = dir
# $2 = distdir
# $3 = GHC stage to use (0 == bootstrapping compiler)

Ian Lynagh's avatar
Ian Lynagh committed
63
# --- CONFIGURATION
Ian Lynagh's avatar
Ian Lynagh committed
64

Ian Lynagh's avatar
Ian Lynagh committed
65
$(call package-config,$1,$2,$3)
Ian Lynagh's avatar
Ian Lynagh committed
66

Ian Lynagh's avatar
Ian Lynagh committed
67 68 69 70 71 72 73 74 75 76 77 78
# Bootstrapping libs are only built one way
ifeq "$3" "0"
$1_$2_WAYS = v
else
$1_$2_WAYS = $$(GhcLibWays)
endif

# We must use a different dependency file if $(GhcLibWays) changes, so
# encode the ways into the name of the file.
$1_$2_WAYS_DASHED = $$(subst $$(space),,$$(patsubst %,-%,$$(strip $$($1_$2_WAYS))))
$1_$2_depfile_base = $1/$2/build/.depend$$($1_$2_WAYS_DASHED)

Ian Lynagh's avatar
Ian Lynagh committed
79 80 81 82 83 84 85
########################################
ifeq "$$($1_$2_CONFIGURE_PHASE)" ""
$$(error No configure phase for $1_$2)
else ifeq "$$($1_$2_CONFIGURE_PHASE)" "$$(phase)"

ifeq "$$(DEBUG)" "YES"
$$(warning $1/$2 configure phase)
86 87
endif

Ian Lynagh's avatar
Ian Lynagh committed
88 89 90
ifneq "$$(BINDIST)" "YES"
$(call build-package-data,$1,$2,$3)
endif
Ian Lynagh's avatar
Ian Lynagh committed
91 92 93 94 95

ifneq "$$(NO_INCLUDE_PKGDATA)" "YES"
include $1/$2/package-data.mk
endif

Ian Lynagh's avatar
Ian Lynagh committed
96
else ifeq "$$(phase_$$($1_$2_CONFIGURE_PHASE)_or_later)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
97 98

ifeq "$$(DEBUG)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
99 100 101 102 103 104 105 106
$$(warning $1/$2 build phase)
endif

ifneq "$$(NO_INCLUDE_PKGDATA)" "YES"
include $1/$2/package-data.mk
ifeq "$$($1_$2_VERSION)" ""
$$(error No version for $1_$2 found)
endif
Ian Lynagh's avatar
Ian Lynagh committed
107 108
endif

Ian Lynagh's avatar
Ian Lynagh committed
109
$(call all-target,$1,all_$1_$2)
Ian Lynagh's avatar
Ian Lynagh committed
110

Ian Lynagh's avatar
Ian Lynagh committed
111
else
Ian Lynagh's avatar
Ian Lynagh committed
112

Ian Lynagh's avatar
Ian Lynagh committed
113 114
ifeq "$$(DEBUG)" "YES"
$$(warning $1/$2 disabled phase)
Ian Lynagh's avatar
Ian Lynagh committed
115 116
endif

Ian Lynagh's avatar
Ian Lynagh committed
117 118
endif
########################################
Ian Lynagh's avatar
Ian Lynagh committed
119

Ian Lynagh's avatar
Ian Lynagh committed
120 121 122 123 124 125 126 127
# We don't install things compiled by stage 0, so no need to put them
# in the bindist.
ifneq "$$(BINDIST) $3" "YES 0"

# This give us things like
#     all_libraries: all_libraries/base_dist-install
ifneq "$$($1_$2_GROUP)" ""
all_$$($1_$2_GROUP): all_$1_$2
Ian Lynagh's avatar
Ian Lynagh committed
128
endif
Ian Lynagh's avatar
Ian Lynagh committed
129 130 131 132 133 134 135

ifneq "$$(CHECKED_$1)" "YES"
CHECKED_$1 = YES
check_packages: check_$1
.PHONY: check_$1
check_$1: $$(GHC_CABAL_INPLACE)
	$$(GHC_CABAL_INPLACE) check $1
Ian Lynagh's avatar
Ian Lynagh committed
136 137
endif

Ian Lynagh's avatar
Ian Lynagh committed
138 139
ifeq "$$(phase_$$($1_$2_CONFIGURE_PHASE)_done)" "YES"

Ian Lynagh's avatar
Ian Lynagh committed
140 141 142 143 144 145
$(call hs-sources,$1,$2)
$(call c-sources,$1,$2)
$(call includes-sources,$1,$2)

# --- DEPENDENCIES

146
$(call build-dependencies,$1,$2,$3)
Ian Lynagh's avatar
Ian Lynagh committed
147 148 149 150 151 152 153 154 155 156 157 158

# --- BUILDING

# We don't bother splitting the bootstrap packages (built with stage 0)
ifeq "$$($1_$2_SplitObjs)" ""
ifeq "$$(SplitObjs) $3" "YES 1"
$1_$2_SplitObjs = YES
else
$1_$2_SplitObjs = NO
endif
endif

159
# C and S files are possibly built the "dyn" way.
160
ifeq "$$(BuildSharedLibs)" "YES"
161 162 163
$(call c-objs,$1,$2,dyn)
$(call c-suffix-rules,$1,$2,dyn,YES)
endif
Ian Lynagh's avatar
Ian Lynagh committed
164 165

# Now generate all the build rules for each way in this directory:
166 167 168 169 170 171 172
$$(foreach way,$$($1_$2_WAYS),$$(eval \
    $$(call c-objs,$1,$2,$$(way)) \
	$$(call c-suffix-rules,$1,$2,$$(way),YES) \
    $$(call cmm-objs,$1,$2,$$(way)) \
    $$(call cmm-suffix-rules,$1,$2,$$(way)) \
    $$(call build-package-way,$1,$2,$$(way),$3) \
  ))
Ian Lynagh's avatar
Ian Lynagh committed
173 174 175 176 177 178

$(call haddock,$1,$2)

endif # package-data.mk exists

# Don't put bootstrapping packages in the bindist
Ian Lynagh's avatar
Ian Lynagh committed
179
ifneq "$3" "0"
180
BINDIST_EXTRAS += $1/*.cabal $$(wildcard $1/*.buildinfo) $1/$2/setup-config $1/LICENSE
Ian Lynagh's avatar
Ian Lynagh committed
181 182 183 184 185 186 187
BINDIST_EXTRAS += $$($1_$2_INSTALL_INCLUDES_SRCS)
endif

endif

endef