<varlistentry>
<term>
+ <option>-pgmlo</option> <replaceable>cmd</replaceable>
+ <indexterm><primary><option>-pgmlo</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Use <replaceable>cmd</replaceable> as the LLVM
+ optimiser.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-pgmlc</option> <replaceable>cmd</replaceable>
+ <indexterm><primary><option>-pgmlc</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Use <replaceable>cmd</replaceable> as the LLVM
+ compiler.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-pgms</option> <replaceable>cmd</replaceable>
+ <indexterm><primary><option>-pgms</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Use <replaceable>cmd</replaceable> as the
+ splitter.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<option>-pgma</option> <replaceable>cmd</replaceable>
<indexterm><primary><option>-pgma</option></primary></indexterm>
</term>
<varlistentry>
<term>
- <option>-pgmdep</option> <replaceable>cmd</replaceable>
- <indexterm><primary><option>-pgmdep</option></primary></indexterm>
+ <option>-pgmF</option> <replaceable>cmd</replaceable>
+ <indexterm><primary><option>-pgmF</option></primary></indexterm>
</term>
<listitem>
- <para>Use <replaceable>cmd</replaceable> as the dependency
- generator.</para>
+ <para>Use <replaceable>cmd</replaceable> as the
+ pre-processor (with <option>-F</option> only).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
- <option>-pgmF</option> <replaceable>cmd</replaceable>
- <indexterm><primary><option>-pgmF</option></primary></indexterm>
+ <option>-pgmwindres</option> <replaceable>cmd</replaceable>
+ <indexterm><primary><option>-pgmwindres</option></primary></indexterm>
</term>
<listitem>
<para>Use <replaceable>cmd</replaceable> as the
- pre-processor (with <option>-F</option> only).</para>
+ program to use for embedding manifests on Windows. Normally this
+ is the program <literal>windres</literal>, which is supplied with a
+ GHC installation. See <option>-fno-embed-manifest</option> in <xref
+ linkend="options-linker" />.</para>
</listitem>
</varlistentry>
-
-
</variablelist>
</sect2>
<title>Forcing options to a particular phase</title>
<indexterm><primary>forcing GHC-phase options</primary></indexterm>
- <para>Options can be forced through to a particlar compilation
+ <para>Options can be forced through to a particular compilation
phase, using the following flags:</para>
<variablelist>
</varlistentry>
<varlistentry>
<term>
+ <option>-optlo</option> <replaceable>option</replaceable>
+ <indexterm><primary><option>-optlo</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the LLVM optimiser.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ <option>-optlc</option> <replaceable>option</replaceable>
+ <indexterm><primary><option>-optlc</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the LLVM compiler.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ <option>-optm</option> <replaceable>option</replaceable>
+ <indexterm><primary><option>-optm</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the mangler.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
<option>-opta</option> <replaceable>option</replaceable>
<indexterm><primary><option>-opta</option></primary></indexterm>
</term>
</varlistentry>
<varlistentry>
<term>
- <option>-optdep</option> <replaceable>option</replaceable>
- <indexterm><primary><option>-optdep</option></primary></indexterm>
+ <option>-optwindres</option> <replaceable>option</replaceable>
+ <indexterm><primary><option>-optwindres</option></primary></indexterm>
</term>
<listitem>
- <para>Pass <replaceable>option</replaceable> to the
- dependency generator.</para>
+ <para>Pass <replaceable>option</replaceable> to
+ <literal>windres</literal> when embedding manifests on Windows.
+ See <option>-fno-embed-manifest</option> in <xref
+ linkend="options-linker" />.</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<varlistentry>
<term>
- <constant>__HASKELL98__</constant>
- <indexterm><primary><literal>__HASKELL98__</literal></primary></indexterm>
- </term>
- <listitem>
- <para>If defined, this means that GHC supports the
- language defined by the Haskell 98 report.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <constant>__HASKELL__=98</constant>
- <indexterm><primary><constant>__HASKELL__=98</constant></primary></indexterm>
- </term>
- <listitem>
- <para>In GHC 4.04 and later, the
- <constant>__HASKELL__</constant>
- macro is defined as having the value
- <constant>98</constant>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <constant>__HASKELL1__</constant>
- <indexterm><primary><constant>__HASKELL1__</constant></primary></indexterm>
- </term>
- <listitem>
- <para>If defined to <replaceable>n</replaceable>, that
- means GHC supports the Haskell language defined in the
- Haskell report version <emphasis>1.n</emphasis>.
- Currently 5. This macro is deprecated, and will probably
- disappear in future versions.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
<constant>__GLASGOW_HASKELL__</constant>
<indexterm><primary><constant>__GLASGOW_HASKELL__</constant></primary></indexterm>
</term>
</varlistentry>
<varlistentry>
- <term>
- <constant>__CONCURRENT_HASKELL__</constant>
- <indexterm><primary><constant>__CONCURRENT_HASKELL__</constant></primary></indexterm>
- </term>
- <listitem>
- <para>This symbol is defined when pre-processing Haskell
- (input) and pre-processing C (GHC output). Since GHC from
- verion 4.00 now supports concurrent haskell by default,
- this symbol is always defined.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
+ <term>
<constant>__PARALLEL_HASKELL__</constant>
<indexterm><primary><constant>__PARALLEL_HASKELL__</constant></primary></indexterm>
</term>
- <listitem>
- <para>Only defined when <option>-parallel</option> is in
+ <listitem>
+ <para>Only defined when <option>-parallel</option> is in
use! This symbol is defined when pre-processing Haskell
(input) and pre-processing C (GHC output).</para>
- </listitem>
+ </listitem>
</varlistentry>
<varlistentry>
- <term>
+ <term>
<constant><replaceable>os</replaceable>_HOST_OS=1</constant>
</term>
- <listitem>
- <para>This define allows conditional compilation based on
+ <listitem>
+ <para>This define allows conditional compilation based on
the Operating System, where<replaceable>os</replaceable> is
the name of the current Operating System
(eg. <literal>linux</literal>, <literal>mingw32</literal>
for Windows, <literal>solaris</literal>, etc.).</para>
- </listitem>
+ </listitem>
</varlistentry>
-
+
<varlistentry>
- <term>
+ <term>
<constant><replaceable>arch</replaceable>_HOST_ARCH=1</constant>
</term>
- <listitem>
- <para>This define allows conditional compilation based on
+ <listitem>
+ <para>This define allows conditional compilation based on
the host architecture, where<replaceable>arch</replaceable>
is the name of the current architecture
(eg. <literal>i386</literal>, <literal>x86_64</literal>,
<literal>powerpc</literal>, <literal>sparc</literal>,
etc.).</para>
- </listitem>
+ </listitem>
</varlistentry>
</variablelist>
are fed to <replaceable>cmd</replaceable> on the command
line after the three standard input and output
arguments.</para>
+
+ <para>
+ An example of a pre-processor is to convert your source files to the
+ input encoding that GHC expects, i.e. create a script
+ <literal>convert.sh</literal> containing the lines:
+ </para>
+
+<screen>#!/bin/sh
+( echo "{-# LINE 1 \"$2\" #-}" ; iconv -f l1 -t utf-8 $2 ) > $3</screen>
+
+ <para>and pass <literal>-F -pgmF convert.sh</literal> to GHC.
+ The <literal>-f l1</literal> option tells iconv to convert your
+ Latin-1 file, supplied in argument <literal>$2</literal>, while
+ the "-t utf-8" options tell iconv to return a UTF-8 encoded file.
+ The result is redirected into argument <literal>$3</literal>.
+ The <literal>echo "{-# LINE 1 \"$2\" #-}"</literal>
+ just makes sure that your error positions are reported as
+ in the original source file.</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
- <sect2 id="options-C-compiler">
- <title>Options affecting the C compiler (if applicable)</title>
-
- <indexterm><primary>include-file options</primary></indexterm>
- <indexterm><primary>C compiler options</primary></indexterm>
- <indexterm><primary>GCC options</primary></indexterm>
-
- <para>If you are compiling with lots of foreign calls, you may
- need to tell the C compiler about some
- <literal>#include</literal> files. The Right Way to do this is to
- add an <literal>INCLUDE</literal> pragma to the top of your source file
- (<xref linkend="include-pragma" />):</para>
-
-<programlisting>{-# INCLUDE <X/Xlib.h> #-}</programlisting>
-
- <para>Sometimes this isn't convenient. In those cases there's an
- equivalent command-line option:</para>
-
-<screen>% ghc -c '-#include <X/Xlib.h>' Xstuff.lhs</screen>
-
- <indexterm><primary><option>-#include</option></primary>
- </indexterm>
-
- </sect2>
-
<sect2 id="options-codegen">
<title>Options affecting code generation</title>
</term>
<listitem>
<para>Use GHC's native code generator rather than
- compiling via C. This will compile faster (up to twice as
- fast), but may produce code that is slightly slower than
- compiling via C. <option>-fasm</option> is the default
- when optimisation is off (see <xref
- linkend="options-optimise"/>).</para>
+ compiling via LLVM.
+ <option>-fasm</option> is the default.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
- <option>-fvia-C</option>
- <indexterm><primary><option>-fvia-C</option></primary></indexterm>
+ <option>-fllvm</option>
+ <indexterm><primary><option>-fllvm</option></primary></indexterm>
</term>
<listitem>
- <para>Compile via C instead of using the native code
- generator. This is default for optimised compilations,
- and on architectures for which GHC doesn't have a native
- code generator.</para>
+ <para>Compile via LLVM 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 version 2.7 or later to be on the path.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
+ <option>-fobject-code</option>
+ <indexterm><primary><option>-fobject-code</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>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.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-fbyte-code</option>
+ <indexterm><primary><option>-fbyte-code</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>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
+ <option>-fobject-code</option>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<option>-fPIC</option>
<indexterm><primary><option>-fPIC</option></primary></indexterm>
</term>
<listitem>
<para>Generate position-independent code (code that can be put into
- shared libraries). This currently works on Mac OS X; it works on
- PowerPC Linux when using the native code generator (-fasm).
- It is not quite ready to be used yet for x86 Linux.
- On Windows, position-independent code is never used,
- and on PowerPC64 Linux, position-independent code is always used,
- so the flag is a no-op on those platforms.</para>
+ shared libraries). This currently works on Linux x86 and x86-64 when
+ using the native code generator (-fasm).
+ On Windows, position-independent code is never used
+ so the flag is a no-op on that platform.</para>
</listitem>
</varlistentry>
<listitem>
<para>When generating code, assume that entities imported from a
different package will reside in a different shared library or
- binary. This currently works on Mac OS X; it works on PowerPC Linux when
- using the native code generator. As with <option>-fPIC</option>,
- x86 Linux support is not quite ready yet. Windows is not supported,
- and it is a no-op on PowerPC64 Linux.</para>
- <para>Note that this option also causes GHC to use shared libraries
- when linking.</para>
+ binary.</para>
+ <para>Note that using this option when linking causes GHC to link
+ against shared libraries.</para>
</listitem>
</varlistentry>
</variablelist>
</term>
<listitem>
<para>Omits the link step. This option can be used with
- <option>––make</option> to avoid the automatic linking
- that takes place if the program contains a <literal>Main</literal>
- module.</para>
- </listitem>
+ <option>––make</option> to avoid the automatic linking
+ that takes place if the program contains a <literal>Main</literal>
+ module.</para>
+ </listitem>
</varlistentry>
<varlistentry>
<indexterm><primary><option>-dynamic</option></primary></indexterm>
</term>
<listitem>
- <para>Tell the linker to use shared Haskell libraries, if
- available (this option is only supported on Mac OS X at the
- moment, and also note that your distribution of GHC may
- not have been supplied with shared libraries).</para>
+ <para>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 <xref linkend="using-shared-libs" /> on how to
+ create them.</para>
+
<para>Note that this option also has an effect on
code generation (see above).</para>
</listitem>
<varlistentry>
<term>
+ <option>-shared</option>
+ <indexterm><primary><option>-shared</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>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.</para>
+
+ <para>The flags <option>-dynamic</option>/<option>-static</option> control whether the
+ resulting shared object links statically or dynamically to
+ Haskell package libraries given as <option>-package</option> 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.</para>
+
+ <para>Object files linked into shared objects must be
+ compiled with <option>-fPIC</option>, see <xref linkend="options-codegen" /></para>
+
+ <para>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.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-dynload</option>
+ <indexterm><primary><option>-dynload</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>
+ This flag selects one of a number of modes for finding shared
+ libraries at runtime. See <xref linkend="finding-shared-libs"/> for
+ a description of each mode.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<option>-main-is <replaceable>thing</replaceable></option>
<indexterm><primary><option>-main-is</option></primary></indexterm>
<indexterm><primary>specifying your own main function</primary></indexterm>
to change which function is the "main" one, and the <option>-main-is</option> flag
allows you to do so. The <replaceable>thing</replaceable> can be one of:
<itemizedlist>
- <listitem><para>A lower-case identifier <literal>foo</literal>. GHC assumes that the main function is <literal>Main.foo</literal>.</para></listitem>
- <listitem><para>An module name <literal>A</literal>. GHC assumes that the main function is <literal>A.main</literal>.</para></listitem>
- <listitem><para>An qualified name <literal>A.foo</literal>. GHC assumes that the main function is <literal>A.foo</literal>.</para></listitem>
- </itemizedlist>
+ <listitem><para>A lower-case identifier <literal>foo</literal>. GHC assumes that the main function is <literal>Main.foo</literal>.</para></listitem>
+ <listitem><para>An module name <literal>A</literal>. GHC assumes that the main function is <literal>A.main</literal>.</para></listitem>
+ <listitem><para>An qualified name <literal>A.foo</literal>. GHC assumes that the main function is <literal>A.foo</literal>.</para></listitem>
+ </itemizedlist>
Strictly speaking, <option>-main-is</option> 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 <literal>A</literal>
in the latter two items above). It has no effect for other modules,
and hence can safely be given to <literal>ghc --make</literal>.
- 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;
- <literal>ghc</literal> 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
- <option>-no-recomp</option> flag.
+ 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;
+ <literal>ghc</literal> 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
+ <option>-fforce-recomp</option> flag.
</para>
</listitem>
</varlistentry>
<itemizedlist>
<listitem>
<para>Parallelism<indexterm><primary>parallelism</primary></indexterm> on a multiprocessor<indexterm><primary>multiprocessor</primary></indexterm><indexterm><primary>SMP</primary></indexterm> or multicore<indexterm><primary>multicore</primary></indexterm>
- machine. See <xref linkend="sec-using-smp" />.</para>
+ machine. See <xref linkend="using-smp" />.</para>
<para>The ability to make a foreign call that does not
- block all other Haskell threads.</para>
-
- <para>The ability to invoke foreign exported Haskell
- functions from multiple OS threads.</para>
+ block all other Haskell threads, and to invoke
+ foreign-exported Haskell functions from multiple OS
+ threads. See <xref linkend="ffi-threads" />.</para>
</listitem>
</itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-eventlog</option>
+ <indexterm><primary><option>-eventlog</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>
+ 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
+ <literal><replaceable>program</replaceable>.eventlog</literal>,
+ which can then be interpreted later by various tools. See
+ <xref linkend="rts-eventlog" /> for more information.
+ </para>
+ <para>
+ <option>-eventlog</option> can be used
+ with <option>-threaded</option>. It is implied
+ by <option>-debug</option>.
+ </para>
+ </listitem>
+ </varlistentry>
- <para>With <option>-threaded</option>, calls to foreign
- functions are made using the same OS thread that created the
- Haskell thread (if it was created by a call to a foreign
- exported Haskell function), or an arbitrary OS thread
- otherwise (if the Haskell thread was created by
- <literal>forkIO</literal>).</para>
+ <varlistentry>
+ <term>
+ <option>-rtsopts</option>
+ <indexterm><primary><option>-rtsopts</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>
+ This option affects the processing of RTS control options given either
+ on the command line or via the <envar>GHCRTS</envar> environment variable.
+ There are three possibilities:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term><option>-rtsopts=none</option></term>
+ <listitem>
+ <para>
+ Disable all processing of RTS options.
+ If <option>+RTS</option> appears anywhere on the command
+ line, then the program will abort with an error message.
+ If the <envar>GHCRTS</envar> environment variable is
+ set, then the program will emit a warning message,
+ <envar>GHCRTS</envar> will be ignored, and the program
+ will run as normal.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-rtsopts=some</option></term>
+ <listitem>
+ <para>[this is the default setting] Enable
+ only the "safe" RTS options: (Currently
+ only <option>-?</option>
+ and <option>--info</option>.) Any other RTS options
+ on the command line or in the <envar>GHCRTS</envar>
+ environment variable causes the program with to abort
+ with an error message.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-rtsopts=all</option>, or
+ just <option>-rtsopts</option></term>
+ <listitem>
+ <para>
+ Enable <emphasis>all</emphasis> RTS option
+ processing, both on the command line and through
+ the <envar>GHCRTS</envar> environment variable.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <para>
+ 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 <option>-rtsops=some</option>.
+ </para>
+ </listitem>
+ </varlistentry>
- <para>More details on the use of "bound threads" in the
- threaded runtime can be found in the <ulink
- url="../libraries/base/Control.Concurrent.html"><literal>Control.Concurrent</literal></ulink> module.</para>
+ <varlistentry>
+ <term>
+ <option>-with-rtsopts</option>
+ <indexterm><primary><option>-with-rtsopts</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>
+ This option allows you to set the default RTS options at link-time. For example,
+ <option>-with-rtsopts="-H128m"</option> 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 <option>-rtsopts</option> option, the user might
+ not have the ability to change RTS options at run-time, in which case
+ <option>-with-rtsopts</option> would be the <emphasis>only</emphasis> way to set
+ them.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-fno-gen-manifest</option>
+ <indexterm><primary><option>-fno-gen-manifest</option></primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>On Windows, GHC normally generates a
+ <firstterm>manifest</firstterm><indexterm><primary>manifest</primary>
+ </indexterm>file when linking a binary. The
+ manifest is placed in the file
+ <literal><replaceable>prog</replaceable>.exe.manifest</literal>
+ where <replaceable>prog.exe</replaceable> is the name of the
+ executable. The manifest file currently serves just one purpose:
+ it disables the "installer detection"<indexterm><primary>installer detection</primary>
+ </indexterm>in 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.</para>
+
+ <para>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.</para>
+
+ <para>The <option>-fno-gen-manifest</option> disables generation of
+ the manifest file. One reason to do this would be if you had
+ a manifest file of your own, for example.</para>
+
+ <para>In the future, GHC might use the manifest file for more things,
+ such as supplying the location of dependent DLLs.</para>
+
+ <para><option>-fno-gen-manifest</option> also implies
+ <option>-fno-embed-manifest</option>, see below.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-fno-embed-manifest</option>
+ <indexterm><primary><option>-fno-embed-manifest</option></primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>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
+ <literal>windres</literal><indexterm><primary><literal>windres</literal></primary>
+ </indexterm>; to see exactly what GHC does to embed the manifest,
+ use the <option>-v</option> flag. A GHC installation comes with
+ its own copy of <literal>windres</literal> for this reason.</para>
+
+ <para>See also <option>-pgmwindres</option> (<xref
+ linkend="replacing-phases" />) and
+ <option>-optwindres</option> (<xref
+ linkend="forcing-options-through"
+ />).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-fno-shared-implib</option>
+ <indexterm><primary><option>-fno-shared-implib</option></primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>DLLs on Windows are typically linked to by linking to a corresponding
+ <literal>.lib</literal> or <literal>.dll.a</literal> - the so-called import library.
+ GHC will typically generate such a file for every DLL you create by compiling in
+ <literal>-shared</literal> 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.</para>
+
+ <para>As long as you are happy to only be able to link to the DLL using
+ <literal>GetProcAddress</literal> and friends, you can supply the
+ <option>-fno-shared-implib</option> flag to disable the creation of the import
+ library entirely.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <option>-dylib-install-name <replaceable>path</replaceable></option>
+ <indexterm><primary><option>-dylib-install-name</option></primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>On Darwin/MacOS 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
+ <literal>-install_name</literal> to Apple's linker.) Ignored on other
+ platforms.</para>
</listitem>
</varlistentry>
</variablelist>
<!-- Emacs stuff:
;;; Local Variables: ***
- ;;; mode: xml ***
;;; sgml-parent-document: ("users_guide.xml" "book" "chapter" "sect1") ***
;;; End: ***
-->