-GLOBAL_VAR(v_HCHeader, "", String)
-
------------------------------------------------------------------------------
--- Packages
-
-------------------------
--- The PackageConfigMap is read in from the configuration file
--- It doesn't change during a run
-GLOBAL_VAR(v_Package_details, emptyPkgMap, PackageConfigMap)
-
-readPackageConf :: String -> IO ()
-readPackageConf conf_file = do
- proto_pkg_configs <- loadPackageConfig conf_file
- top_dir <- getTopDir
- old_pkg_map <- readIORef v_Package_details
-
- let pkg_configs = mungePackagePaths top_dir proto_pkg_configs
- new_pkg_map = extendPkgMap old_pkg_map pkg_configs
-
- writeIORef v_Package_details new_pkg_map
-
-getPackageConfigMap :: IO PackageConfigMap
-getPackageConfigMap = readIORef v_Package_details
-
-
-------------------------
--- The package list reflects what was given as command-line options,
--- plus their dependent packages.
--- It is maintained in dependency order;
--- earlier ones depend on later ones, but not vice versa
-GLOBAL_VAR(v_Packages, initPackageList, [PackageName])
-
-getPackages :: IO [PackageName]
-getPackages = readIORef v_Packages
-
-initPackageList = [haskell98Package,
- preludePackage,
- rtsPackage]
-
-addPackage :: String -> IO ()
-addPackage package
- = do { pkg_details <- getPackageConfigMap
- ; ps <- readIORef v_Packages
- ; ps' <- add_package pkg_details ps (mkPackageName package)
- -- Throws an exception if it fails
- ; writeIORef v_Packages ps' }
-
-add_package :: PackageConfigMap -> [PackageName]
- -> PackageName -> IO [PackageName]
-add_package pkg_details ps p
- | p `elem` ps -- Check if we've already added this package
- = return ps
- | Just details <- lookupPkg pkg_details p
- = do { -- Add the package's dependents first
- ps' <- foldM (add_package pkg_details) ps
- (packageDependents details)
- ; return (p : ps') }
-
- | otherwise
- = throwDyn (CmdLineError ("unknown package name: " ++ packageNameString p))
-
-getPackageImportPath :: IO [String]
-getPackageImportPath = do
- ps <- getPackageInfo
- return (nub (filter notNull (concatMap import_dirs ps)))
-
-getPackageIncludePath :: IO [String]
-getPackageIncludePath = do
- ps <- getPackageInfo
- return (nub (filter notNull (concatMap include_dirs ps)))
-
- -- includes are in reverse dependency order (i.e. rts first)
-getPackageCIncludes :: IO [String]
-getPackageCIncludes = do
- ps <- getPackageInfo
- return (reverse (nub (filter notNull (concatMap c_includes ps))))
-
-getPackageLibraryPath :: IO [String]
-getPackageLibraryPath = do
- ps <- getPackageInfo
- return (nub (filter notNull (concatMap library_dirs ps)))
-
-getPackageLibraries :: IO [String]
-getPackageLibraries = do
- ps <- getPackageInfo
- tag <- readIORef v_Build_tag
- let suffix = if null tag then "" else '_':tag
- return (concat (
- map (\p -> map (++suffix) (hACK (hs_libraries p)) ++ extra_libraries p) ps
- ))
- where
- -- This is a totally horrible (temporary) hack, for Win32. Problem is
- -- that package.conf for Win32 says that the main prelude lib is
- -- split into HSbase1, HSbase2 and HSbase3, which is needed due to a bug
- -- in the GNU linker (PEi386 backend). However, we still only
- -- have HSbase.a for static linking, not HSbase{1,2,3}.a
- -- getPackageLibraries is called to find the .a's to add to the static
- -- link line. On Win32, this hACK detects HSbase{1,2,3} and
- -- replaces them with HSbase, so static linking still works.
- -- Libraries needed for dynamic (GHCi) linking are discovered via
- -- different route (in InteractiveUI.linkPackage).
- -- See driver/PackageSrc.hs for the HSbase1/HSbase2 split definition.
- -- THIS IS A STRICTLY TEMPORARY HACK (famous last words ...)
- -- JRS 04 Sept 01: Same appalling hack for HSwin32[1,2]
- -- KAA 29 Mar 02: Same appalling hack for HSobjectio[1,2,3,4]
- hACK libs
-# if !defined(mingw32_TARGET_OS) && !defined(cygwin32_TARGET_OS)
- = libs
-# else
- = if "HSbase1" `elem` libs && "HSbase2" `elem` libs && "HSbase3" `elem` libs
- then "HSbase" : filter (not.(isPrefixOf "HSbase")) libs
- else
- if "HSwin321" `elem` libs && "HSwin322" `elem` libs
- then "HSwin32" : filter (not.(isPrefixOf "HSwin32")) libs
- else
- if "HSobjectio1" `elem` libs && "HSobjectio2" `elem` libs && "HSobjectio3" `elem` libs && "HSobjectio4" `elem` libs
- then "HSobjectio" : filter (not.(isPrefixOf "HSobjectio")) libs
- else
- libs
-# endif
-
-getPackageExtraGhcOpts :: IO [String]
-getPackageExtraGhcOpts = do
- ps <- getPackageInfo
- return (concatMap extra_ghc_opts ps)
-
-getPackageExtraCcOpts :: IO [String]
-getPackageExtraCcOpts = do
- ps <- getPackageInfo
- return (concatMap extra_cc_opts ps)
-
-getPackageExtraLdOpts :: IO [String]
-getPackageExtraLdOpts = do
- ps <- getPackageInfo
- return (concatMap extra_ld_opts ps)
-
-#ifdef darwin_TARGET_OS
-getPackageFrameworkPath :: IO [String]
-getPackageFrameworkPath = do
- ps <- getPackageInfo
- return (nub (filter notNull (concatMap framework_dirs ps)))
-
-getPackageFrameworks :: IO [String]
-getPackageFrameworks = do
- ps <- getPackageInfo
- return (concatMap extra_frameworks ps)
-#endif
-
-getPackageInfo :: IO [PackageConfig]
-getPackageInfo = do ps <- getPackages
- getPackageDetails ps
-
-getPackageDetails :: [PackageName] -> IO [PackageConfig]
-getPackageDetails ps = do
- pkg_details <- getPackageConfigMap
- return [ pkg | Just pkg <- map (lookupPkg pkg_details) ps ]
-
-