# - for stage N, object files and .hi files are placed inside
# the directory stageN, in subdirectories as per the sources.
#
-# - .hi-boot files are *linked* into the stageN tree, because in GHC 5.05+
-# the .hi-boot file must reside in the same place as the .hi file.
-#
# - we use explicit -o and -ohi options to direct the output from C &
# Haskell compilations.
#
# There are other plausible designs that might work, but each has different
# problems:
#
-# - using -odir and -hidir: GHC <= 4.08 doesn't support -hidir, and
-# anyway -odir puts all the objects in one directory (strips off the
+# - using -odir and -hidir:
+# -odir puts all the objects in one directory (strips off the
# subdirectory part), which eventually forces us to use VPATH to find
# the sources. I have a really bad feeling about VPATH.
#
endif
boot :: stage_dirs
-# On Windows, we can't use symbolic links for the -hi-boot files
-# because GHC itself is a Mingw program and does not understand
-# symbolic links. So we have to copy the files instead of link them.
-# That means that if you modify a .hi-boot file in Windows, you
-# have to to say 'make boot' again.
-#
-# PS: 'ln -s foo baz' takes 'foo' relative to the path to 'baz'
-# whereas 'cp foo baz' treats the two paths independently.
-# Hence the "../.." in the ln command line
-ifeq "$(UsingHsBoot)" "NO"
-ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
- for i in */*hi-boot*; do \
- cp -u -f $$i stage$(stage)/$$i; \
- done
-else
- for i in */*hi-boot*; do \
- ($(RM) -f stage$(stage)/$$i \
- && $(LN_S) ../../$$i stage$(stage)/$$i) || true ; \
- done
-endif
-endif
ifeq "$(stage)" "1"
HC=$(GHC)
SRC_HC_OPTS += $(patsubst %, -i$(odir)/%, $(ALL_DIRS))
-SRC_HC_OPTS += -Wall -fno-warn-name-shadowing
-# Turn off orphan warnings, but only if the flag exists (i.e. not if we
-# are building stage 1 and using GHC < 6.3).
-ifneq "$(stage)" "1 NO"
-SRC_HC_OPTS += -fno-warn-orphans
-endif
+SRC_HC_OPTS += -Wall -fno-warn-name-shadowing -fno-warn-orphans
HS_OBJS = $(patsubst %, $(odir)/%, $(addsuffix .$(way_)o,$(basename $(HS_SRCS))))
C_OBJS = $(patsubst %, $(odir)/%, $(addsuffix .$(way_)o,$(basename $(C_SRCS))))
@echo "cLdIsGNULd = \"$(LdIsGNULd)\"" >> $(CONFIG_HS)
@echo "cLD_X :: String" >> $(CONFIG_HS)
@echo "cLD_X = \"$(LD_X)\"" >> $(CONFIG_HS)
- @echo "cPROJECT_DIR :: String" >> $(CONFIG_HS)
- @echo "cPROJECT_DIR = \"$(PROJECT_DIR)\"" >> $(CONFIG_HS)
@echo "cGHC_DRIVER_DIR_REL :: String" >> $(CONFIG_HS)
@echo "cGHC_DRIVER_DIR_REL = \"$(GHC_DRIVER_DIR_REL)\"" >> $(CONFIG_HS)
@echo "cGHC_TOUCHY_PGM :: String" >> $(CONFIG_HS)
@echo "cGHC_CP = \"$(GHC_CP)\"" >> $(CONFIG_HS)
@echo "cGHC_PERL :: String" >> $(CONFIG_HS)
@echo "cGHC_PERL = \"$(GHC_PERL)\"" >> $(CONFIG_HS)
-ifeq ($(GhcWithIlx),YES)
- @echo "cILX2IL :: String" >> $(CONFIG_HS)
- @echo "cILX2IL = \"$(ILX2IL)\"" >> $(CONFIG_HS)
- @echo "cILASM :: String" >> $(CONFIG_HS)
- @echo "cILASM = \"$(ILASM)\"" >> $(CONFIG_HS)
-endif
@echo "cEnableWin32DLLs :: String" >> $(CONFIG_HS)
@echo "cEnableWin32DLLs = \"$(EnableWin32DLLs)\"" >> $(CONFIG_HS)
@echo "cCONTEXT_DIFF :: String" >> $(CONFIG_HS)
@echo "cRelocatableBuild = False" >> $(CONFIG_HS)
endif
@echo "cLibFFI :: Bool" >> $(CONFIG_HS)
-ifeq "$(UseLibFFI)" "YES"
+ifeq "$(UseLibFFIForAdjustors)" "YES"
@echo "cLibFFI = True" >> $(CONFIG_HS)
else
@echo "cLibFFI = False" >> $(CONFIG_HS)
SRC_HC_OPTS += -DOMIT_NATIVE_CODEGEN
endif
-ifeq ($(GhcWithIlx),YES)
-ALL_DIRS += ilxGen
-SRC_HC_OPTS += -DILX
-endif
-
-ifeq ($(GhcWithJavaGen),YES)
-ALL_DIRS += javaGen
-SRC_HC_OPTS += -DJAVA
-endif
-
-ifeq ($(UseLibFFI),YES)
-SRC_HC_OPTS += -DUSE_LIBFFI
-SRC_HSC2HS_OPTS += -DUSE_LIBFFI
-endif
-
ifeq "$(BootingFromHc)" "YES"
# HC files are always from a self-booted compiler
bootstrapped = YES
# the interpreter is supported on this platform.
ifeq "$(bootstrapped)" "YES"
-SRC_HC_OPTS += -package hpc -package bytestring
-PKG_DEPENDS += hpc bytestring
+SRC_HC_OPTS += -package bytestring
+PKG_DEPENDS += bytestring
endif
+SRC_HC_OPTS += -package hpc
+PKG_DEPENDS += hpc
+
ifeq "$(GhcWithInterpreter) $(bootstrapped)" "YES YES"
# Yes, include the interepreter and Template Haskell extensions
SRC_LD_OPTS += -debug
endif
+SRC_HC_OPTS += -I$(FPTOOLS_TOP)/libffi/build/include
+SRC_HSC2HS_OPTS += -I$(FPTOOLS_TOP)/libffi/build/include
+
ALL_DIRS += ghci
# If we are going to use dynamic libraries instead of .o files for ghci,
EXCLUDED_SRCS += ghci/keepCAFsForGHCi.c
endif
-# Enable readline if either:
-# - we're building stage 1 and $(GhcHasReadline)="YES"
-# - we're building stage 2/3, and we have built the readline package
+# Enable editline if either:
+# - we're building stage 1 and $(GhcHasEditline)="YES"
+# - we're building stage 2/3, and we have built the editline package
#
-# But we don't enable readline on Windows, because readline is fairly
-# broken there.
+# But we don't enable editline on Windows, as Windows terminals have
+# editline-like support builtin.
#
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
ifeq "$(stage)" "1"
-ifeq "$(GhcHasReadline)" "YES"
-SRC_HC_OPTS += -package readline -DUSE_READLINE
-PKG_DEPENDS += readline
+ifeq "$(GhcHasEditline)" "YES"
+SRC_HC_OPTS += -package editline -DUSE_EDITLINE
+PKG_DEPENDS += editline
endif
else
-ifeq "$(wildcard $(FPTOOLS_TOP_ABS)/libraries/readline/unbuildable)" ""
-SRC_HC_OPTS += -package readline -DUSE_READLINE
-PKG_DEPENDS += readline
+ifeq "$(wildcard $(FPTOOLS_TOP_ABS)/libraries/editline/unbuildable)" ""
+SRC_HC_OPTS += -package editline -DUSE_EDITLINE
+PKG_DEPENDS += editline
endif
endif # stage=1
endif # not windows
# -----------------------------------------------------------------------------
# Haskell compilations
-SRC_HC_OPTS += \
- -cpp -fglasgow-exts -fno-generics -Rghc-timing \
- -I. -Iparser
+SRC_HC_OPTS += -cpp -fglasgow-exts -Rghc-timing -I. -Iparser -Iutil
+
+ifeq "$(ghc_ge_609)" "NO"
+SRC_HC_OPTS += -fno-generics
+else
+SRC_HC_OPTS += -XNoGenerics
+endif
# Omitted: -I$(GHC_INCLUDE_DIR)
# We should have -I$(GHC_INCLUDE_DIR) in SRC_HC_OPTS,
# Disaster! Then the hc file sees the GHC 5.02 (or whatever)
# include files. For the moment we've reverted to using
# an explicit path in the .hs sources
-#
-# For the benefit of <5.00 compilers, do include GHC_INCLUDE_DIR
-# when generating dependencies. (=> it gets passed onto mkdependHS,
-# which needs it).
-SRC_MKDEPENDHS_OPTS += -I$(GHC_INCLUDE_DIR)
# We need System.Posix (or Posix when ghc < 6.2)
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
PKG_DEPENDS += Win32
endif
else
-ifeq "$(bootstrapped) $(ghc_ge_601)" "NO NO"
-SRC_HC_OPTS += -package posix
-else
SRC_HC_OPTS += -package unix
PKG_DEPENDS += unix
endif
-endif
-# We use the Cabal package in stages 2/3 only; in stage 1 we're using
-# the libcompat library which provides the Cabal modules.
-ifneq "$(stage)" "1"
SRC_HC_OPTS += -package Cabal
PKG_DEPENDS += Cabal
-endif
# Ignore lang, to avoid potential clash with the Generics module if
# lang happens to be a dependency of some exposed package in the local
SRC_HC_OPTS += -ignore-package lang
SRC_CC_OPTS += -Iparser -I. -O
-SRC_HC_OPTS += -recomp $(GhcHcOpts) $(GhcStage$(stage)HcOpts)
+SRC_HC_OPTS += $(GhcHcOpts) $(GhcStage$(stage)HcOpts)
SRC_HC_OPTS += -H16M
ifeq "$(BootingFromHc)" "YES"
SRC_CC_OPTS += -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
endif
-# Special flags for particular modules
-# The standard suffix rule for compiling a Haskell file
-# adds these flags to the command line
-
-# There used to be a -no-recomp flag on PrimOp, but why?
-# It's an expensive module to recompile!
-prelude/PrimOp_HC_OPTS = -H80m
-
-
-main/ParsePkgConf_HC_OPTS += -fno-warn-incomplete-patterns
-parser/Parser_HC_OPTS += -fno-warn-incomplete-patterns
-
-# Careful optimisation of the parser: we don't want to throw everything
-# at it, because that takes too long and doesn't buy much, but we do want
-# to inline certain key external functions, so we instruct GHC not to
-# throw away inlinings as it would normally do in -Onot mode:
-parser/Parser_HC_OPTS += -Onot -fno-ignore-interface-pragmas
-
-ifeq "$(HOSTPLATFORM)" "hppa1.1-hp-hpux9"
-rename/RnMonad_HC_OPTS = -O2 -O2-for-C
-endif
-
-utils/Digraph_HC_OPTS = -fglasgow-exts
-
-# basicTypes/SrcLoc_HC_OPTS = -funbox-strict-fields
-
-# We always optimise some low-level modules, otherwise performance of
-# a non-optimised compiler is severely affected.
-main/BinIface_HC_OPTS += -O
-utils/Binary_HC_OPTS += -O -funbox-strict-fields
-utils/FastMutInt_HC_OPTS += -O
-utils/Encoding_HC_OPTS += -O
-utils/StringBuffer_HC_OPTS += -O -funbox-strict-fields
-utils/FastString_HC_OPTS += -O -funbox-strict-fields
-
# ---- Profiling ----
#simplCore/Simplify_HC_OPTS = -auto-all
#simplCore/SimplEnv_HC_OPTS = -auto-all
#simplCore/SimplUtils_HC_OPTS = -auto-all
-# CSE interacts badly with top-level IORefs (reportedly in DriverState and
-# DriverMkDepend), causing some of them to be commoned up. We have a fix for
-# this in 5.00+, but earlier versions of the compiler will need CSE turned off.
-# To be on the safe side, we disable CSE in *all* modules with top-level IORefs.
-ghci/InteractiveUI_HC_OPTS = -fno-cse
-main/CmdLineOpts_HC_OPTS = -fno-cse
-main/DriverMkDepend_HC_OPTS = -fno-cse
-main/DriverPipeline_HC_OPTS = -fno-cse
-main/Finder_HC_OPTS = -fno-cse
-main/SysTools_HC_OPTS = -fno-cse
-main/StaticFlags_HC_OPTS = -fno-cse
-
# The #include is vital for the via-C route, else the C
# compiler doesn't realise that the stcall foreign imports are indeed
# stdcall, and doesn't generate the Foo@8 name for them
main/SysTools_HC_OPTS += '-\#include <windows.h>' '-\#include <process.h>'
endif
-parser/Lexer_HC_OPTS += -funbox-strict-fields
-
# ghc_strlen percolates through so many modules that it is easier to get its
# prototype via a global option instead of a myriad of per-file OPTIONS
SRC_HC_OPTS += '-\#include "cutils.h"'
#-----------------------------------------------------------------------------
# Linking
-# Include libghccompat in stage1 only. In stage2 onwards, all these
-# libraries will be available from the main libraries.
-
-ifeq "$(stage)" "1"
-include $(GHC_COMPAT_DIR)/compat.mk
+ifeq "$(GhcUnregisterised)" "NO"
+ifeq "$(HOSTPLATFORM)" "ia64-unknown-linux"
+# needed for generating proper relocation in large binaries: trac #856
+SRC_LD_OPTS += -optl-Wl,--relax
+endif
endif
-
-SRC_LD_OPTS += -no-link-chk
# -----------------------------------------------------------------------------
# create ghc-inplace, a convenient way to run ghc from the build tree...
# typecheck/TcUnify_HC_OPTS += -auto-all
# coreSyn/CorePrep_HC_OPTS += -auto-all
-# parser/Parser_HC_OPTS += -fasm
#-----------------------------------------------------------------------------
# Building the GHC package
# careful to recompile stuff you need if you reconfigure or change HsVersions.h.
# Aargh, these don't work properly anyway, because GHC's recompilation checker
-# just reports "compilation NOT required". Do we have to add -no-recomp for each
+# just reports "compilation NOT required". Do we have to add -fforce-recomp for each
# of these .hs files? I haven't done anything about this yet.
$(odir)/codeGen/Bitmap.$(way_)o : ../includes/MachDeps.h
$(MKDEPENDHS) -M -optdep-f -optdep.depend-BASE $(foreach way,$(WAYS),-optdep-s -optdep$(way)) $(foreach obj,$(MKDEPENDHS_OBJ_SUFFICES),-osuf $(obj)) $(MKDEPENDHS_OPTS) $(filter-out -split-objs, $(MKDEPENDHS_HC_OPTS)) $(HS_SRCS)
endif
$(MKDEPENDC) -f .depend-BASE $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(C_SRCS)
- $(PERL) -pe 'binmode(stdin); binmode(stdout); s@(\S*[._]o)@stage$(stage)/$$1@g; s@(\S*[._]hi)@stage$(stage)/$$1@g; s@^.*/compat.*$$@@g;' <.depend-BASE >.depend-$(stage)
+ $(PERL) -pe 'binmode(stdin); binmode(stdout); s@(\S*[._]o)@stage$(stage)/$$1@g; s@(\S*[._]hi)@stage$(stage)/$$1@g;' <.depend-BASE >.depend-$(stage)
# The binmode stuff tells perl not to add stupid ^M's to the output
-#
-# The /lib/compat replacement is to workaround a bug in the
-# -optdep--exclude-module flag in GHC 6.4. It is not required for any
-# other version of GHC, but doesn't do any harm.
ifeq "$(MakefileDeps)" "YES"
$(CONFIG_HS) : Makefile