diff options
-rw-r--r-- | compiler/backpack/DriverBkp.hs | 1 | ||||
-rw-r--r-- | compiler/ghci/Linker.hs | 3 | ||||
-rw-r--r-- | compiler/main/DriverPipeline.hs | 2 | ||||
-rw-r--r-- | compiler/main/PackageConfig.hs | 1 | ||||
-rw-r--r-- | compiler/main/Packages.hs | 33 | ||||
-rw-r--r-- | compiler/main/SysTools.hs | 2 | ||||
m--------- | libraries/Cabal | 0 | ||||
-rw-r--r-- | libraries/ghc-boot/GHC/PackageDb.hs | 10 | ||||
-rw-r--r-- | utils/ghc-cabal/Main.hs | 4 | ||||
-rw-r--r-- | utils/ghc-pkg/Main.hs | 4 |
10 files changed, 50 insertions, 10 deletions
diff --git a/compiler/backpack/DriverBkp.hs b/compiler/backpack/DriverBkp.hs index 7b35b0c0cd..ccf74c8c9b 100644 --- a/compiler/backpack/DriverBkp.hs +++ b/compiler/backpack/DriverBkp.hs @@ -311,6 +311,7 @@ buildUnit session cid insts lunit = do hsLibraries = [], extraLibraries = [], extraGHCiLibraries = [], + libraryDynDirs = [], libraryDirs = [], frameworks = [], frameworkDirs = [], diff --git a/compiler/ghci/Linker.hs b/compiler/ghci/Linker.hs index 0b3fd94449..a2ca1b514b 100644 --- a/compiler/ghci/Linker.hs +++ b/compiler/ghci/Linker.hs @@ -1182,7 +1182,8 @@ linkPackage hsc_env pkg = do let dflags = hsc_dflags hsc_env platform = targetPlatform dflags - dirs = Packages.libraryDirs pkg + dirs | interpreterDynamic dflags = Packages.libraryDynDirs pkg + | otherwise = Packages.libraryDirs pkg let hs_libs = Packages.hsLibraries pkg -- The FFI GHCi import lib isn't needed as diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index aec89e4e4f..b578612ac4 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -428,7 +428,7 @@ linkingNeeded dflags staticLink linkables pkg_deps = do -- next, check libraries. XXX this only checks Haskell libraries, -- not extra_libraries or -l things from the command line. - let pkg_hslibs = [ (libraryDirs c, lib) + let pkg_hslibs = [ (collectLibraryPaths dflags [c], lib) | Just c <- map (lookupInstalledPackage dflags) pkg_deps, lib <- packageHsLibs dflags c ] diff --git a/compiler/main/PackageConfig.hs b/compiler/main/PackageConfig.hs index bff8cc3aa3..23f37da64d 100644 --- a/compiler/main/PackageConfig.hs +++ b/compiler/main/PackageConfig.hs @@ -103,6 +103,7 @@ pprPackageConfig InstalledPackageInfo {..} = field "trusted" (ppr trusted), field "import-dirs" (fsep (map text importDirs)), field "library-dirs" (fsep (map text libraryDirs)), + field "dynamic-library-dirs" (fsep (map text libraryDynDirs)), field "hs-libraries" (fsep (map text hsLibraries)), field "extra-libraries" (fsep (map text extraLibraries)), field "extra-ghci-libraries" (fsep (map text extraGHCiLibraries)), diff --git a/compiler/main/Packages.hs b/compiler/main/Packages.hs index e0563da10c..86a37352b0 100644 --- a/compiler/main/Packages.hs +++ b/compiler/main/Packages.hs @@ -541,7 +541,8 @@ readPackageConfig dflags conf_file = do let top_dir = topDir dflags pkgroot = takeDirectory conf_file - pkg_configs1 = map (mungePackagePaths top_dir pkgroot) proto_pkg_configs + pkg_configs1 = map (mungePackageConfig top_dir pkgroot) + proto_pkg_configs pkg_configs2 = setBatchPackageFlags dflags pkg_configs1 -- return (conf_file, pkg_configs2) @@ -580,6 +581,22 @@ setBatchPackageFlags dflags pkgs = maybeDistrustAll pkgs distrust pkg = pkg{ trusted = False } +mungePackageConfig :: FilePath -> FilePath + -> PackageConfig -> PackageConfig +mungePackageConfig top_dir pkgroot = + mungeDynLibFields + . mungePackagePaths top_dir pkgroot + +mungeDynLibFields :: PackageConfig -> PackageConfig +mungeDynLibFields pkg = + pkg { + libraryDynDirs = libraryDynDirs pkg + `orIfNull` libraryDirs pkg + } + where + orIfNull [] flags = flags + orIfNull flags _ = flags + -- TODO: This code is duplicated in utils/ghc-pkg/Main.hs mungePackagePaths :: FilePath -> FilePath -> PackageConfig -> PackageConfig -- Perform path/URL variable substitution as per the Cabal ${pkgroot} spec @@ -595,6 +612,7 @@ mungePackagePaths top_dir pkgroot pkg = importDirs = munge_paths (importDirs pkg), includeDirs = munge_paths (includeDirs pkg), libraryDirs = munge_paths (libraryDirs pkg), + libraryDynDirs = munge_paths (libraryDynDirs pkg), frameworkDirs = munge_paths (frameworkDirs pkg), haddockInterfaces = munge_paths (haddockInterfaces pkg), haddockHTMLs = munge_urls (haddockHTMLs pkg) @@ -1459,10 +1477,11 @@ collectIncludeDirs ps = nub (filter notNull (concatMap includeDirs ps)) -- | Find all the library paths in these and the preload packages getPackageLibraryPath :: DynFlags -> [PreloadUnitId] -> IO [String] getPackageLibraryPath dflags pkgs = - collectLibraryPaths `fmap` getPreloadPackagesAnd dflags pkgs + collectLibraryPaths dflags `fmap` getPreloadPackagesAnd dflags pkgs -collectLibraryPaths :: [PackageConfig] -> [FilePath] -collectLibraryPaths ps = nub (filter notNull (concatMap libraryDirs ps)) +collectLibraryPaths :: DynFlags -> [PackageConfig] -> [FilePath] +collectLibraryPaths dflags = nub . filter notNull + . concatMap (libraryDirsForWay dflags) -- | Find all the link options in these and the preload packages, -- returning (package hs lib options, extra library options, other flags) @@ -1514,6 +1533,12 @@ packageHsLibs dflags p = map (mkDynName . addSuffix) (hsLibraries p) expandTag t | null t = "" | otherwise = '_':t +-- | Either the 'libraryDirs' or 'libraryDynDirs' as appropriate for the way. +libraryDirsForWay :: DynFlags -> PackageConfig -> [String] +libraryDirsForWay dflags + | WayDyn `elem` ways dflags = libraryDynDirs + | otherwise = libraryDirs + -- | Find all the C-compiler options in these and the preload packages getPackageExtraCcOpts :: DynFlags -> [PreloadUnitId] -> IO [String] getPackageExtraCcOpts dflags pkgs = do diff --git a/compiler/main/SysTools.hs b/compiler/main/SysTools.hs index e901bde06e..dd98883cb5 100644 --- a/compiler/main/SysTools.hs +++ b/compiler/main/SysTools.hs @@ -1584,7 +1584,7 @@ linkDynLib dflags0 o_files dep_packages pkgs <- getPreloadPackagesAnd dflags dep_packages - let pkg_lib_paths = collectLibraryPaths pkgs + let pkg_lib_paths = collectLibraryPaths dflags pkgs let pkg_lib_path_opts = concatMap get_pkg_lib_path_opts pkg_lib_paths get_pkg_lib_path_opts l | ( osElfTarget (platformOS (targetPlatform dflags)) || diff --git a/libraries/Cabal b/libraries/Cabal -Subproject 3ece1013df8ba4c9719d2183afd2b03c4bddf85 +Subproject a7fb9b9ae733ceb3c52fee68e6e1a6ded5fb91d diff --git a/libraries/ghc-boot/GHC/PackageDb.hs b/libraries/ghc-boot/GHC/PackageDb.hs index f0333d4333..09991092ee 100644 --- a/libraries/ghc-boot/GHC/PackageDb.hs +++ b/libraries/ghc-boot/GHC/PackageDb.hs @@ -83,6 +83,7 @@ data InstalledPackageInfo compid srcpkgid srcpkgname instunitid unitid modulenam extraLibraries :: [String], extraGHCiLibraries :: [String], libraryDirs :: [FilePath], + libraryDynDirs :: [FilePath], frameworks :: [String], frameworkDirs :: [FilePath], ldOptions :: [String], @@ -163,6 +164,7 @@ emptyInstalledPackageInfo = extraLibraries = [], extraGHCiLibraries = [], libraryDirs = [], + libraryDynDirs = [], frameworks = [], frameworkDirs = [], ldOptions = [], @@ -306,7 +308,8 @@ instance (RepInstalledPackageInfo a b c d e f g) => unitId componentId instantiatedWith sourcePackageId packageName packageVersion abiHash depends importDirs - hsLibraries extraLibraries extraGHCiLibraries libraryDirs + hsLibraries extraLibraries extraGHCiLibraries + libraryDirs libraryDynDirs frameworks frameworkDirs ldOptions ccOptions includes includeDirs @@ -327,6 +330,7 @@ instance (RepInstalledPackageInfo a b c d e f g) => put extraLibraries put extraGHCiLibraries put libraryDirs + put libraryDynDirs put frameworks put frameworkDirs put ldOptions @@ -356,6 +360,7 @@ instance (RepInstalledPackageInfo a b c d e f g) => extraLibraries <- get extraGHCiLibraries <- get libraryDirs <- get + libraryDynDirs <- get frameworks <- get frameworkDirs <- get ldOptions <- get @@ -379,7 +384,8 @@ instance (RepInstalledPackageInfo a b c d e f g) => abiHash (map fromStringRep depends) importDirs - hsLibraries extraLibraries extraGHCiLibraries libraryDirs + hsLibraries extraLibraries extraGHCiLibraries + libraryDirs libraryDynDirs frameworks frameworkDirs ldOptions ccOptions includes includeDirs diff --git a/utils/ghc-cabal/Main.hs b/utils/ghc-cabal/Main.hs index e72e46cc99..4b6b496b66 100644 --- a/utils/ghc-cabal/Main.hs +++ b/utils/ghc-cabal/Main.hs @@ -248,6 +248,10 @@ updateInstallDirTemplates relocatableBuild myPrefix myLibdir myDocdir idts if relocatableBuild then "$topdir" else myLibdir, + dynlibdir = toPathTemplate $ + (if relocatableBuild + then "$topdir" + else myLibdir) </> "$libname", libsubdir = toPathTemplate "$libname", docdir = toPathTemplate $ if relocatableBuild diff --git a/utils/ghc-pkg/Main.hs b/utils/ghc-pkg/Main.hs index 4466f58878..063a8067d9 100644 --- a/utils/ghc-pkg/Main.hs +++ b/utils/ghc-pkg/Main.hs @@ -1112,6 +1112,7 @@ convertPackageInfoToCacheFormat pkg = GhcPkg.extraLibraries = extraLibraries pkg, GhcPkg.extraGHCiLibraries = extraGHCiLibraries pkg, GhcPkg.libraryDirs = libraryDirs pkg, + GhcPkg.libraryDynDirs = libraryDynDirs pkg, GhcPkg.frameworks = frameworks pkg, GhcPkg.frameworkDirs = frameworkDirs pkg, GhcPkg.ldOptions = ldOptions pkg, @@ -1624,6 +1625,7 @@ checkPackageConfig pkg verbosity db_stack checkDuplicateDepends (depends pkg) mapM_ (checkDir False "import-dirs") (importDirs pkg) mapM_ (checkDir True "library-dirs") (libraryDirs pkg) + mapM_ (checkDir True "dynamic-library-dirs") (libraryDynDirs pkg) mapM_ (checkDir True "include-dirs") (includeDirs pkg) mapM_ (checkDir True "framework-dirs") (frameworkDirs pkg) mapM_ (checkFile True "haddock-interfaces") (haddockInterfaces pkg) @@ -1632,7 +1634,7 @@ checkPackageConfig pkg verbosity db_stack checkExposedModules db_stack pkg checkOtherModules pkg let has_code = Set.null (openModuleSubstFreeHoles (Map.fromList (instantiatedWith pkg))) - when has_code $ mapM_ (checkHSLib verbosity (libraryDirs pkg)) (hsLibraries pkg) + when has_code $ mapM_ (checkHSLib verbosity (libraryDirs pkg ++ libraryDynDirs pkg)) (hsLibraries pkg) -- ToDo: check these somehow? -- extra_libraries :: [String], -- c_includes :: [String], |