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