- -- opts from -optdll-<blah>
- let extra_ld_opts = getOpts dflags opt_dll
-
- let pstate = pkgState dflags
- rts_pkg = getPackageDetails pstate rtsPackageId
- base_pkg = getPackageDetails pstate basePackageId
-
- 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
- ([ SysTools.Option verb
- , SysTools.Option "-o"
- , SysTools.FileOption "" output_fn
- ]
- ++ map SysTools.Option (
- md_c_flags
- ++ o_files
- ++ extra_os
- ++ [ "--target=i386-mingw32" ]
- ++ 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" ])
- ))
+ SysTools.runLink dflags
+ ([ SysTools.Option verb
+ , SysTools.Option "-o"
+ , SysTools.FileOption "" output_fn
+ , SysTools.Option "-shared"
+ ] ++
+ [ SysTools.FileOption "-Wl,--out-implib=" (output_fn ++ ".a")
+ | dopt Opt_SharedImplib dflags
+ ]
+ ++ map (SysTools.FileOption "") o_files
+ ++ map SysTools.Option (
+ md_c_flags
+
+ -- Permit the linker to auto link _symbol to _imp_symbol
+ -- This lets us link against DLLs without needing an "import library"
+ ++ ["-Wl,--enable-auto-import"]
+
+ ++ extra_ld_inputs
+ ++ lib_path_opts
+ ++ extra_ld_opts
+ ++ pkg_lib_path_opts
+ ++ rtsEnabledObj
+ ++ 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).
+ -- -install_name
+ -- Mac OS/X stores the path where a dynamic library is (to be) installed
+ -- in the library itself. It's called the "install name" of the library.
+ -- Then any library or executable that links against it before it's
+ -- installed will search for it in its ultimate install location. By
+ -- default we set the install name to the absolute path at build time, but
+ -- it can be overridden by the -dylib-install-name option passed to ghc.
+ -- Cabal does this.
+ -----------------------------------------------------------------------------
+
+ let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; }
+
+ instName <- case dylibInstallName dflags of
+ Just n -> return n
+ Nothing -> do
+ pwd <- getCurrentDirectory
+ return $ pwd `combine` output_fn
+ SysTools.runLink dflags
+ ([ SysTools.Option verb
+ , SysTools.Option "-dynamiclib"
+ , SysTools.Option "-o"
+ , SysTools.FileOption "" output_fn
+ ]
+ ++ map SysTools.Option (
+ md_c_flags
+ ++ o_files
+ ++ [ "-undefined", "dynamic_lookup", "-single_module",
+#if !defined(x86_64_TARGET_ARCH)
+ "-Wl,-read_only_relocs,suppress",
+#endif
+ "-install_name", instName ]
+ ++ extra_ld_inputs
+ ++ lib_path_opts
+ ++ extra_ld_opts
+ ++ pkg_lib_path_opts
+ ++ rtsEnabledObj
+ ++ pkg_link_opts
+ ))