{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
module Distribution.Simple.LocalBuildInfo
( LocalBuildInfo (..)
, localComponentId
, localUnitId
, localCompatPackageKey
, buildDir
, packageRoot
, progPrefix
, progSuffix
, interpretSymbolicPathLBI
, mbWorkDirLBI
, absoluteWorkingDirLBI
, buildWays
, Component (..)
, ComponentName (..)
, LibraryName (..)
, defaultLibName
, showComponentName
, componentNameString
, ComponentLocalBuildInfo (..)
, componentBuildDir
, foldComponent
, componentName
, componentBuildInfo
, componentBuildable
, pkgComponents
, pkgBuildableComponents
, lookupComponent
, getComponent
, allComponentsInBuildOrder
, depLibraryPaths
, allLibModules
, withAllComponentsInBuildOrder
, withLibLBI
, withExeLBI
, withBenchLBI
, withTestLBI
, enabledTestLBIs
, enabledBenchLBIs
, module Distribution.Simple.InstallDirs
, absoluteInstallDirs
, prefixRelativeInstallDirs
, absoluteInstallCommandDirs
, absoluteComponentInstallDirs
, prefixRelativeComponentInstallDirs
, substPathTemplate
) where
import Distribution.Compat.Prelude
import Prelude ()
import Distribution.Types.Component
import Distribution.Types.ComponentLocalBuildInfo
import Distribution.Types.ComponentName
import Distribution.Types.LocalBuildInfo
import Distribution.Types.PackageDescription
import Distribution.Types.PackageId
import Distribution.Types.TargetInfo
import Distribution.Types.UnitId
import Distribution.Types.UnqualComponentName
import qualified Distribution.Compat.Graph as Graph
import qualified Distribution.InstalledPackageInfo as Installed
import Distribution.ModuleName
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Pretty
import Distribution.Simple.Compiler
import Distribution.Simple.Flag
import Distribution.Simple.InstallDirs hiding
( absoluteInstallDirs
, prefixRelativeInstallDirs
, substPathTemplate
)
import qualified Distribution.Simple.InstallDirs as InstallDirs
import Distribution.Simple.PackageIndex
import Distribution.Simple.Setup.Common
import Distribution.Simple.Setup.Config
import Distribution.Simple.Utils
import Distribution.Utils.Path
import Data.List (stripPrefix)
import qualified System.Directory as Directory
( canonicalizePath
, doesDirectoryExist
)
componentBuildDir :: LocalBuildInfo -> ComponentLocalBuildInfo -> SymbolicPath Pkg (Dir Build)
componentBuildDir :: LocalBuildInfo
-> ComponentLocalBuildInfo
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build)
componentBuildDir LocalBuildInfo
lbi ComponentLocalBuildInfo
clbi =
(LocalBuildInfo -> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build)
buildDir LocalBuildInfo
lbi SymbolicPathX 'AllowAbsolute Pkg ('Dir Build)
-> SymbolicPathX 'OnlyRelative Build ('Dir Build)
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build)
forall p q r. PathLike p q r => p -> q -> r
</>) (SymbolicPathX 'OnlyRelative Build ('Dir Build)
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build))
-> SymbolicPathX 'OnlyRelative Build ('Dir Build)
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build)
forall a b. (a -> b) -> a -> b
$
[Char] -> SymbolicPathX 'OnlyRelative Build ('Dir Build)
forall from (to :: FileOrDir).
HasCallStack =>
[Char] -> RelativePath from to
makeRelativePathEx ([Char] -> SymbolicPathX 'OnlyRelative Build ('Dir Build))
-> [Char] -> SymbolicPathX 'OnlyRelative Build ('Dir Build)
forall a b. (a -> b) -> a -> b
$
case ComponentLocalBuildInfo -> ComponentName
componentLocalName ComponentLocalBuildInfo
clbi of
CLibName LibraryName
LMainLibName ->
if UnitId -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
clbi) [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== ComponentId -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (ComponentLocalBuildInfo -> ComponentId
componentComponentId ComponentLocalBuildInfo
clbi)
then [Char]
""
else UnitId -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
clbi)
CLibName (LSubLibName UnqualComponentName
s) ->
if UnitId -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
clbi) [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== ComponentId -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (ComponentLocalBuildInfo -> ComponentId
componentComponentId ComponentLocalBuildInfo
clbi)
then UnqualComponentName -> [Char]
unUnqualComponentName UnqualComponentName
s
else UnitId -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
clbi)
CFLibName UnqualComponentName
s -> UnqualComponentName -> [Char]
unUnqualComponentName UnqualComponentName
s
CExeName UnqualComponentName
s -> UnqualComponentName -> [Char]
unUnqualComponentName UnqualComponentName
s
CTestName UnqualComponentName
s -> UnqualComponentName -> [Char]
unUnqualComponentName UnqualComponentName
s
CBenchName UnqualComponentName
s -> UnqualComponentName -> [Char]
unUnqualComponentName UnqualComponentName
s
interpretSymbolicPathLBI :: LocalBuildInfo -> SymbolicPathX allowAbsolute Pkg to -> FilePath
interpretSymbolicPathLBI :: forall (allowAbsolute :: AllowAbsolute) (to :: FileOrDir).
LocalBuildInfo -> SymbolicPathX allowAbsolute Pkg to -> [Char]
interpretSymbolicPathLBI LocalBuildInfo
lbi =
Maybe (SymbolicPath CWD ('Dir Pkg))
-> SymbolicPathX allowAbsolute Pkg to -> [Char]
forall from (allowAbsolute :: AllowAbsolute) (to :: FileOrDir).
Maybe (SymbolicPath CWD ('Dir from))
-> SymbolicPathX allowAbsolute from to -> [Char]
interpretSymbolicPath (LocalBuildInfo -> Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDirLBI LocalBuildInfo
lbi)
mbWorkDirLBI :: LocalBuildInfo -> Maybe (SymbolicPath CWD (Dir Pkg))
mbWorkDirLBI :: LocalBuildInfo -> Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDirLBI =
Flag (SymbolicPath CWD ('Dir Pkg))
-> Maybe (SymbolicPath CWD ('Dir Pkg))
forall a. Flag a -> Maybe a
flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg))
-> Maybe (SymbolicPath CWD ('Dir Pkg)))
-> (LocalBuildInfo -> Flag (SymbolicPath CWD ('Dir Pkg)))
-> LocalBuildInfo
-> Maybe (SymbolicPath CWD ('Dir Pkg))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CommonSetupFlags -> Flag (SymbolicPath CWD ('Dir Pkg))
setupWorkingDir (CommonSetupFlags -> Flag (SymbolicPath CWD ('Dir Pkg)))
-> (LocalBuildInfo -> CommonSetupFlags)
-> LocalBuildInfo
-> Flag (SymbolicPath CWD ('Dir Pkg))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConfigFlags -> CommonSetupFlags
configCommonFlags (ConfigFlags -> CommonSetupFlags)
-> (LocalBuildInfo -> ConfigFlags)
-> LocalBuildInfo
-> CommonSetupFlags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LocalBuildInfo -> ConfigFlags
configFlags
absoluteWorkingDirLBI :: LocalBuildInfo -> IO (AbsolutePath (Dir Pkg))
absoluteWorkingDirLBI :: LocalBuildInfo -> IO (AbsolutePath ('Dir Pkg))
absoluteWorkingDirLBI LocalBuildInfo
lbi = Maybe (SymbolicPath CWD ('Dir Pkg)) -> IO (AbsolutePath ('Dir Pkg))
forall (to :: FileOrDir).
Maybe (SymbolicPath CWD to) -> IO (AbsolutePath to)
absoluteWorkingDir (LocalBuildInfo -> Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDirLBI LocalBuildInfo
lbi)
withLibLBI
:: PackageDescription
-> LocalBuildInfo
-> (Library -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withLibLBI :: PackageDescription
-> LocalBuildInfo
-> (Library -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withLibLBI PackageDescription
pkg LocalBuildInfo
lbi Library -> ComponentLocalBuildInfo -> IO ()
f =
PackageDescription
-> LocalBuildInfo -> (TargetInfo -> IO ()) -> IO ()
withAllTargetsInBuildOrder' PackageDescription
pkg LocalBuildInfo
lbi ((TargetInfo -> IO ()) -> IO ()) -> (TargetInfo -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \TargetInfo
target ->
case TargetInfo -> Component
targetComponent TargetInfo
target of
CLib Library
lib -> Library -> ComponentLocalBuildInfo -> IO ()
f Library
lib (TargetInfo -> ComponentLocalBuildInfo
targetCLBI TargetInfo
target)
Component
_ -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
withExeLBI
:: PackageDescription
-> LocalBuildInfo
-> (Executable -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withExeLBI :: PackageDescription
-> LocalBuildInfo
-> (Executable -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withExeLBI PackageDescription
pkg LocalBuildInfo
lbi Executable -> ComponentLocalBuildInfo -> IO ()
f =
PackageDescription
-> LocalBuildInfo -> (TargetInfo -> IO ()) -> IO ()
withAllTargetsInBuildOrder' PackageDescription
pkg LocalBuildInfo
lbi ((TargetInfo -> IO ()) -> IO ()) -> (TargetInfo -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \TargetInfo
target ->
case TargetInfo -> Component
targetComponent TargetInfo
target of
CExe Executable
exe -> Executable -> ComponentLocalBuildInfo -> IO ()
f Executable
exe (TargetInfo -> ComponentLocalBuildInfo
targetCLBI TargetInfo
target)
Component
_ -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
withBenchLBI
:: PackageDescription
-> LocalBuildInfo
-> (Benchmark -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withBenchLBI :: PackageDescription
-> LocalBuildInfo
-> (Benchmark -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withBenchLBI PackageDescription
pkg LocalBuildInfo
lbi Benchmark -> ComponentLocalBuildInfo -> IO ()
f =
[IO ()] -> IO ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [Benchmark -> ComponentLocalBuildInfo -> IO ()
f Benchmark
bench ComponentLocalBuildInfo
clbi | (Benchmark
bench, ComponentLocalBuildInfo
clbi) <- PackageDescription
-> LocalBuildInfo -> [(Benchmark, ComponentLocalBuildInfo)]
enabledBenchLBIs PackageDescription
pkg LocalBuildInfo
lbi]
withTestLBI
:: PackageDescription
-> LocalBuildInfo
-> (TestSuite -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withTestLBI :: PackageDescription
-> LocalBuildInfo
-> (TestSuite -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withTestLBI PackageDescription
pkg LocalBuildInfo
lbi TestSuite -> ComponentLocalBuildInfo -> IO ()
f =
[IO ()] -> IO ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [TestSuite -> ComponentLocalBuildInfo -> IO ()
f TestSuite
test ComponentLocalBuildInfo
clbi | (TestSuite
test, ComponentLocalBuildInfo
clbi) <- PackageDescription
-> LocalBuildInfo -> [(TestSuite, ComponentLocalBuildInfo)]
enabledTestLBIs PackageDescription
pkg LocalBuildInfo
lbi]
enabledTestLBIs
:: PackageDescription
-> LocalBuildInfo
-> [(TestSuite, ComponentLocalBuildInfo)]
enabledTestLBIs :: PackageDescription
-> LocalBuildInfo -> [(TestSuite, ComponentLocalBuildInfo)]
enabledTestLBIs PackageDescription
pkg LocalBuildInfo
lbi =
[ (TestSuite
test, TargetInfo -> ComponentLocalBuildInfo
targetCLBI TargetInfo
target)
| TargetInfo
target <- PackageDescription -> LocalBuildInfo -> [TargetInfo]
allTargetsInBuildOrder' PackageDescription
pkg LocalBuildInfo
lbi
, CTest TestSuite
test <- [TargetInfo -> Component
targetComponent TargetInfo
target]
]
enabledBenchLBIs
:: PackageDescription
-> LocalBuildInfo
-> [(Benchmark, ComponentLocalBuildInfo)]
enabledBenchLBIs :: PackageDescription
-> LocalBuildInfo -> [(Benchmark, ComponentLocalBuildInfo)]
enabledBenchLBIs PackageDescription
pkg LocalBuildInfo
lbi =
[ (Benchmark
bench, TargetInfo -> ComponentLocalBuildInfo
targetCLBI TargetInfo
target)
| TargetInfo
target <- PackageDescription -> LocalBuildInfo -> [TargetInfo]
allTargetsInBuildOrder' PackageDescription
pkg LocalBuildInfo
lbi
, CBench Benchmark
bench <- [TargetInfo -> Component
targetComponent TargetInfo
target]
]
withAllComponentsInBuildOrder
:: PackageDescription
-> LocalBuildInfo
-> (Component -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withAllComponentsInBuildOrder :: PackageDescription
-> LocalBuildInfo
-> (Component -> ComponentLocalBuildInfo -> IO ())
-> IO ()
withAllComponentsInBuildOrder PackageDescription
pkg LocalBuildInfo
lbi Component -> ComponentLocalBuildInfo -> IO ()
f =
PackageDescription
-> LocalBuildInfo -> (TargetInfo -> IO ()) -> IO ()
withAllTargetsInBuildOrder' PackageDescription
pkg LocalBuildInfo
lbi ((TargetInfo -> IO ()) -> IO ()) -> (TargetInfo -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \TargetInfo
target ->
Component -> ComponentLocalBuildInfo -> IO ()
f (TargetInfo -> Component
targetComponent TargetInfo
target) (TargetInfo -> ComponentLocalBuildInfo
targetCLBI TargetInfo
target)
allComponentsInBuildOrder
:: LocalBuildInfo
-> [ComponentLocalBuildInfo]
allComponentsInBuildOrder :: LocalBuildInfo -> [ComponentLocalBuildInfo]
allComponentsInBuildOrder (LocalBuildInfo{componentGraph :: LocalBuildInfo -> Graph ComponentLocalBuildInfo
componentGraph = Graph ComponentLocalBuildInfo
compGraph}) =
Graph ComponentLocalBuildInfo -> [ComponentLocalBuildInfo]
forall a. Graph a -> [a]
Graph.topSort Graph ComponentLocalBuildInfo
compGraph
depLibraryPaths
:: Bool
-> Bool
-> LocalBuildInfo
-> ComponentLocalBuildInfo
-> IO [FilePath]
depLibraryPaths :: Bool
-> Bool -> LocalBuildInfo -> ComponentLocalBuildInfo -> IO [[Char]]
depLibraryPaths
Bool
inplace
Bool
relative
lbi :: LocalBuildInfo
lbi@( LocalBuildInfo
{ localPkgDescr :: LocalBuildInfo -> PackageDescription
localPkgDescr = PackageDescription
pkgDescr
, installedPkgs :: LocalBuildInfo -> InstalledPackageIndex
installedPkgs = InstalledPackageIndex
installed
}
)
ComponentLocalBuildInfo
clbi = do
let installDirs :: InstallDirs [Char]
installDirs = PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteComponentInstallDirs PackageDescription
pkgDescr LocalBuildInfo
lbi (ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
clbi) CopyDest
NoCopyDest
executable :: Bool
executable = case ComponentLocalBuildInfo
clbi of
ExeComponentLocalBuildInfo{} -> Bool
True
ComponentLocalBuildInfo
_ -> Bool
False
relDir :: [Char]
relDir
| Bool
executable = InstallDirs [Char] -> [Char]
forall dir. InstallDirs dir -> dir
bindir InstallDirs [Char]
installDirs
| Bool
otherwise = InstallDirs [Char] -> [Char]
forall dir. InstallDirs dir -> dir
libdir InstallDirs [Char]
installDirs
let
internalDeps :: [UnitId]
internalDeps =
[ UnitId
uid
| (UnitId
uid, MungedPackageId
_) <- ComponentLocalBuildInfo -> [(UnitId, MungedPackageId)]
componentPackageDeps ComponentLocalBuildInfo
clbi
,
TargetInfo
sub_target <- PackageDescription -> LocalBuildInfo -> [TargetInfo]
allTargetsInBuildOrder' PackageDescription
pkgDescr LocalBuildInfo
lbi
, ComponentLocalBuildInfo -> UnitId
componentUnitId (TargetInfo -> ComponentLocalBuildInfo
targetCLBI (TargetInfo
sub_target)) UnitId -> UnitId -> Bool
forall a. Eq a => a -> a -> Bool
== UnitId
uid
]
internalLibs :: [[Char]]
internalLibs =
[ ComponentLocalBuildInfo -> [Char]
getLibDir (TargetInfo -> ComponentLocalBuildInfo
targetCLBI TargetInfo
sub_target)
| TargetInfo
sub_target <-
PackageDescription -> LocalBuildInfo -> [UnitId] -> [TargetInfo]
neededTargetsInBuildOrder'
PackageDescription
pkgDescr
LocalBuildInfo
lbi
[UnitId]
internalDeps
]
getLibDir :: ComponentLocalBuildInfo -> [Char]
getLibDir ComponentLocalBuildInfo
sub_clbi
| Bool
inplace = LocalBuildInfo
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build) -> [Char]
forall (allowAbsolute :: AllowAbsolute) (to :: FileOrDir).
LocalBuildInfo -> SymbolicPathX allowAbsolute Pkg to -> [Char]
interpretSymbolicPathLBI LocalBuildInfo
lbi (SymbolicPathX 'AllowAbsolute Pkg ('Dir Build) -> [Char])
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build) -> [Char]
forall a b. (a -> b) -> a -> b
$ LocalBuildInfo
-> ComponentLocalBuildInfo
-> SymbolicPathX 'AllowAbsolute Pkg ('Dir Build)
componentBuildDir LocalBuildInfo
lbi ComponentLocalBuildInfo
sub_clbi
| Bool
otherwise = InstallDirs [Char] -> [Char]
forall dir. InstallDirs dir -> dir
dynlibdir (PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteComponentInstallDirs PackageDescription
pkgDescr LocalBuildInfo
lbi (ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
sub_clbi) CopyDest
NoCopyDest)
let external_ipkgs :: [InstalledPackageInfo]
external_ipkgs = (InstalledPackageInfo -> Bool)
-> [InstalledPackageInfo] -> [InstalledPackageInfo]
forall a. (a -> Bool) -> [a] -> [a]
filter InstalledPackageInfo -> Bool
forall {pkg}. HasUnitId pkg => pkg -> Bool
is_external (InstalledPackageIndex -> [InstalledPackageInfo]
forall a. PackageIndex a -> [a]
allPackages InstalledPackageIndex
installed)
is_external :: pkg -> Bool
is_external pkg
ipkg = Bool -> Bool
not (pkg -> UnitId
forall pkg. HasUnitId pkg => pkg -> UnitId
installedUnitId pkg
ipkg UnitId -> [UnitId] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [UnitId]
internalDeps)
getDynDir :: InstalledPackageInfo -> [[Char]]
getDynDir InstalledPackageInfo
pkg = case InstalledPackageInfo -> [[Char]]
Installed.libraryDynDirs InstalledPackageInfo
pkg of
[] -> InstalledPackageInfo -> [[Char]]
Installed.libraryDirs InstalledPackageInfo
pkg
[[Char]]
d -> [[Char]]
d
allDepLibDirs :: [[Char]]
allDepLibDirs = (InstalledPackageInfo -> [[Char]])
-> [InstalledPackageInfo] -> [[Char]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap InstalledPackageInfo -> [[Char]]
getDynDir [InstalledPackageInfo]
external_ipkgs
allDepLibDirs' :: [[Char]]
allDepLibDirs' = [[Char]]
internalLibs [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [[Char]]
allDepLibDirs
allDepLibDirsC <- ([Char] -> IO [Char]) -> [[Char]] -> IO [[Char]]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse [Char] -> IO [Char]
canonicalizePathNoFail [[Char]]
allDepLibDirs'
let p = InstallDirs [Char] -> [Char]
forall dir. InstallDirs dir -> dir
prefix InstallDirs [Char]
installDirs
prefixRelative [Char]
l = Maybe [Char] -> Bool
forall a. Maybe a -> Bool
isJust ([Char] -> [Char] -> Maybe [Char]
forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix [Char]
p [Char]
l)
libPaths
| Bool
relative
Bool -> Bool -> Bool
&& [Char] -> Bool
prefixRelative [Char]
relDir =
([Char] -> [Char]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map
( \[Char]
l ->
if [Char] -> Bool
prefixRelative [Char]
l
then [Char] -> [Char] -> [Char]
shortRelativePath [Char]
relDir [Char]
l
else [Char]
l
)
[[Char]]
allDepLibDirsC
| Bool
otherwise = [[Char]]
allDepLibDirsC
return $ ordNub libPaths
where
canonicalizePathNoFail :: [Char] -> IO [Char]
canonicalizePathNoFail [Char]
p = do
exists <- [Char] -> IO Bool
Directory.doesDirectoryExist [Char]
p
if exists
then Directory.canonicalizePath p
else return p
allLibModules :: Library -> ComponentLocalBuildInfo -> [ModuleName]
allLibModules :: Library -> ComponentLocalBuildInfo -> [ModuleName]
allLibModules Library
lib ComponentLocalBuildInfo
clbi =
[ModuleName] -> [ModuleName]
forall a. Ord a => [a] -> [a]
ordNub ([ModuleName] -> [ModuleName]) -> [ModuleName] -> [ModuleName]
forall a b. (a -> b) -> a -> b
$
Library -> [ModuleName]
explicitLibModules Library
lib
[ModuleName] -> [ModuleName] -> [ModuleName]
forall a. [a] -> [a] -> [a]
++ case ComponentLocalBuildInfo
clbi of
LibComponentLocalBuildInfo{componentInstantiatedWith :: ComponentLocalBuildInfo -> [(ModuleName, OpenModule)]
componentInstantiatedWith = [(ModuleName, OpenModule)]
insts} -> ((ModuleName, OpenModule) -> ModuleName)
-> [(ModuleName, OpenModule)] -> [ModuleName]
forall a b. (a -> b) -> [a] -> [b]
map (ModuleName, OpenModule) -> ModuleName
forall a b. (a, b) -> a
fst [(ModuleName, OpenModule)]
insts
ComponentLocalBuildInfo
_ -> []
absoluteInstallDirs
:: PackageDescription
-> LocalBuildInfo
-> CopyDest
-> InstallDirs FilePath
absoluteInstallDirs :: PackageDescription
-> LocalBuildInfo -> CopyDest -> InstallDirs [Char]
absoluteInstallDirs PackageDescription
pkg LocalBuildInfo
lbi CopyDest
copydest =
PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteComponentInstallDirs PackageDescription
pkg LocalBuildInfo
lbi (LocalBuildInfo -> UnitId
localUnitId LocalBuildInfo
lbi) CopyDest
copydest
absoluteComponentInstallDirs
:: PackageDescription
-> LocalBuildInfo
-> UnitId
-> CopyDest
-> InstallDirs FilePath
absoluteComponentInstallDirs :: PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteComponentInstallDirs
PackageDescription
pkg
(LocalBuildInfo{compiler :: LocalBuildInfo -> Compiler
compiler = Compiler
comp, hostPlatform :: LocalBuildInfo -> Platform
hostPlatform = Platform
plat, installDirTemplates :: LocalBuildInfo -> InstallDirTemplates
installDirTemplates = InstallDirTemplates
installDirs})
UnitId
uid
CopyDest
copydest =
PackageIdentifier
-> UnitId
-> CompilerInfo
-> CopyDest
-> Platform
-> InstallDirTemplates
-> InstallDirs [Char]
InstallDirs.absoluteInstallDirs
(PackageDescription -> PackageIdentifier
forall pkg. Package pkg => pkg -> PackageIdentifier
packageId PackageDescription
pkg)
UnitId
uid
(Compiler -> CompilerInfo
compilerInfo Compiler
comp)
CopyDest
copydest
Platform
plat
InstallDirTemplates
installDirs
absoluteInstallCommandDirs
:: PackageDescription
-> LocalBuildInfo
-> UnitId
-> CopyDest
-> InstallDirs FilePath
absoluteInstallCommandDirs :: PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteInstallCommandDirs PackageDescription
pkg LocalBuildInfo
lbi UnitId
uid CopyDest
copydest =
InstallDirs [Char]
dirs
{
datadir = datadir dirs'
,
docdir = docdir dirs'
, htmldir = htmldir dirs'
, haddockdir = haddockdir dirs'
}
where
dirs :: InstallDirs [Char]
dirs = PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteComponentInstallDirs PackageDescription
pkg LocalBuildInfo
lbi UnitId
uid CopyDest
copydest
dirs' :: InstallDirs [Char]
dirs' = PackageDescription
-> LocalBuildInfo -> CopyDest -> InstallDirs [Char]
absoluteInstallDirs PackageDescription
pkg LocalBuildInfo
lbi CopyDest
copydest
prefixRelativeInstallDirs
:: PackageId
-> LocalBuildInfo
-> InstallDirs (Maybe FilePath)
prefixRelativeInstallDirs :: PackageIdentifier -> LocalBuildInfo -> InstallDirs (Maybe [Char])
prefixRelativeInstallDirs PackageIdentifier
pkg_descr LocalBuildInfo
lbi =
PackageIdentifier
-> LocalBuildInfo -> UnitId -> InstallDirs (Maybe [Char])
prefixRelativeComponentInstallDirs PackageIdentifier
pkg_descr LocalBuildInfo
lbi (LocalBuildInfo -> UnitId
localUnitId LocalBuildInfo
lbi)
prefixRelativeComponentInstallDirs
:: PackageId
-> LocalBuildInfo
-> UnitId
-> InstallDirs (Maybe FilePath)
prefixRelativeComponentInstallDirs :: PackageIdentifier
-> LocalBuildInfo -> UnitId -> InstallDirs (Maybe [Char])
prefixRelativeComponentInstallDirs
PackageIdentifier
pkg_descr
(LocalBuildInfo{compiler :: LocalBuildInfo -> Compiler
compiler = Compiler
comp, hostPlatform :: LocalBuildInfo -> Platform
hostPlatform = Platform
plat, installDirTemplates :: LocalBuildInfo -> InstallDirTemplates
installDirTemplates = InstallDirTemplates
installDirs})
UnitId
uid =
PackageIdentifier
-> UnitId
-> CompilerInfo
-> Platform
-> InstallDirTemplates
-> InstallDirs (Maybe [Char])
InstallDirs.prefixRelativeInstallDirs
(PackageIdentifier -> PackageIdentifier
forall pkg. Package pkg => pkg -> PackageIdentifier
packageId PackageIdentifier
pkg_descr)
UnitId
uid
(Compiler -> CompilerInfo
compilerInfo Compiler
comp)
Platform
plat
InstallDirTemplates
installDirs
substPathTemplate
:: PackageId
-> LocalBuildInfo
-> UnitId
-> PathTemplate
-> FilePath
substPathTemplate :: PackageIdentifier
-> LocalBuildInfo -> UnitId -> PathTemplate -> [Char]
substPathTemplate
PackageIdentifier
pkgid
(LocalBuildInfo{compiler :: LocalBuildInfo -> Compiler
compiler = Compiler
comp, hostPlatform :: LocalBuildInfo -> Platform
hostPlatform = Platform
plat})
UnitId
uid =
PathTemplate -> [Char]
fromPathTemplate
(PathTemplate -> [Char])
-> (PathTemplate -> PathTemplate) -> PathTemplate -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PathTemplateEnv -> PathTemplate -> PathTemplate
InstallDirs.substPathTemplate PathTemplateEnv
env)
where
env :: PathTemplateEnv
env =
PackageIdentifier
-> UnitId -> CompilerInfo -> Platform -> PathTemplateEnv
initialPathTemplateEnv
PackageIdentifier
pkgid
UnitId
uid
(Compiler -> CompilerInfo
compilerInfo Compiler
comp)
Platform
plat