[project @ 2005-01-14 08:01:26 by wolfgang]
authorwolfgang <unknown>
Fri, 14 Jan 2005 08:01:32 +0000 (08:01 +0000)
committerwolfgang <unknown>
Fri, 14 Jan 2005 08:01:32 +0000 (08:01 +0000)
commit4f457f34795745c1fad5847d1983887e7666a6b7
tree941cf838edfa5c8914f9a168e712e93fbfd9a510
parent6b46a9846976ac8a4259dff36c043372decf8730
[project @ 2005-01-14 08:01:26 by wolfgang]
Dynamic Linking, Part 2:

Hack the Makefiles to build dynamic libraries.
This allows you to actually use dynamic libraries to greatly reduce binary
sizes on Darwin/PowerPC and on powerpc64-linux (for now).

To use this, add the following to your build.mk

SplitObjs=NO
GhcBuildDylibs=YES
GhcStage2HcOpts=-dynamic
GhcLibHcOpts+=-fPIC -dynamic
GhcRtsHcOpts+=-fPIC -dynamic
GHC_CC_OPTS+=-fPIC

(You can leave out the last three lines on powerpc64-linux).

Then, to compile a program using dynamic libraries, pass the -dynamic option to GHC.
To make GHCi use the dynamic libraries instead of .o files, just delete the HS*.o files.

The dynamic library files are named libHSfoo_dyn.dylib or libHSfoo_dyn.so.

Note that the dynamic and static libraries are build from the same .o files,
but we really want to build the static libraries with SplitObjs and without
-fPIC -dynamic to achieve better code size and performance.

ghc/compiler/ghci/Linker.lhs:
    When looking for a library, look for HSfoo.o first (as before),
    then look for libHSfoo_dyn.[so/dylib] before looking for
    libHSfoo.[so/dylib].

ghc/compiler/main/DriverPipeline.hs:
    Main.dll_o and PrelMain.dll_o are dead, at least for now.

ghc/compiler/main/Packages.lhs:
    When -dynamic is specified, add "_dyn" to all libraries specified in
    hs-libraries (not to the extra-libs).

ghc/lib/compat/Makefile:
    Never build libghccompat as a dynamic lib.

mk/package.mk:
    if GhcBuildDylibs is set to YES, build dynamic libraries.

mk/target.mk:
    When installing .dylibs (Darwin only), update the install_name to point
    to the final location.
    (Somebody please read Apple's documentation on what install_names are,
    and then comment on whether this is a useful feature or whether it should
    be done the "normal" unix way).
ghc/compiler/ghci/Linker.lhs
ghc/compiler/main/DriverPipeline.hs
ghc/compiler/main/Packages.lhs
ghc/lib/compat/Makefile
mk/package.mk
mk/target.mk