From: Clemens Fruhwirth Date: Tue, 7 Aug 2007 14:40:18 +0000 (+0000) Subject: Link Windows DLLs and OSX dylibs correctly in linkDynLib X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=efae1c61f1a22ea5aec32a9f29ee9d594d8a4ea0 Link Windows DLLs and OSX dylibs correctly in linkDynLib --- diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index e9fb307..e414f4c 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -1296,49 +1296,85 @@ linkDynLib dflags o_files dep_packages = do extra_ld_inputs <- readIORef v_Ld_inputs let (md_c_flags, _) = machdepCCOpts dflags + let extra_ld_opts = getOpts dflags opt_l #if defined(mingw32_HOST_OS) ----------------------------------------------------------------------------- -- Making a DLL ----------------------------------------------------------------------------- - let output_fn = case o_file of { Just s -> s; Nothing -> "HSdll.dll"; } - -- opts from -optdll- - let extra_ld_opts = getOpts dflags opt_dll + SysTools.runLink dflags + ([ SysTools.Option verb + , SysTools.Option "-o" + , SysTools.FileOption "" output_fn + , SysTools.Option "-shared" + , SysTools.Option "-Wl,--export-all-symbols" + , SysTools.FileOption "-Wl,--out-implib=" (output_fn ++ ".a") + ] + ++ map (SysTools.FileOption "") o_files + ++ map SysTools.Option ( + md_c_flags + ++ extra_ld_inputs + ++ lib_path_opts + ++ extra_ld_opts + ++ pkg_lib_path_opts + ++ pkg_link_opts + )) +#elif defined(darwin_TARGET_OS) + ----------------------------------------------------------------------------- + -- Making a darwin dylib + ----------------------------------------------------------------------------- + -- About the options used for Darwin: + -- -dynamiclib + -- Apple's way of saying -shared + -- -undefined dynamic_lookup: + -- Without these options, we'd have to specify the correct dependencies + -- for each of the dylibs. Note that we could (and should) do without this + -- for all libraries except the RTS; all we need to do is to pass the + -- correct HSfoo_dyn.dylib files to the link command. + -- This feature requires Mac OS X 10.3 or later; there is a similar feature, + -- -flat_namespace -undefined suppress, which works on earlier versions, + -- but it has other disadvantages. + -- -single_module + -- Build the dynamic library as a single "module", i.e. no dynamic binding + -- nonsense when referring to symbols from within the library. The NCG + -- assumes that this option is specified (on i386, at least). + -- -Wl,-macosx_version_min -Wl,10.3 + -- Tell the linker its safe to assume that the library will run on 10.3 or + -- later, so that it will not complain about the use of the option + -- -undefined dynamic_lookup above. + -- -install_name + -- Causes the dynamic linker to ignore the DYLD_LIBRARY_PATH when loading + -- this lib and instead look for it at its absolute path. + -- When installing the .dylibs (see target.mk), we'll change that path to + -- point to the place they are installed. Therefore, we won't have to set + -- up DYLD_LIBRARY_PATH specifically for ghc. + ----------------------------------------------------------------------------- - let pstate = pkgState dflags - rts_pkg = getPackageDetails pstate rtsPackageId - base_pkg = getPackageDetails pstate basePackageId + let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; } - let extra_os = if static || no_hs_main - then [] - else [ head (libraryDirs rts_pkg) ++ "/Main.dll_o", - head (libraryDirs base_pkg) ++ "/PrelMain.dll_o" ] - SysTools.runMkDLL dflags + pwd <- getCurrentDirectory + SysTools.runLink dflags ([ SysTools.Option verb + , SysTools.Option "-dynamiclib" , SysTools.Option "-o" , SysTools.FileOption "" output_fn ] ++ map SysTools.Option ( md_c_flags ++ o_files - ++ extra_os - ++ [ "--target=i386-mingw32" ] + ++ [ "-undefined", "dynamic_lookup", "-single_module", "-Wl,-macosx_version_min","-Wl,10.3", "-install_name " ++ (pwd `joinFileName` output_fn) ] ++ extra_ld_inputs ++ lib_path_opts ++ extra_ld_opts ++ pkg_lib_path_opts ++ pkg_link_opts - ++ (if "--def" `elem` (concatMap words extra_ld_opts) - then [ "" ] - else [ "--export-all" ]) )) #else ----------------------------------------------------------------------------- -- Making a DSO ----------------------------------------------------------------------------- - -- opts from -optl- - let extra_ld_opts = getOpts dflags opt_l + let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; } SysTools.runLink dflags