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#      https://gitlab.haskell.org/ghc/ghc/wikis/building/architecture
9#      https://gitlab.haskell.org/ghc/ghc/wikis/building/modifying
10#
11# -----------------------------------------------------------------------------
12
13
14# Set compilation flags that additionally depend on a particular way
15
16define 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 ("0", "1", "2") that the options are passed to
23#                                   See Note [Stage number in build variables]
24#                                   in mk/config.mk.in.
25#
26# -----------------------------
27# The variables affecting Haskell compilations are as follows, including
28# the places in the build system that may define them.
29#
30#  Variable              Purpose                           Defined by
31#  --------------        ------------------------------    --------------
32#  $1_PACKAGE            Package name for this dir,        $1/$2/ghc.mk
33#                        if it is a package
34#
35#  CONF_HC_OPTS          GHC options from ./configure      mk/config.mk.in
36#
37#  CONF_CPP_OPTS_STAGE$4 CPP options from ./configure      mk/config.mk.in
38#
39#  CONF_CC_OPTS_STAGE$4  C compiler options from           mk/config.mk.in
40#                        ./configure
41#
42#  CONF_HC_OPTS_STAGE$4  GHC options from ./configure      mk/config.mk.in
43#                        specific to stage $4
44#
45#  CONF_LD_LINKER_OPTS_STAGE$4
46#                        GHC options from ./configure      mk/config.mk.in
47#                        specific to stage $4
48#
49#  WAY_$3_HC_OPTS        GHC options specific to way $3    mk/ways.mk
50#
51#  SRC_HC_OPTS           source-tree-wide GHC options      mk/config.mk.in
52#                                                          mk/build.mk
53#                                                          mk/validate.mk
54#                                                          mk/warnings.mk
55#
56#  SRC_HC_OPTS_STAGE$4   source-tree-wide GHC options,     mk/config.mk.in
57#                        supplied to the stage $4          mk/build.mk
58#                        compiler only                     mk/validate.mk
59#                                                          mk/warnings.mk
60#
61#  SRC_HC_WARNING_OPTS   source-tree-wide GHC warning      mk/config.mk.in
62#                        options                           mk/build.mk
63#                                                          mk/validate.mk
64#                                                          mk/warnings.mk
65#
66#  SRC_HC_WARNING_OPTS_STAGE$4                             mk/config.mk.in
67#                        source-tree-wide GHC warning      mk/build.mk
68#                        options, supplied to the          mk/validate.mk
69#                        stage $4 compiler only            mk/warnings.mk
70#
71#  EXTRA_HC_OPTS         for supplying extra options on    make EXTRA_HC_OPTS=...
72#                        the command line
73#
74#  $1_HC_OPTS            GHC options specific to this      $1/$2/package-data.mk
75#                        dir
76#
77#  $1_$2_HC_OPTS         GHC options specific to this      $1/$2/package-data.mk
78#                        dir and distdir
79#
80#  $1_$2_$3_HC_OPTS      GHC options specific to this      $1/$2/package-data.mk
81#                        dir, distdir and way
82#
83#  $1_$2_MORE_HC_OPTS    GHC options for this dir/distdir  ???
84#
85#  $1_$2_EXTRA_HC_OPTS   GHC options for this dir/distdir  mk/build.mk
86#                                                          mk/warnings.mk
87#
88#  $1_$2_HC_PKGCONF      -package-db flag if necessary   rules/package-config.mk
89#
90#  $1_$2_HS_SRC_DIRS     dirs relative to $1 containing    $1/$2/package-data.mk
91#                        source files
92#
93#  $1_$2_CPP_OPTS        CPP options                       $1/$2/package-data.mk
94#
95#  <file>_HC_OPTS        GHC options for this source       $1/$2/ghc.mk
96#                        file (without the extension)
97
98# -----------------------------
99
100# The actual options passed to a Haskell compilation are defined
101# below.  Note that in general, more specific sets of options come
102# after the less specific, so that we can override global options
103# on a per-directory or per-way basis, for example.
104
105# $1_$2_$3_MOST_HC_OPTS is also passed to C compilations when we use
106# GHC as the C compiler.
107
108$1_$2_$4_DEP_OPTS = \
109 $$(foreach pkg,$$($1_$2_DEP_IPIDS),-package-id $$(pkg))
110
111$4_THIS_UNIT_ID = -this-unit-id
112
113$1_$2_$3_MOST_HC_OPTS = \
114 $$(WAY_$3_HC_OPTS) \
115 $$(CONF_HC_OPTS) \
116 $$(SRC_HC_OPTS) \
117 $$(SRC_HC_OPTS_STAGE$4) \
118 $$($1_HC_OPTS) \
119 $$($1_$2_HC_PKGCONF) \
120 $$(if $$($1_$2_PROG),, \
121        $$(if $$($1_PACKAGE),$$($4_THIS_UNIT_ID) $$($1_$2_COMPONENT_ID))) \
122 $$(if $$($1_PACKAGE),-hide-all-packages) \
123 -package-env - \
124 -i $$(if $$($1_$2_HS_SRC_DIRS),$$(foreach dir,$$($1_$2_HS_SRC_DIRS),-i$1/$$(dir)),-i$1) \
125 -i$1/$2/build \
126 -I$1/$2/build \
127 -i$1/$2/build/$$(or $$($1_EXECUTABLE),$$($1_$2_PROGNAME),.)/autogen \
128 -I$1/$2/build/$$(or $$($1_EXECUTABLE),$$($1_$2_PROGNAME),.)/autogen \
129 $$(foreach dir,$$(filter-out /%,$$($1_$2_INCLUDE_DIRS)),-I$1/$$(dir)) \
130 $$(foreach dir,$$(filter /%,$$($1_$2_INCLUDE_DIRS)),-I$$(dir)) \
131 $$(foreach inc,$$($1_$2_INCLUDE),-\#include "$$(inc)") \
132 $$(foreach opt,$$($1_$2_CPP_OPTS),-optP$$(opt)) \
133 $$(if $$($1_PACKAGE),-optP-include \
134    -optP$1/$2/build/$$(or $$($1_EXECUTABLE),$$($1_$2_PROGNAME),.)/autogen/cabal_macros.h) \
135 $$($1_$2_$4_DEP_OPTS) \
136 $$($1_$2_HC_OPTS) \
137 $$(CONF_HC_OPTS_STAGE$4) \
138 $$($1_$2_MORE_HC_OPTS) \
139 $$($1_EXTRA_HC_OPTS) \
140 $$($1_$2_EXTRA_HC_OPTS) \
141 $$($1_$2_$3_HC_OPTS) \
142 $$($$(basename $$(subst ./,,$$<))_HC_OPTS) \
143 $$(SRC_HC_WARNING_OPTS) \
144 $$(SRC_HC_WARNING_OPTS_STAGE$4) \
145 $$(EXTRA_HC_OPTS)
146
147# What is going on with $1_EXECUTABLE?  Recent version of Cabal
148# place the cabal_macros.h for executables in build/exename/autogen
149# rather than the traditional build/autogen.  This is Right(TM)
150# thing to do, but we have to accommodate it.  Usually, it suffices
151# to look in the PROGNAME, but for ghc the PROGNAME is ghc-stage1
152# while Cabal puts it in 'ghc', so we $1_EXECUTABLE is for that
153# case.
154
155$1_$2_$3_MOST_DIR_HC_OPTS = \
156 $$($1_$2_$3_MOST_HC_OPTS) \
157 -outputdir $1/$2/build
158
159# NB. CONF_HC_OPTS_STAGE$4 has to be late enough to override $1_$2_HC_OPTS, so
160# that -O0 is effective (see #5484)
161
162# $1_$2_$3_ALL_HC_OPTS: this is all the options we will pass to GHC
163# for a given ($1,$2,$3).
164$1_$2_$3_ALL_HC_OPTS = \
165 -hisuf $$($3_hisuf) -osuf  $$($3_osuf) -hcsuf $$($3_hcsuf) \
166 $$($1_$2_$3_MOST_DIR_HC_OPTS) \
167 $$(if $$(findstring YES,$$($1_$2_SplitSections)),$$(if $$(findstring dyn,$3),,-split-sections),) \
168 $$(if $$(findstring YES,$$($1_$2_DYNAMIC_TOO)),$$(if $$(findstring v,$3),-dynamic-too))
169
170$1_$2_$3_ALL_CC_OPTS = \
171 $$(WAY_$3_CC_OPTS) \
172 $$($1_$2_DIST_GCC_CC_OPTS) \
173 $$($1_$2_$3_CC_OPTS) \
174 $$($$(basename $$<)_CC_OPTS) \
175 $$($1_$2_EXTRA_CC_OPTS) \
176 $$(EXTRA_CC_OPTS) \
177 $$(if $$(findstring YES,$$($1_$2_SplitSections)),-ffunction-sections -fdata-sections)
178
179$1_$2_$3_GHC_CC_OPTS = \
180 $$(addprefix -optc, $$($1_$2_$3_ALL_CC_OPTS)) \
181 $$($1_$2_$3_MOST_HC_OPTS)
182
183# Options for passing to gcc for linking
184$1_$2_$3_ALL_LD_OPTS = \
185 $$(WAY_$3_LD_OPTS) \
186 $$($1_$2_DIST_LD_OPTS) \
187 $$($1_$2_$3_LD_OPTS) \
188 $$($1_$2_EXTRA_LD_OPTS) \
189 $$(EXTRA_LD_OPTS) \
190 $$(foreach o,$$(EXTRA_LD_LINKER_OPTS),-Wl$$(comma)$$o) \
191 $$(foreach o,$$(CONF_LD_LINKER_OPTS_STAGE$4),-Wl$$(comma)$$o)
192
193# Options for passing to GHC when we use it for linking
194$1_$2_$3_GHC_LD_OPTS = \
195 $$(addprefix -optl, $$($1_$2_$3_ALL_LD_OPTS)) \
196 $$($1_$2_$3_MOST_HC_OPTS)
197
198$1_$2_$3_ALL_AS_OPTS = \
199 $$(CONF_AS_OPTS) \
200 $$(SRC_AS_OPTS) \
201 $$(WAY_$3_AS_OPTS) \
202 $$($1_AS_OPTS) \
203 $$($1_$2_AS_OPTS) \
204 $$($1_$2_$3_AS_OPTS) \
205 $$(EXTRA_AS_OPTS)
206
207ifeq "$3" "dyn"
208ifneq "$4" "0"
209ifeq "$$(TargetElf)" "YES"
210$1_$2_$3_GHC_LD_OPTS += \
211    -fno-use-rpaths \
212    $$(foreach d,$$($1_$2_TRANSITIVE_DEP_COMPONENT_IDS),-optl-Wl$$(comma)-rpath -optl-Wl$$(comma)'$$$$ORIGIN/../$$d') -optl-Wl,-zorigin
213else ifeq "$$(TargetOS_CPP)" "darwin"
214$1_$2_$3_GHC_LD_OPTS += \
215    -fno-use-rpaths \
216    $$(foreach d,$$($1_$2_TRANSITIVE_DEP_COMPONENT_IDS),-optl-Wl$$(comma)-rpath -optl-Wl$$(comma)'@loader_path/../$$d')
217endif
218endif
219endif
220
221endef
222
223