diff options
author | wolfgang <unknown> | 2005-01-14 08:01:32 +0000 |
---|---|---|
committer | wolfgang <unknown> | 2005-01-14 08:01:32 +0000 |
commit | 4f457f34795745c1fad5847d1983887e7666a6b7 (patch) | |
tree | 941cf838edfa5c8914f9a168e712e93fbfd9a510 /ghc/compiler/ghci/Linker.lhs | |
parent | 6b46a9846976ac8a4259dff36c043372decf8730 (diff) | |
download | haskell-4f457f34795745c1fad5847d1983887e7666a6b7.tar.gz |
[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).
Diffstat (limited to 'ghc/compiler/ghci/Linker.lhs')
-rw-r--r-- | ghc/compiler/ghci/Linker.lhs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/ghc/compiler/ghci/Linker.lhs b/ghc/compiler/ghci/Linker.lhs index 5b59b9d6fd..f897eecb15 100644 --- a/ghc/compiler/ghci/Linker.lhs +++ b/ghc/compiler/ghci/Linker.lhs @@ -822,9 +822,14 @@ locateOneObj dirs lib = do { mb_obj_path <- findFile mk_obj_path dirs ; case mb_obj_path of Just obj_path -> return (Object obj_path) - Nothing -> return (DLL lib) } -- We assume + Nothing -> + do { mb_lib_path <- findFile mk_dyn_lib_path dirs + ; case mb_lib_path of + Just lib_path -> return (DLL (lib ++ "_dyn")) + Nothing -> return (DLL lib) }} -- We assume where mk_obj_path dir = dir ++ '/':lib ++ ".o" + mk_dyn_lib_path dir = dir ++ '/':mkSOName (lib ++ "_dyn") -- ---------------------------------------------------------------------------- |