rts: Enable USDT probes object on Linux
[ghc.git] / rules / distdir-way-opts.mk
index bbd37d1..eb4a5c4 100644 (file)
@@ -5,8 +5,8 @@
 # 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
+#      http://ghc.haskell.org/trac/ghc/wiki/Building/Architecture
+#      http://ghc.haskell.org/trac/ghc/wiki/Building/Modifying
 #
 # -----------------------------------------------------------------------------
 
@@ -19,7 +19,9 @@ define distdir-way-opts # args: $1 = dir, $2 = distdir, $3 = way, $4 = stage
 #   $1 is the directory we're building in
 #   $2 is the distdir (e.g. "dist", "dist-install" etc.)
 #   $3 is the way (e.g. "v", "p", etc.)
-#   $4 is the stage ("1", "2", "3")
+#   $4 is the stage ("0", "1", "2") that the options are passed to
+#                                   See Note [Stage number in build variables]
+#                                   in mk/config.mk.in.
 # 
 # -----------------------------
 # The variables affecting Haskell compilations are as follows, including
@@ -28,22 +30,43 @@ define distdir-way-opts # args: $1 = dir, $2 = distdir, $3 = way, $4 = stage
 #  Variable              Purpose                           Defined by
 #  --------------        ------------------------------    --------------
 #  $1_PACKAGE            Package name for this dir,        $1/$2/ghc.mk
-#                        if it is a package   
-#   
+#                        if it is a package
+#
 #  CONF_HC_OPTS          GHC options from ./configure      mk/config.mk.in
-#   
+#
+#  CONF_CPP_OPTS_STAGE$4 CPP options from ./configure      mk/config.mk.in
+#
+#  CONF_CC_OPTS_STAGE$4  C compiler options from           mk/config.mk.in
+#                        ./configure
+#
 #  CONF_HC_OPTS_STAGE$4  GHC options from ./configure      mk/config.mk.in
-#                        specific to stage $4   
-#   
+#                        specific to stage $4
+#
+#  CONF_LD_LINKER_OPTS_STAGE$4
+#                        GHC options from ./configure      mk/config.mk.in
+#                        specific to stage $4
+#
 #  WAY_$3_HC_OPTS        GHC options specific to way $3    mk/ways.mk
 #   
 #  SRC_HC_OPTS           source-tree-wide GHC options      mk/config.mk.in
 #                                                          mk/build.mk
 #                                                          mk/validate.mk
-#   
+#                                                          mk/warnings.mk
+#
+#  SRC_HC_OPTS_STAGE$4   source-tree-wide GHC options,     mk/config.mk.in
+#                        supplied to the stage $4          mk/build.mk
+#                        compiler only                     mk/validate.mk
+#                                                          mk/warnings.mk
+#
 #  SRC_HC_WARNING_OPTS   source-tree-wide GHC warning      mk/config.mk.in
 #                        options                           mk/build.mk
 #                                                          mk/validate.mk
+#                                                          mk/warnings.mk
+#
+#  SRC_HC_WARNING_OPTS_STAGE$4                             mk/config.mk.in
+#                        source-tree-wide GHC warning      mk/build.mk
+#                        options, supplied to the          mk/validate.mk
+#                        stage $4 compiler only            mk/warnings.mk
 #   
 #  EXTRA_HC_OPTS         for supplying extra options on    make EXTRA_HC_OPTS=...
 #                        the command line   
@@ -60,6 +83,7 @@ define distdir-way-opts # args: $1 = dir, $2 = distdir, $3 = way, $4 = stage
 #  $1_$2_MORE_HC_OPTS    GHC options for this dir/distdir  ???
 #   
 #  $1_$2_EXTRA_HC_OPTS   GHC options for this dir/distdir  mk/build.mk
+#                                                          mk/warnings.mk
 #   
 #  $1_$2_HC_PKGCONF      -package-db flag if necessary   rules/package-config.mk
 #   
@@ -67,7 +91,7 @@ define distdir-way-opts # args: $1 = dir, $2 = distdir, $3 = way, $4 = stage
 #                        source files   
 #   
 #  $1_$2_CPP_OPTS        CPP options                       $1/$2/package-data.mk
-#  
+#
 #  <file>_HC_OPTS        GHC options for this source       $1/$2/ghc.mk
 #                        file (without the extension)
 
@@ -81,165 +105,136 @@ define distdir-way-opts # args: $1 = dir, $2 = distdir, $3 = way, $4 = stage
 # $1_$2_$3_MOST_HC_OPTS is also passed to C compilations when we use
 # GHC as the C compiler.
 
+ifeq "$(SUPPORTS_THIS_UNIT_ID)" "NO"
+ifeq "$4" "0"
+$4_USE_THIS_UNIT_ID=NO
+endif
+endif
+
+$1_$2_$4_DEP_OPTS = \
+ $$(foreach pkg,$$($1_$2_DEP_IPIDS),-package-id $$(pkg))
+
+ifeq "$($4_USE_THIS_UNIT_ID)" "NO"
+$4_THIS_UNIT_ID = -this-package-key
+else
+$4_THIS_UNIT_ID = -this-unit-id
+endif
+
 $1_$2_$3_MOST_HC_OPTS = \
  $$(WAY_$3_HC_OPTS) \
  $$(CONF_HC_OPTS) \
  $$(SRC_HC_OPTS) \
+ $$(SRC_HC_OPTS_STAGE$4) \
  $$($1_HC_OPTS) \
  $$($1_$2_HC_PKGCONF) \
  $$(if $$($1_$2_PROG),, \
-        $$(if $$($1_PACKAGE),-package-name $$($1_PACKAGE)-$$($1_$2_VERSION))) \
+        $$(if $$($1_PACKAGE),$$($4_THIS_UNIT_ID) $$($1_$2_COMPONENT_ID))) \
  $$(if $$($1_PACKAGE),-hide-all-packages) \
  -i $$(if $$($1_$2_HS_SRC_DIRS),$$(foreach dir,$$($1_$2_HS_SRC_DIRS),-i$1/$$(dir)),-i$1) \
- -i$1/$2/build -i$1/$2/build/autogen \
- -I$1/$2/build -I$1/$2/build/autogen \
+ -i$1/$2/build \
+ -I$1/$2/build \
+ -i$1/$2/build/$$(or $$($1_EXECUTABLE),$$($1_$2_PROGNAME),.)/autogen \
+ -I$1/$2/build/$$(or $$($1_EXECUTABLE),$$($1_$2_PROGNAME),.)/autogen \
  $$(foreach dir,$$(filter-out /%,$$($1_$2_INCLUDE_DIRS)),-I$1/$$(dir)) \
  $$(foreach dir,$$(filter /%,$$($1_$2_INCLUDE_DIRS)),-I$$(dir)) \
  $$(foreach inc,$$($1_$2_INCLUDE),-\#include "$$(inc)") \
  $$(foreach opt,$$($1_$2_CPP_OPTS),-optP$$(opt)) \
- $$(if $$($1_PACKAGE),-optP-include -optP$1/$2/build/autogen/cabal_macros.h) \
$$(foreach pkg,$$($1_$2_DEPS),-package $$(pkg)) \
- $$(if $$(findstring YES,$$($1_$2_SplitObjs)),$$(if $$(findstring dyn,$3),,-split-objs),) \
+ $$(if $$($1_PACKAGE),-optP-include \
   -optP$1/$2/build/$$(or $$($1_EXECUTABLE),$$($1_$2_PROGNAME),.)/autogen/cabal_macros.h) \
+ $$($1_$2_$4_DEP_OPTS) \
  $$($1_$2_HC_OPTS) \
  $$(CONF_HC_OPTS_STAGE$4) \
  $$($1_$2_MORE_HC_OPTS) \
+ $$($1_EXTRA_HC_OPTS) \
  $$($1_$2_EXTRA_HC_OPTS) \
  $$($1_$2_$3_HC_OPTS) \
- $$($$(basename $$<)_HC_OPTS) \
+ $$($$(basename $$(subst ./,,$$<))_HC_OPTS) \
  $$(SRC_HC_WARNING_OPTS) \
+ $$(SRC_HC_WARNING_OPTS_STAGE$4) \
  $$(EXTRA_HC_OPTS)
 
+# What is going on with $1_EXECUTABLE?  Recent version of Cabal
+# place the cabal_macros.h for executables in build/exename/autogen
+# rather than the traditional build/autogen.  This is Right(TM)
+# thing to do, but we have to accommodate it.  Usually, it suffices
+# to look in the PROGNAME, but for ghc the PROGNAME is ghc-stage1
+# while Cabal puts it in 'ghc', so we $1_EXECUTABLE is for that
+# case.
+
+$1_$2_$3_MOST_DIR_HC_OPTS = \
+ $$($1_$2_$3_MOST_HC_OPTS) \
+ -odir $1/$2/build -hidir $1/$2/build -stubdir $1/$2/build
+
 # NB. CONF_HC_OPTS_STAGE$4 has to be late enough to override $1_$2_HC_OPTS, so
 # that -O0 is effective (see #5484)
 
 # $1_$2_$3_ALL_HC_OPTS: this is all the options we will pass to GHC
 # for a given ($1,$2,$3).
 $1_$2_$3_ALL_HC_OPTS = \
- $$($1_$2_$3_MOST_HC_OPTS) \
- -odir $1/$2/build -hidir $1/$2/build -stubdir $1/$2/build \
- -hisuf $$($3_hisuf) -osuf  $$($3_osuf) -hcsuf $$($3_hcsuf)
-
-ifeq "$4" "0"
-# This is a bit of a hack.
-# If we are compiling something with the bootstrapping compiler on
-# cygwin, and it uses an include file from the rts (say), then we
-# need to stop mkdependC from generating a dependincy on
-#     c:/ghc/rts/include/Rts.h
-# as that confuses make. So we use -isystem instead of -I, which stops
-# these dependencies from being generated. Technically this is wrong if
-# we depend on a library that is built inside the build tree, and we
-# use headers from that library, but currently I don't think that's the
-# case.
-$1_$2_DEP_INCLUDE_DIRS_FLAG = -isystem
-else
-$1_$2_DEP_INCLUDE_DIRS_FLAG = -I
-endif
-
-ifneq ($$(strip $$($1_$2_DEP_INCLUDE_DIRS_SINGLE_QUOTED)),)
-$1_$2_CC_INC_FLAGS := $$(subst $$(space)',$$(space)$$($1_$2_DEP_INCLUDE_DIRS_FLAG)',$$(space)$$($1_$2_DEP_INCLUDE_DIRS_SINGLE_QUOTED))
-endif
+ -hisuf $$($3_hisuf) -osuf  $$($3_osuf) -hcsuf $$($3_hcsuf) \
+ $$($1_$2_$3_MOST_DIR_HC_OPTS) \
+ $$(if $$(findstring YES,$$($1_$2_SplitObjs)),$$(if $$(findstring dyn,$3),,-split-objs),) \
+ $$(if $$(findstring YES,$$($1_$2_SplitSections)),$$(if $$(findstring dyn,$3),,-split-sections),) \
+ $$(if $$(findstring YES,$$($1_$2_DYNAMIC_TOO)),$$(if $$(findstring v,$3),-dynamic-too))
 
-# The CONF_CC_OPTS_STAGE$4 options are what we use to get gcc to
-# behave correctly, but they are specific to the gcc that we are using.
-# If GHC is compiling C code then it will take care of that for us,
-# and in the case of the stage 0 compiler it may be using a different
-# gcc, so we don't want to use our gcc-specific options.
-$1_$2_DIST_GCC_CC_OPTS = \
- $$(CONF_CC_OPTS_STAGE$4) \
- $$($1_$2_DIST_CC_OPTS)
-
-$1_$2_DIST_CC_OPTS = \
- $$(SRC_CC_OPTS) \
- $$($1_CC_OPTS) \
- $$(foreach dir,$$(filter-out /%,$$($1_$2_INCLUDE_DIRS)),-I$1/$$(dir)) \
- $$(foreach dir,$$(filter /%,$$($1_$2_INCLUDE_DIRS)),-I$$(dir)) \
- $$($1_$2_CC_OPTS) \
- $$($1_$2_CPP_OPTS) \
- $$($1_$2_CC_INC_FLAGS) \
- $$($1_$2_DEP_CC_OPTS) \
- $$(SRC_CC_WARNING_OPTS)
-
-ifneq ($$(strip $$($1_$2_DEP_LIB_DIRS_SINGLE_QUOTED)),)
-$1_$2_DIST_LD_LIB_DIRS := $$(subst $$(space)',$$(space)-L',$$(space)$$($1_$2_DEP_LIB_DIRS_SINGLE_QUOTED))
+ifeq "$3" "dyn"
+ifeq "$$(HostOS_CPP)" "mingw32"
+ifneq "$$($1_$2_dll0_MODULES)" ""
+$1_$2_$3_ALL_HC_OPTS += -dll-split $1/$2/dll-split
 endif
-
-$1_$2_DIST_LD_OPTS = \
- $$(CONF_GCC_LINKER_OPTS_STAGE$4) \
- $$(SRC_LD_OPTS) \
- $$($1_LD_OPTS) \
- $$($1_$2_LD_OPTS) \
- $$($1_$2_DIST_LD_LIB_DIRS) \
- $$(foreach opt,$$($1_$2_DEP_EXTRA_LIBS),-l$$(opt)) \
- $$($1_$2_DEP_LD_OPTS)
-
-# c.f. Cabal's Distribution.Simple.PreProcess.ppHsc2hs
-# We use '' around cflags and lflags to handle paths with backslashes in
-# on Windows
-ifneq ($$(strip $$($1_$2_DIST_GCC_CC_OPTS)),)
-$1_$2_$3_HSC2HS_CC_OPTS:=$$(shell for i in $$($1_$2_DIST_GCC_CC_OPTS); do echo \'--cflag=$$$$i\'; done)
 endif
-ifneq ($$(strip $$($1_$2_DIST_LD_OPTS)),)
-$1_$2_$3_HSC2HS_LD_OPTS:=$$(shell for i in $$($1_$2_DIST_LD_OPTS); do echo \'--lflag=$$$$i\'; done)
 endif
 
-$1_$2_$3_ALL_HSC2HS_OPTS = \
- --cc=$$(WhatGccIsCalled) \
- --ld=$$(WhatGccIsCalled) \
- $$(CONF_HSC2HS_OPTS) \
- $$(SRC_HSC2HS_OPTS) \
- $$(WAY_$3_HSC2HS_OPTS) \
- --cflag=-D__GLASGOW_HASKELL__=$$(if $$(filter 0,$4),$$(GhcCanonVersion),$$(ProjectVersionInt)) \
- --cflag=-D$$(HostArch_CPP)_HOST_ARCH=1 \
- --cflag=-D$$(HostOS_CPP)_HOST_OS=1 \
- $$($1_$2_$3_HSC2HS_CC_OPTS) \
- $$($1_$2_$3_HSC2HS_LD_OPTS) \
- --cflag=-I$1/$2/build/autogen \
- $$(if $$($1_PACKAGE),--cflag=-include --cflag=$1/$2/build/autogen/cabal_macros.h) \
- $$($$(basename $$<)_HSC2HS_OPTS) \
- $$(EXTRA_HSC2HS_OPTS)
-
 $1_$2_$3_ALL_CC_OPTS = \
  $$(WAY_$3_CC_OPTS) \
  $$($1_$2_DIST_GCC_CC_OPTS) \
  $$($1_$2_$3_CC_OPTS) \
  $$($$(basename $$<)_CC_OPTS) \
- $$(EXTRA_CC_OPTS)
+ $$($1_$2_EXTRA_CC_OPTS) \
+ $$(EXTRA_CC_OPTS) \
+ $$(if $$(findstring YES,$$($1_$2_SplitSections)),-ffunction-sections -fdata-sections)
 
 $1_$2_$3_GHC_CC_OPTS = \
- $$(addprefix -optc, \
-     $$(WAY_$3_CC_OPTS) \
-     $$($1_$2_DIST_CC_OPTS) \
-     $$($1_$2_$3_CC_OPTS) \
-     $$($$(basename $$<)_CC_OPTS) \
-     $$(EXTRA_CC_OPTS)) \
+ $$(addprefix -optc, $$($1_$2_$3_ALL_CC_OPTS)) \
+ $$($1_$2_$3_MOST_HC_OPTS)
+
+# Options for passing to gcc for linking
+$1_$2_$3_ALL_LD_OPTS = \
+ $$(WAY_$3_LD_OPTS) \
+ $$($1_$2_DIST_LD_OPTS) \
+ $$($1_$2_$3_LD_OPTS) \
+ $$($1_$2_EXTRA_LD_OPTS) \
+ $$(EXTRA_LD_OPTS) \
+ $$(foreach o,$$(EXTRA_LD_LINKER_OPTS),-optl-Wl$$(comma)$$o) \
+ $$(foreach o,$$(CONF_LD_LINKER_OPTS_STAGE$4),-optl-Wl$$(comma)$$o)
+
+# Options for passing to GHC when we use it for linking
+$1_$2_$3_GHC_LD_OPTS = \
+ $$(addprefix -optl, $$($1_$2_$3_ALL_LD_OPTS)) \
  $$($1_$2_$3_MOST_HC_OPTS)
 
 $1_$2_$3_ALL_AS_OPTS = \
  $$(CONF_AS_OPTS) \
- $$(SRC_AS_OPTS)
+ $$(SRC_AS_OPTS) \
  $$(WAY_$3_AS_OPTS) \
  $$($1_AS_OPTS) \
  $$($1_$2_AS_OPTS) \
  $$($1_$2_$3_AS_OPTS) \
  $$(EXTRA_AS_OPTS)
 
-$1_$2_$3_ALL_ALEX_OPTS = \
- $$(CONF_ALEX_OPTS) \
- $$(SRC_ALEX_OPTS)
- $$(WAY_$3_ALEX_OPTS) \
- $$($1_ALEX_OPTS) \
- $$($1_$2_ALEX_OPTS) \
- $$($1_$2_$3_ALEX_OPTS) \
- $$(EXTRA_ALEX_OPTS)
-
-$1_$2_$3_ALL_HAPPY_OPTS = \
- $$(CONF_HAPPY_OPTS) \
- $$(SRC_HAPPY_OPTS) \
- $$(WAY_$3_HAPPY_OPTS) \
- $$($1_HAPPY_OPTS) \
- $$($1_$2_HAPPY_OPTS) \
- $$($1_$2_$3_HAPPY_OPTS) \
- $$(EXTRA_HAPPY_OPTS)
+ifeq "$3" "dyn"
+ifneq "$4" "0"
+ifeq "$$(TargetElf)" "YES"
+$1_$2_$3_GHC_LD_OPTS += \
+    -fno-use-rpaths \
+    $$(foreach d,$$($1_$2_TRANSITIVE_DEP_COMPONENT_IDS),-optl-Wl$$(comma)-rpath -optl-Wl$$(comma)'$$$$ORIGIN/../$$d') -optl-Wl,-zorigin
+else ifeq "$$(TargetOS_CPP)" "darwin"
+$1_$2_$3_GHC_LD_OPTS += \
+    -fno-use-rpaths \
+    $$(foreach d,$$($1_$2_TRANSITIVE_DEP_COMPONENT_IDS),-optl-Wl$$(comma)-rpath -optl-Wl$$(comma)'@loader_path/../$$d')
+endif
+endif
+endif
 
 endef