summaryrefslogtreecommitdiff
path: root/docs/users_guide/phases.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/users_guide/phases.rst')
-rw-r--r--docs/users_guide/phases.rst903
1 files changed, 903 insertions, 0 deletions
diff --git a/docs/users_guide/phases.rst b/docs/users_guide/phases.rst
new file mode 100644
index 0000000000..e7a46950b5
--- /dev/null
+++ b/docs/users_guide/phases.rst
@@ -0,0 +1,903 @@
+.. _options-phases:
+
+Options related to a particular phase
+=====================================
+
+.. _replacing-phases:
+
+Replacing the program for one or more phases
+--------------------------------------------
+
+.. index::
+ single: compilation phases, changing
+
+You may specify that a different program be used for one of the phases
+of the compilation system, in place of whatever the ``ghc`` has wired
+into it. For example, you might want to try a different assembler. The
+following options allow you to change the external program used for a
+given compilation phase:
+
+``-pgmL ⟨cmd⟩``
+ .. index::
+ single: -pgmL
+
+ Use ⟨cmd⟩ as the literate pre-processor.
+
+``-pgmP ⟨cmd⟩``
+ .. index::
+ single: -pgmP
+
+ Use ⟨cmd⟩ as the C pre-processor (with ``-cpp`` only).
+
+``-pgmc ⟨cmd⟩``
+ .. index::
+ single: -pgmc
+
+ Use ⟨cmd⟩ as the C compiler.
+
+``-pgmlo ⟨cmd⟩``
+ .. index::
+ single: -pgmlo
+
+ Use ⟨cmd⟩ as the LLVM optimiser.
+
+``-pgmlc ⟨cmd⟩``
+ .. index::
+ single: -pgmlc
+
+ Use ⟨cmd⟩ as the LLVM compiler.
+
+``-pgms ⟨cmd⟩``
+ .. index::
+ single: -pgms
+
+ Use ⟨cmd⟩ as the splitter.
+
+``-pgma ⟨cmd⟩``
+ .. index::
+ single: -pgma
+
+ Use ⟨cmd⟩ as the assembler.
+
+``-pgml ⟨cmd⟩``
+ .. index::
+ single: -pgml
+
+ Use ⟨cmd⟩ as the linker.
+
+``-pgmdll ⟨cmd⟩``
+ .. index::
+ single: -pgmdll
+
+ Use ⟨cmd⟩ as the DLL generator.
+
+``-pgmF ⟨cmd⟩``
+ .. index::
+ single: -pgmF
+
+ Use ⟨cmd⟩ as the pre-processor (with ``-F`` only).
+
+``-pgmwindres ⟨cmd⟩``
+ .. index::
+ single: -pgmwindres
+
+ Use ⟨cmd⟩ as the program to use for embedding manifests on Windows.
+ Normally this is the program ``windres``, which is supplied with a
+ GHC installation. See ``-fno-embed-manifest`` in
+ :ref:`options-linker`.
+
+``-pgmlibtool ⟨cmd⟩``
+ .. index::
+ single: -pgmlibtool
+
+ Use ⟨cmd⟩ as the libtool command (when using ``-staticlib`` only).
+
+.. _forcing-options-through:
+
+Forcing options to a particular phase
+-------------------------------------
+
+.. index::
+ single: forcing GHC-phase options
+
+Options can be forced through to a particular compilation phase, using
+the following flags:
+
+``-optL ⟨option⟩``
+ .. index::
+ single: -optL
+
+ Pass ⟨option⟩ to the literate pre-processor
+
+``-optP ⟨option⟩``
+ .. index::
+ single: -optP
+
+ Pass ⟨option⟩ to CPP (makes sense only if ``-cpp`` is also on).
+
+``-optF ⟨option⟩``
+ .. index::
+ single: -optF
+
+ Pass ⟨option⟩ to the custom pre-processor (see
+ :ref:`pre-processor`).
+
+``-optc ⟨option⟩``
+ .. index::
+ single: -optc
+
+ Pass ⟨option⟩ to the C compiler.
+
+``-optlo ⟨option⟩``
+ .. index::
+ single: -optlo
+
+ Pass ⟨option⟩ to the LLVM optimiser.
+
+``-optlc ⟨option⟩``
+ .. index::
+ single: -optlc
+
+ Pass ⟨option⟩ to the LLVM compiler.
+
+``-opta ⟨option⟩``
+ .. index::
+ single: -opta
+
+ Pass ⟨option⟩ to the assembler.
+
+``-optl ⟨option⟩``
+ .. index::
+ single: -optl
+
+ Pass ⟨option⟩ to the linker.
+
+``-optdll ⟨option⟩``
+ .. index::
+ single: -optdll
+
+ Pass ⟨option⟩ to the DLL generator.
+
+``-optwindres ⟨option⟩``
+ .. index::
+ single: -optwindres
+
+ Pass ⟨option⟩ to ``windres`` when embedding manifests on Windows.
+ See ``-fno-embed-manifest`` in :ref:`options-linker`.
+
+So, for example, to force an ``-Ewurble`` option to the assembler, you
+would tell the driver ``-opta-Ewurble`` (the dash before the E is
+required).
+
+GHC is itself a Haskell program, so if you need to pass options directly
+to GHC's runtime system you can enclose them in ``+RTS ... -RTS`` (see
+:ref:`runtime-control`).
+
+.. _c-pre-processor:
+
+Options affecting the C pre-processor
+-------------------------------------
+
+.. index::
+ single: pre-processing: cpp
+ single: C pre-processor options
+ single: cpp, pre-processing with
+
+``-cpp``
+ .. index::
+ single: -cpp
+
+ The C pre-processor ``cpp`` is run over your Haskell code only if
+ the ``-cpp`` option -cpp option is given. Unless you are building a
+ large system with significant doses of conditional compilation, you
+ really shouldn't need it.
+
+``-D ⟨symbol⟩[=⟨value⟩]``
+ .. index::
+ single: -D
+
+ Define macro ⟨symbol⟩ in the usual way. NB: does *not* affect ``-D``
+ macros passed to the C compiler when compiling via C! For those, use
+ the ``-optc-Dfoo`` hack… (see :ref:`forcing-options-through`).
+
+``-U ⟨symbol⟩``
+ .. index::
+ single: -U
+
+ Undefine macro ⟨symbol⟩ in the usual way.
+
+``-I ⟨dir⟩``
+ .. index::
+ single: -I
+
+ Specify a directory in which to look for ``#include`` files, in the
+ usual C way.
+
+The GHC driver pre-defines several macros when processing Haskell source
+code (``.hs`` or ``.lhs`` files).
+
+The symbols defined by GHC are listed below. To check which symbols are
+defined by your local GHC installation, the following trick is useful:
+
+::
+
+ $ ghc -E -optP-dM -cpp foo.hs
+ $ cat foo.hspp
+
+(you need a file ``foo.hs``, but it isn't actually used).
+
+``__GLASGOW_HASKELL__``
+ .. index::
+ single: __GLASGOW_HASKELL__
+
+ For version ``x.y.z`` of GHC, the value of ``__GLASGOW_HASKELL__``
+ is the integer ⟨xyy⟩ (if ⟨y⟩ is a single digit, then a leading zero
+ is added, so for example in version 6.2 of GHC,
+ ``__GLASGOW_HASKELL__==602``). More information in
+ :ref:`version-numbering`.
+
+ With any luck, ``__GLASGOW_HASKELL__`` will be undefined in all
+ other implementations that support C-style pre-processing.
+
+ .. note::
+ The comparable symbols for other systems are:
+ ``__HUGS__`` for Hugs, ``__NHC__`` for nhc98, and ``__HBC__`` for
+ hbc).
+
+ NB. This macro is set when pre-processing both Haskell source and C
+ source, including the C source generated from a Haskell module (i.e.
+ ``.hs``, ``.lhs``, ``.c`` and ``.hc`` files).
+
+``__GLASGOW_HASKELL_PATCHLEVEL1__``; \ ``__GLASGOW_HASKELL_PATCHLEVEL2__``
+ .. index::
+ single: __GLASGOW_HASKELL_PATCHLEVEL2__
+
+ .. index::
+ single: __GLASGOW_HASKELL_PATCHLEVEL1__
+
+ These macros are available starting with GHC 7.10.1.
+
+ For three-part GHC version numbers ``x.y.z``, the value of
+ ``__GLASGOW_HASKELL_PATCHLEVEL1__`` is the integer ⟨z⟩.
+
+ For four-part GHC version numbers ``x.y.z.z'``, the value of
+ ``__GLASGOW_HASKELL_PATCHLEVEL1__`` is the integer ⟨z⟩ while the
+ value of ``__GLASGOW_HASKELL_PATCHLEVEL2__`` is set to the integer
+ ⟨z'⟩.
+
+ These macros are provided for allowing finer granularity than is
+ provided by ``__GLASGOW_HASKELL__``. Usually, this should not be
+ necessary as it's expected for most APIs to remain stable between
+ patchlevel releases, but occasionally internal API changes are
+ necessary to fix bugs. Also conditional compilation on the
+ patchlevel can be useful for working around bugs in older releases.
+
+ .. tip::
+ These macros are set when pre-processing both Haskell source and
+ C source, including the C source generated from a Haskell module
+ (i.e. ``.hs``, ``.lhs``, ``.c`` and ``.hc`` files).
+
+``MIN_VERSION_GLASGOW_HASKELL(x,y,z,z')``
+ .. index::
+ single: MIN_VERSION_GLASGOW_HASKELL
+
+ This macro is available starting with GHC 7.10.1.
+
+ This macro is provided for convenience to write CPP conditionals
+ testing whether the GHC version used is version ``x.y.z.z'`` or
+ later.
+
+ If compatibility with Haskell compilers (including GHC prior to
+ version 7.10.1) which do not define ``MIN_VERSION_GLASGOW_HASKELL``
+ is required, the presence of the ``MIN_VERSION_GLASGOW_HASKELL``
+ macro needs to be ensured before it is called, e.g.:
+
+ ::
+
+ #ifdef MIN_VERSION_GLASGOW_HASKELL
+ #if MIN_VERSION_GLASGOW_HASKELL(7,10,2,0)
+ /* code that applies only to GHC 7.10.2 or later */
+ #endif
+ #endif
+
+ .. tip::
+ This macro is set when pre-processing both Haskell source and C
+ source, including the C source generated from a Haskell module (i.e.
+ ``.hs``, ``.lhs``, ``.c`` and ``.hc`` files).
+
+``__GLASGOW_HASKELL_TH__``
+ .. index::
+ single: __GLASGOW_HASKELL_TH__
+
+ This is set to ``YES`` when the compiler supports Template Haskell,
+ and to ``NO`` when not. The latter is the case for a stage-1
+ compiler during bootstrapping, or on architectures where the
+ interpreter is not available.
+
+``__GLASGOW_HASKELL_LLVM__``
+ .. index::
+ single: __GLASGOW_HASKELL_LLVM__
+
+ Only defined when ``-fllvm`` is specified. When GHC is using version
+ ``x.y.z`` of LLVM, the value of ``__GLASGOW_HASKELL_LLVM__`` is the
+ integer ⟨xy⟩.
+
+``__PARALLEL_HASKELL__``
+ .. index::
+ single: __PARALLEL_HASKELL__
+
+ Only defined when ``-parallel`` is in use! This symbol is defined
+ when pre-processing Haskell (input) and pre-processing C (GHC
+ output).
+
+``os_HOST_OS=1``
+ This define allows conditional compilation based on the Operating
+ System, where⟨os⟩ is the name of the current Operating System (eg.
+ ``linux``, ``mingw32`` for Windows, ``solaris``, etc.).
+
+``arch_HOST_ARCH=1``
+ This define allows conditional compilation based on the host
+ architecture, where⟨arch⟩ is the name of the current architecture
+ (eg. ``i386``, ``x86_64``, ``powerpc``, ``sparc``, etc.).
+
+.. _cpp-string-gaps:
+
+CPP and string gaps
+~~~~~~~~~~~~~~~~~~~
+
+.. index::
+ single: -cpp vs string gaps
+ single: string gaps vs -cpp.
+
+A small word of warning: ``-cpp`` is not friendly to "string gaps".
+In other words, strings such as the following:
+
+::
+
+ strmod = "\
+ \ p \
+ \ "
+
+don't work with ``-cpp``; ``/usr/bin/cpp`` elides the backslash-newline
+pairs.
+
+However, it appears that if you add a space at the end of the line, then
+``cpp`` (at least GNU ``cpp`` and possibly other ``cpp``\ s) leaves the
+backslash-space pairs alone and the string gap works as expected.
+
+.. _pre-processor:
+
+Options affecting a Haskell pre-processor
+-----------------------------------------
+
+.. index::
+ single: pre-processing: custom
+ single: pre-processor options
+
+``-F``
+ .. index::
+ single: -F
+
+ A custom pre-processor is run over your Haskell source file only if
+ the ``-F`` option is given.
+
+ Running a custom pre-processor at compile-time is in some settings
+ appropriate and useful. The ``-F`` option lets you run a
+ pre-processor as part of the overall GHC compilation pipeline, which
+ has the advantage over running a Haskell pre-processor separately in
+ that it works in interpreted mode and you can continue to take reap
+ the benefits of GHC's recompilation checker.
+
+ The pre-processor is run just before the Haskell compiler proper
+ processes the Haskell input, but after the literate markup has been
+ stripped away and (possibly) the C pre-processor has washed the
+ Haskell input.
+
+ Use ``-pgmF ⟨cmd⟩`` to select the program to use as the preprocessor.
+ When invoked, the ⟨cmd⟩ pre-processor is given at least three
+ arguments on its command-line: the first argument is the name of the
+ original source file, the second is the name of the file holding the
+ input, and the third is the name of the file where ⟨cmd⟩ should
+ write its output to.
+
+ Additional arguments to the pre-processor can be passed in using the
+ ``-optF`` option. These are fed to ⟨cmd⟩ on the command line after
+ the three standard input and output arguments.
+
+ An example of a pre-processor is to convert your source files to the
+ input encoding that GHC expects, i.e. create a script ``convert.sh``
+ containing the lines:
+
+ ::
+
+ #!/bin/sh
+ ( echo "{-# LINE 1 \"$2\" #-}" ; iconv -f l1 -t utf-8 $2 ) > $3
+
+ and pass ``-F -pgmF convert.sh`` to GHC. The ``-f l1`` option tells
+ iconv to convert your Latin-1 file, supplied in argument ``$2``,
+ while the "-t utf-8" options tell iconv to return a UTF-8 encoded
+ file. The result is redirected into argument ``$3``. The
+ ``echo "{-# LINE 1 \"$2\" #-}"`` just makes sure that your error
+ positions are reported as in the original source file.
+
+.. _options-codegen:
+
+Options affecting code generation
+---------------------------------
+
+``-fasm``
+ .. index::
+ single: -fasm
+
+ Use GHC's :ref:`native code generator <native-code-gen>` rather than
+ compiling via LLVM. ``-fasm`` is the default.
+
+``-fllvm``
+ .. index::
+ single: -fllvm
+
+ Compile via :ref:`LLVM <llvm-code-gen>` instead of using the native
+ code generator. This will generally take slightly longer than the
+ native code generator to compile. Produced code is generally the
+ same speed or faster than the other two code generators. Compiling
+ via LLVM requires LLVM's ``opt`` and ``llc`` executables to be in ``PATH``.
+
+``-fno-code``
+ .. index::
+ single: -fno-code
+
+ Omit code generation (and all later phases) altogether. This is
+ useful if you're only interested in type checking code.
+
+``-fwrite-interface``
+ .. index::
+ single: -fwrite-interface
+
+ Always write interface files. GHC will normally write interface
+ files automatically, but this flag is useful with ``-fno-code``,
+ which normally suppresses generation of interface files. This is
+ useful if you want to type check over multiple runs of GHC without
+ compiling dependencies.
+
+``-fobject-code``
+ .. index::
+ single: -fobject-code
+
+ Generate object code. This is the default outside of GHCi, and can
+ be used with GHCi to cause object code to be generated in preference
+ to bytecode.
+
+``-fbyte-code``
+ .. index::
+ single: -fbyte-code
+
+ Generate byte-code instead of object-code. This is the default in
+ GHCi. Byte-code can currently only be used in the interactive
+ interpreter, not saved to disk. This option is only useful for
+ reversing the effect of ``-fobject-code``.
+
+``-fPIC``
+ .. index::
+ single: -fPIC
+
+ Generate position-independent code (code that can be put into shared
+ libraries). This currently works on Linux x86 and x86-64. On
+ Windows, position-independent code is never used so the flag is a
+ no-op on that platform.
+
+``-dynamic``
+ When generating code, assume that entities imported from a different
+ package will reside in a different shared library or binary.
+
+ Note that using this option when linking causes GHC to link against
+ shared libraries.
+
+.. _options-linker:
+
+Options affecting linking
+-------------------------
+
+.. index::
+ single: linker options
+ single: ld options
+
+GHC has to link your code with various libraries, possibly including:
+user-supplied, GHC-supplied, and system-supplied (``-lm`` math library,
+for example).
+
+``-l ⟨lib⟩``
+ .. index::
+ single: -l
+
+ Link in the ⟨lib⟩ library. On Unix systems, this will be in a file
+ called ``liblib.a`` or ``liblib.so`` which resides somewhere on the
+ library directories path.
+
+ Because of the sad state of most UNIX linkers, the order of such
+ options does matter. If library ⟨foo⟩ requires library ⟨bar⟩, then
+ in general ``-l ⟨foo⟩`` should come *before* ``-l ⟨bar⟩`` on the
+ command line.
+
+ There's one other gotcha to bear in mind when using external
+ libraries: if the library contains a ``main()`` function, then this
+ will be linked in preference to GHC's own ``main()`` function (eg.
+ ``libf2c`` and ``libl`` have their own ``main()``\ s). This is
+ because GHC's ``main()`` comes from the ``HSrts`` library, which is
+ normally included *after* all the other libraries on the linker's
+ command line. To force GHC's ``main()`` to be used in preference to
+ any other ``main()``\ s from external libraries, just add the option
+ ``-lHSrts`` before any other libraries on the command line.
+
+``-c``
+ .. index::
+ single: -c
+
+ Omits the link step. This option can be used with ``--make`` to
+ avoid the automatic linking that takes place if the program contains
+ a ``Main`` module.
+
+``-package ⟨name⟩``
+ .. index::
+ single: -package
+
+ If you are using a Haskell “package” (see :ref:`packages`), don't
+ forget to add the relevant ``-package`` option when linking the
+ program too: it will cause the appropriate libraries to be linked in
+ with the program. Forgetting the ``-package`` option will likely
+ result in several pages of link errors.
+
+``-framework ⟨name⟩``
+ .. index::
+ single: -framework
+
+ On Darwin/OS X/iOS only, link in the framework ⟨name⟩. This option
+ corresponds to the ``-framework`` option for Apple's Linker. Please
+ note that frameworks and packages are two different things -
+ frameworks don't contain any Haskell code. Rather, they are Apple's
+ way of packaging shared libraries. To link to Apple's “Carbon” API,
+ for example, you'd use ``-framework Carbon``.
+
+``-staticlib``
+ .. index::
+ single: -staticlib
+
+ On Darwin/OS X/iOS only, link all passed files into a static library
+ suitable for linking into an iOS (when using a cross-compiler) or
+ Mac Xcode project. To control the name, use the ``-o`` ⟨name⟩ option
+ as usual. The default name is ``liba.a``. This should nearly always
+ be passed when compiling for iOS with a cross-compiler.
+
+``-L ⟨dir⟩``
+ .. index::
+ single: -L
+
+ Where to find user-supplied libraries… Prepend the directory ⟨dir⟩
+ to the library directories path.
+
+``-framework-path ⟨dir⟩``
+ .. index::
+ single: -framework-path
+
+ On Darwin/OS X/iOS only, prepend the directory ⟨dir⟩ to the
+ framework directories path. This option corresponds to the ``-F``
+ option for Apple's Linker (``-F`` already means something else for
+ GHC).
+
+``-split-objs``
+ .. index::
+ single: -split-objs
+
+ Tell the linker to split the single object file that would normally
+ be generated into multiple object files, one per top-level Haskell
+ function or type in the module. This only makes sense for libraries,
+ where it means that executables linked against the library are
+ smaller as they only link against the object files that they need.
+ However, assembling all the sections separately is expensive, so
+ this is slower than compiling normally. Additionally, the size of
+ the library itself (the ``.a`` file) can be a factor of 2 to 2.5
+ larger. We use this feature for building GHC's libraries.
+
+``-static``
+ .. index::
+ single: -static
+
+ Tell the linker to avoid shared Haskell libraries, if possible. This
+ is the default.
+
+``-dynamic``
+ .. index::
+ single: -dynamic
+
+ This flag tells GHC to link against shared Haskell libraries. This
+ flag only affects the selection of dependent libraries, not the form
+ of the current target (see -shared). See :ref:`using-shared-libs` on
+ how to create them.
+
+ Note that this option also has an effect on code generation (see
+ above).
+
+``-shared``
+ .. index::
+ single: -shared
+
+ Instead of creating an executable, GHC produces a shared object with
+ this linker flag. Depending on the operating system target, this
+ might be an ELF DSO, a Windows DLL, or a Mac OS dylib. GHC hides the
+ operating system details beneath this uniform flag.
+
+ The flags ``-dynamic``/``-static`` control whether the resulting
+ shared object links statically or dynamically to Haskell package
+ libraries given as ``-package`` option. Non-Haskell libraries are
+ linked as gcc would regularly link it on your system, e.g. on most
+ ELF system the linker uses the dynamic libraries when found.
+
+ Object files linked into shared objects must be compiled with
+ ``-fPIC``, see :ref:`options-codegen`
+
+ When creating shared objects for Haskell packages, the shared object
+ must be named properly, so that GHC recognizes the shared object
+ when linked against this package. See shared object name mangling.
+
+``-dynload``
+ .. index::
+ single: -dynload
+
+ This flag selects one of a number of modes for finding shared
+ libraries at runtime. See :ref:`finding-shared-libs` for a
+ description of each mode.
+
+``-main-is ⟨thing⟩``
+ .. index::
+ single: -main-is
+ single: specifying your own main function
+
+ The normal rule in Haskell is that your program must supply a
+ ``main`` function in module ``Main``. When testing, it is often
+ convenient to change which function is the "main" one, and the
+ ``-main-is`` flag allows you to do so. The ⟨thing⟩ can be one of:
+
+ - A lower-case identifier ``foo``. GHC assumes that the main
+ function is ``Main.foo``.
+
+ - A module name ``A``. GHC assumes that the main function is
+ ``A.main``.
+
+ - A qualified name ``A.foo``. GHC assumes that the main function is
+ ``A.foo``.
+
+ Strictly speaking, ``-main-is`` is not a link-phase flag at all; it
+ has no effect on the link step. The flag must be specified when
+ compiling the module containing the specified main function (e.g.
+ module ``A`` in the latter two items above). It has no effect for
+ other modules, and hence can safely be given to ``ghc --make``.
+ However, if all the modules are otherwise up to date, you may need
+ to force recompilation both of the module where the new "main" is,
+ and of the module where the "main" function used to be; ``ghc`` is
+ not clever enough to figure out that they both need recompiling. You
+ can force recompilation by removing the object file, or by using the
+ ``-fforce-recomp`` flag.
+
+``-no-hs-main``
+ .. index::
+ single: -no-hs-main
+ single: linking Haskell libraries with foreign code
+
+ In the event you want to include ghc-compiled code as part of
+ another (non-Haskell) program, the RTS will not be supplying its
+ definition of ``main()`` at link-time, you will have to. To signal
+ that to the compiler when linking, use ``-no-hs-main``. See also
+ :ref:`using-own-main`.
+
+ Notice that since the command-line passed to the linker is rather
+ involved, you probably want to use ``ghc`` to do the final link of
+ your \`mixed-language' application. This is not a requirement
+ though, just try linking once with ``-v`` on to see what options the
+ driver passes through to the linker.
+
+ The ``-no-hs-main`` flag can also be used to persuade the compiler
+ to do the link step in ``--make`` mode when there is no Haskell
+ ``Main`` module present (normally the compiler will not attempt
+ linking when there is no ``Main``).
+
+ The flags ``-rtsopts`` and ``-with-rtsopts`` have no effect when
+ used with ``-no-hs-main``, because they are implemented by changing
+ the definition of ``main`` that GHC generates. See
+ :ref:`using-own-main` for how to get the effect of ``-rtsopts`` and
+ ``-with-rtsopts`` when using your own ``main``.
+
+``-debug``
+ .. index::
+ single: -debug
+
+ Link the program with a debugging version of the runtime system. The
+ debugging runtime turns on numerous assertions and sanity checks,
+ and provides extra options for producing debugging output at runtime
+ (run the program with ``+RTS -?`` to see a list).
+
+``-threaded``
+ .. index::
+ single: -threaded
+
+ Link the program with the "threaded" version of the runtime system.
+ The threaded runtime system is so-called because it manages multiple
+ OS threads, as opposed to the default runtime system which is purely
+ single-threaded.
+
+ Note that you do *not* need ``-threaded`` in order to use
+ concurrency; the single-threaded runtime supports concurrency
+ between Haskell threads just fine.
+
+ The threaded runtime system provides the following benefits:
+
+ - It enables the ``-N``\ ``-Nx``\ RTS option RTS option to be used,
+ which allows threads to run in parallelparallelism on a
+ multiprocessormultiprocessorSMP or multicoremulticore machine.
+ See :ref:`using-smp`.
+
+ - If a thread makes a foreign call (and the call is not marked
+ ``unsafe``), then other Haskell threads in the program will
+ continue to run while the foreign call is in progress.
+ Additionally, ``foreign export``\ ed Haskell functions may be
+ called from multiple OS threads simultaneously. See
+ :ref:`ffi-threads`.
+
+``-eventlog``
+ .. index::
+ single: -eventlog
+
+ Link the program with the "eventlog" version of the runtime system.
+ A program linked in this way can generate a runtime trace of events
+ (such as thread start/stop) to a binary file ``program.eventlog``,
+ which can then be interpreted later by various tools. See
+ :ref:`rts-eventlog` for more information.
+
+ ``-eventlog`` can be used with ``-threaded``. It is implied by
+ ``-debug``.
+
+``-rtsopts``
+ .. index::
+ single: -rtsopts
+
+ This option affects the processing of RTS control options given
+ either on the command line or via the ``GHCRTS`` environment
+ variable. There are three possibilities:
+
+ ``-rtsopts=none``
+ Disable all processing of RTS options. If ``+RTS`` appears
+ anywhere on the command line, then the program will abort with
+ an error message. If the ``GHCRTS`` environment variable is set,
+ then the program will emit a warning message, ``GHCRTS`` will be
+ ignored, and the program will run as normal.
+
+ ``-rtsopts=some``
+ [this is the default setting] Enable only the "safe" RTS
+ options: (Currently only ``-?`` and ``--info``.) Any other RTS
+ options on the command line or in the ``GHCRTS`` environment
+ variable causes the program with to abort with an error message.
+
+ ``-rtsopts=all`` or just ``-rtsopts``
+ Enable *all* RTS option processing, both on the command line and
+ through the ``GHCRTS`` environment variable.
+
+ In GHC 6.12.3 and earlier, the default was to process all RTS
+ options. However, since RTS options can be used to write logging
+ data to arbitrary files under the security context of the running
+ program, there is a potential security problem. For this reason, GHC
+ 7.0.1 and later default to ``-rtsops=some``.
+
+ Note that ``-rtsopts`` has no effect when used with ``-no-hs-main``;
+ see :ref:`using-own-main` for details.
+
+``-with-rtsopts``
+ .. index::
+ single: -with-rtsopts
+
+ This option allows you to set the default RTS options at link-time.
+ For example, ``-with-rtsopts="-H128m"`` sets the default heap size
+ to 128MB. This will always be the default heap size for this
+ program, unless the user overrides it. (Depending on the setting of
+ the ``-rtsopts`` option, the user might not have the ability to
+ change RTS options at run-time, in which case ``-with-rtsopts``
+ would be the *only* way to set them.)
+
+ Note that ``-with-rtsopts`` has no effect when used with
+ ``-no-hs-main``; see :ref:`using-own-main` for details.
+
+``-no-rtsopts-suggestions``
+ .. index::
+ single: -no-rtsopts-suggestions
+
+ This option disables RTS suggestions about linking with ``-rtsopts``
+ when they are not available. These suggestions would be unhelpful if
+ the users have installed Haskell programs through their package
+ managers. With this option enabled, these suggestions will not
+ appear. It is recommended for people distributing binaries to build
+ with either ``-rtsopts`` or ``-no-rtsopts-suggestions``.
+
+``-fno-gen-manifest``
+ .. index::
+ single: -fno-gen-manifest
+
+ On Windows, GHC normally generates a manifestmanifest file when
+ linking a binary. The manifest is placed in the file
+ ``prog.exe.manifest`` where ⟨prog.exe⟩ is the name of the
+ executable. The manifest file currently serves just one purpose: it
+ disables the "installer detection"installer detectionin Windows
+ Vista that attempts to elevate privileges for executables with
+ certain names (e.g. names containing "install", "setup" or "patch").
+ Without the manifest file to turn off installer detection,
+ attempting to run an executable that Windows deems to be an
+ installer will return a permission error code to the invoker.
+ Depending on the invoker, the result might be a dialog box asking
+ the user for elevated permissions, or it might simply be a
+ permission denied error.
+
+ Installer detection can be also turned off globally for the system
+ using the security control panel, but GHC by default generates
+ binaries that don't depend on the user having disabled installer
+ detection.
+
+ The ``-fno-gen-manifest`` disables generation of the manifest file.
+ One reason to do this would be if you had a manifest file of your
+ own, for example.
+
+ In the future, GHC might use the manifest file for more things, such
+ as supplying the location of dependent DLLs.
+
+ ``-fno-gen-manifest`` also implies ``-fno-embed-manifest``, see
+ below.
+
+``-fno-embed-manifest``
+ .. index::
+ single: -fno-embed-manifest
+ single: windres
+
+ The manifest file that GHC generates when linking a binary on
+ Windows is also embedded in the executable itself, by default. This
+ means that the binary can be distributed without having to supply
+ the manifest file too. The embedding is done by running
+ ``windres``; to see exactly what GHC does to embed the
+ manifest, use the ``-v`` flag. A GHC installation comes with its own
+ copy of ``windres`` for this reason.
+
+ See also ``-pgmwindres`` (:ref:`replacing-phases`) and
+ ``-optwindres`` (:ref:`forcing-options-through`).
+
+``-fno-shared-implib``
+ .. index::
+ single: -fno-shared-implib
+
+ DLLs on Windows are typically linked to by linking to a
+ corresponding ``.lib`` or ``.dll.a`` — the so-called import library.
+ GHC will typically generate such a file for every DLL you create by
+ compiling in ``-shared`` mode. However, sometimes you don't want to
+ pay the disk-space cost of creating this import library, which can
+ be substantial — it might require as much space as the code itself,
+ as Haskell DLLs tend to export lots of symbols.
+
+ As long as you are happy to only be able to link to the DLL using
+ ``GetProcAddress`` and friends, you can supply the
+ ``-fno-shared-implib`` flag to disable the creation of the import
+ library entirely.
+
+``-dylib-install-name path``
+ .. index::
+ single: -dylib-install-name
+
+ On Darwin/OS X, dynamic libraries are stamped at build time with an
+ "install name", which is the ultimate install path of the library
+ file. Any libraries or executables that subsequently link against it
+ will pick up that path as their runtime search location for it. By
+ default, ghc sets the install name to the location where the library
+ is built. This option allows you to override it with the specified
+ file path. (It passes ``-install_name`` to Apple's linker.) Ignored
+ on other platforms.
+
+``-rdynamic``
+ .. index::
+ single: -rdynamic
+
+ This instructs the linker to add all symbols, not only used ones, to
+ the dynamic symbol table. Currently Linux and Windows/MinGW32 only.
+ This is equivalent to using ``-optl -rdynamic`` on Linux, and
+ ``-optl -export-all-symbols`` on Windows.