93bc60b6b1a50c87fa03a83cb8c7c6bae7142f4b
[ghc.git] / rules / distdir-way-opts.mk
1 # -----------------------------------------------------------------------------
2 #
3 # (c) 2009 The University of Glasgow
4 #
5 # This file is part of the GHC build system.
6 #
7 # To understand how the build system works and how to modify it, see
8 # http://ghc.haskell.org/trac/ghc/wiki/Building/Architecture
9 # http://ghc.haskell.org/trac/ghc/wiki/Building/Modifying
10 #
11 # -----------------------------------------------------------------------------
12
13
14 # Set compilation flags that additionally depend on a particular way
15
16 define distdir-way-opts # args: $1 = dir, $2 = distdir, $3 = way, $4 = stage
17
18 # Here is how the command line for a Haskell compilation is constructed.
19 # $1 is the directory we're building in
20 # $2 is the distdir (e.g. "dist", "dist-install" etc.)
21 # $3 is the way (e.g. "v", "p", etc.)
22 # $4 is the stage ("1", "2", "3")
23 #
24 # -----------------------------
25 # The variables affecting Haskell compilations are as follows, including
26 # the places in the build system that may define them.
27 #
28 # Variable Purpose Defined by
29 # -------------- ------------------------------ --------------
30 # $1_PACKAGE Package name for this dir, $1/$2/ghc.mk
31 # if it is a package
32 #
33 # CONF_HC_OPTS GHC options from ./configure mk/config.mk.in
34 #
35 # CONF_HC_OPTS_STAGE$4 GHC options from ./configure mk/config.mk.in
36 # specific to stage $4
37 #
38 # WAY_$3_HC_OPTS GHC options specific to way $3 mk/ways.mk
39 #
40 # SRC_HC_OPTS source-tree-wide GHC options mk/config.mk.in
41 # mk/build.mk
42 # mk/validate.mk
43 #
44 # SRC_HC_WARNING_OPTS source-tree-wide GHC warning mk/config.mk.in
45 # options mk/build.mk
46 # mk/validate.mk
47 #
48 # EXTRA_HC_OPTS for supplying extra options on make EXTRA_HC_OPTS=...
49 # the command line
50 #
51 # $1_HC_OPTS GHC options specific to this $1/$2/package-data.mk
52 # dir
53 #
54 # $1_$2_HC_OPTS GHC options specific to this $1/$2/package-data.mk
55 # dir and distdir
56 #
57 # $1_$2_$3_HC_OPTS GHC options specific to this $1/$2/package-data.mk
58 # dir, distdir and way
59 #
60 # $1_$2_MORE_HC_OPTS GHC options for this dir/distdir ???
61 #
62 # $1_$2_EXTRA_HC_OPTS GHC options for this dir/distdir mk/build.mk
63 #
64 # $1_$2_HC_PKGCONF -package-db flag if necessary rules/package-config.mk
65 #
66 # $1_$2_HS_SRC_DIRS dirs relative to $1 containing $1/$2/package-data.mk
67 # source files
68 #
69 # $1_$2_CPP_OPTS CPP options $1/$2/package-data.mk
70 #
71 # <file>_HC_OPTS GHC options for this source $1/$2/ghc.mk
72 # file (without the extension)
73
74 # -----------------------------
75
76 # The actual options passed to a Haskell compilation are defined
77 # below. Note that in general, more specific sets of options come
78 # after the less specific, so that we can override global options
79 # on a per-directory or per-way basis, for example.
80
81 # $1_$2_$3_MOST_HC_OPTS is also passed to C compilations when we use
82 # GHC as the C compiler.
83
84 $1_$2_$3_MOST_HC_OPTS = \
85 $$(WAY_$3_HC_OPTS) \
86 $$(CONF_HC_OPTS) \
87 $$(SRC_HC_OPTS) \
88 $$($1_HC_OPTS) \
89 $$($1_$2_HC_PKGCONF) \
90 $$(if $$($1_$2_PROG),, \
91 $$(if $$($1_PACKAGE),-package-name $$($1_PACKAGE)-$$($1_$2_VERSION))) \
92 $$(if $$($1_PACKAGE),-hide-all-packages) \
93 -i $$(if $$($1_$2_HS_SRC_DIRS),$$(foreach dir,$$($1_$2_HS_SRC_DIRS),-i$1/$$(dir)),-i$1) \
94 -i$1/$2/build -i$1/$2/build/autogen \
95 -I$1/$2/build -I$1/$2/build/autogen \
96 $$(foreach dir,$$(filter-out /%,$$($1_$2_INCLUDE_DIRS)),-I$1/$$(dir)) \
97 $$(foreach dir,$$(filter /%,$$($1_$2_INCLUDE_DIRS)),-I$$(dir)) \
98 $$(foreach inc,$$($1_$2_INCLUDE),-\#include "$$(inc)") \
99 $$(foreach opt,$$($1_$2_CPP_OPTS),-optP$$(opt)) \
100 $$(if $$($1_PACKAGE),-optP-include -optP$1/$2/build/autogen/cabal_macros.h) \
101 $$(foreach pkg,$$($1_$2_DEPS),-package $$(pkg)) \
102 $$($1_$2_HC_OPTS) \
103 $$(CONF_HC_OPTS_STAGE$4) \
104 $$($1_$2_MORE_HC_OPTS) \
105 $$($1_$2_EXTRA_HC_OPTS) \
106 $$($1_$2_$3_HC_OPTS) \
107 $$($$(basename $$(subst ./,,$$<))_HC_OPTS) \
108 $$(SRC_HC_WARNING_OPTS) \
109 $$(EXTRA_HC_OPTS)
110
111 $1_$2_$3_MOST_DIR_HC_OPTS = \
112 $$($1_$2_$3_MOST_HC_OPTS) \
113 -odir $1/$2/build -hidir $1/$2/build -stubdir $1/$2/build
114
115 # NB. CONF_HC_OPTS_STAGE$4 has to be late enough to override $1_$2_HC_OPTS, so
116 # that -O0 is effective (see #5484)
117
118 # $1_$2_$3_ALL_HC_OPTS: this is all the options we will pass to GHC
119 # for a given ($1,$2,$3).
120 $1_$2_$3_ALL_HC_OPTS = \
121 -hisuf $$($3_hisuf) -osuf $$($3_osuf) -hcsuf $$($3_hcsuf) \
122 $$($1_$2_$3_MOST_DIR_HC_OPTS) \
123 $$(if $$(findstring YES,$$($1_$2_SplitObjs)),$$(if $$(findstring dyn,$3),,-split-objs),) \
124 $$(if $$(findstring YES,$$($1_$2_DYNAMIC_TOO)),$$(if $$(findstring v,$3),-dynamic-too))
125
126 ifeq "$3" "dyn"
127 ifeq "$$(HostOS_CPP)" "mingw32"
128 ifneq "$$($1_$2_dll0_MODULES)" ""
129 $1_$2_$3_ALL_HC_OPTS += -dll-split $1/$2/dll-split
130 endif
131 endif
132 endif
133
134 $1_$2_$3_ALL_CC_OPTS = \
135 $$(WAY_$3_CC_OPTS) \
136 $$($1_$2_DIST_GCC_CC_OPTS) \
137 $$($1_$2_$3_CC_OPTS) \
138 $$($$(basename $$<)_CC_OPTS) \
139 $$($1_$2_EXTRA_CC_OPTS) \
140 $$(EXTRA_CC_OPTS)
141
142 $1_$2_$3_GHC_CC_OPTS = \
143 $$(addprefix -optc, $$($1_$2_$3_ALL_CC_OPTS)) \
144 $$($1_$2_$3_MOST_HC_OPTS)
145
146 # Options for passing to plain ld
147 $1_$2_$3_ALL_LD_OPTS = \
148 $$(WAY_$3_LD_OPTS) \
149 $$($1_$2_DIST_LD_OPTS) \
150 $$($1_$2_$3_LD_OPTS) \
151 $$($1_$2_EXTRA_LD_OPTS) \
152 $$(EXTRA_LD_OPTS)
153
154 # Options for passing to GHC when we use it for linking
155 $1_$2_$3_GHC_LD_OPTS = \
156 $$(addprefix -optl, $$($1_$2_$3_ALL_LD_OPTS)) \
157 $$($1_$2_$3_MOST_HC_OPTS)
158
159 $1_$2_$3_ALL_AS_OPTS = \
160 $$(CONF_AS_OPTS) \
161 $$(SRC_AS_OPTS) \
162 $$(WAY_$3_AS_OPTS) \
163 $$($1_AS_OPTS) \
164 $$($1_$2_AS_OPTS) \
165 $$($1_$2_$3_AS_OPTS) \
166 $$(EXTRA_AS_OPTS)
167
168 ifeq "$3" "dyn"
169 ifneq "$4" "0"
170 ifeq "$$(TargetElf)" "YES"
171 $1_$2_$3_GHC_LD_OPTS += \
172 -fno-use-rpaths \
173 $$(foreach d,$$($1_$2_TRANSITIVE_DEPS),-optl-Wl$$(comma)-rpath -optl-Wl$$(comma)'$$$$ORIGIN/../$$d') -optl-Wl,-zorigin
174 else ifeq "$$(TargetOS_CPP)" "darwin"
175 $1_$2_$3_GHC_LD_OPTS += \
176 -fno-use-rpaths \
177 $$(foreach d,$$($1_$2_TRANSITIVE_DEPS),-optl-Wl$$(comma)-rpath -optl-Wl$$(comma)'@loader_path/../$$d')
178 endif
179 endif
180 endif
181
182 endef
183