module Distribution.Simple.Build.PathsModule
( generatePathsModule
, pkgPathEnvVar
) where
import Distribution.Compat.Prelude
import Prelude ()
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Simple.Compiler
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Utils (shortRelativePath)
import Distribution.System
import Distribution.Version
import qualified Distribution.Simple.Build.PathsModule.Z as Z
generatePathsModule :: PackageDescription -> LocalBuildInfo -> ComponentLocalBuildInfo -> String
generatePathsModule :: PackageDescription
-> LocalBuildInfo -> ComponentLocalBuildInfo -> [Char]
generatePathsModule PackageDescription
pkg_descr LocalBuildInfo
lbi ComponentLocalBuildInfo
clbi =
Z -> [Char]
Z.render
Z.Z
{ zPackageName :: PackageName
Z.zPackageName = PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg_descr
, zVersionDigits :: [Char]
Z.zVersionDigits = [Int] -> [Char]
forall a. Show a => a -> [Char]
show ([Int] -> [Char]) -> [Int] -> [Char]
forall a b. (a -> b) -> a -> b
$ Version -> [Int]
versionNumbers (Version -> [Int]) -> Version -> [Int]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> Version
forall pkg. Package pkg => pkg -> Version
packageVersion PackageDescription
pkg_descr
, zSupportsCpp :: Bool
Z.zSupportsCpp = Bool
supports_cpp
, zSupportsNoRebindableSyntax :: Bool
Z.zSupportsNoRebindableSyntax = Bool
supports_rebindable_syntax
, zAbsolute :: Bool
Z.zAbsolute = Bool
absolute
, zRelocatable :: Bool
Z.zRelocatable = LocalBuildInfo -> Bool
relocatable LocalBuildInfo
lbi
, zIsWindows :: Bool
Z.zIsWindows = Bool
isWindows
, zIsI386 :: Bool
Z.zIsI386 = Arch
buildArch Arch -> Arch -> Bool
forall a. Eq a => a -> a -> Bool
== Arch
I386
, zIsX8664 :: Bool
Z.zIsX8664 = Arch
buildArch Arch -> Arch -> Bool
forall a. Eq a => a -> a -> Bool
== Arch
X86_64
, zIsAArch64 :: Bool
Z.zIsAArch64 = Arch
buildArch Arch -> Arch -> Bool
forall a. Eq a => a -> a -> Bool
== Arch
AArch64
, zNot :: Bool -> Bool
Z.zNot = Bool -> Bool
not
, zManglePkgName :: PackageName -> [Char]
Z.zManglePkgName = PackageName -> [Char]
showPkgName
, zPrefix :: [Char]
Z.zPrefix = [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_prefix
, zBindir :: [Char]
Z.zBindir = [Char]
zBindir
, zLibdir :: [Char]
Z.zLibdir = [Char]
zLibdir
, zDynlibdir :: [Char]
Z.zDynlibdir = [Char]
zDynlibdir
, zDatadir :: [Char]
Z.zDatadir = [Char]
zDatadir
, zLibexecdir :: [Char]
Z.zLibexecdir = [Char]
zLibexecdir
, zSysconfdir :: [Char]
Z.zSysconfdir = [Char]
zSysconfdir
}
where
supports_cpp :: Bool
supports_cpp = Bool
supports_language_pragma
supports_rebindable_syntax :: Bool
supports_rebindable_syntax = Version -> Bool
ghc_newer_than ([Int] -> Version
mkVersion [Int
7, Int
0, Int
1])
supports_language_pragma :: Bool
supports_language_pragma = Version -> Bool
ghc_newer_than ([Int] -> Version
mkVersion [Int
6, Int
6, Int
1])
ghc_newer_than :: Version -> Bool
ghc_newer_than Version
minVersion =
case CompilerFlavor -> Compiler -> Maybe Version
compilerCompatVersion CompilerFlavor
GHC (LocalBuildInfo -> Compiler
compiler LocalBuildInfo
lbi) of
Maybe Version
Nothing -> Bool
False
Just Version
version -> Version
version Version -> VersionRange -> Bool
`withinRange` Version -> VersionRange
orLaterVersion Version
minVersion
absolute :: Bool
absolute =
PackageDescription -> Bool
hasLibs PackageDescription
pkg_descr
Bool -> Bool -> Bool
|| Maybe [Char] -> Bool
forall a. Maybe a -> Bool
isNothing Maybe [Char]
flat_bindirrel
Bool -> Bool -> Bool
|| Bool -> Bool
not (CompilerFlavor -> Bool
supportsRelocatableProgs (Compiler -> CompilerFlavor
compilerFlavor (LocalBuildInfo -> Compiler
compiler LocalBuildInfo
lbi)))
isWindows :: Bool
isWindows = case OS
buildOS of
OS
Windows -> Bool
True
OS
_ -> Bool
False
supportsRelocatableProgs :: CompilerFlavor -> Bool
supportsRelocatableProgs CompilerFlavor
GHC = Bool
isWindows
supportsRelocatableProgs CompilerFlavor
GHCJS = Bool
isWindows
supportsRelocatableProgs CompilerFlavor
_ = Bool
False
cid :: UnitId
cid = ComponentLocalBuildInfo -> UnitId
componentUnitId ComponentLocalBuildInfo
clbi
InstallDirs
{ bindir :: forall dir. InstallDirs dir -> dir
bindir = [Char]
flat_bindir
, libdir :: forall dir. InstallDirs dir -> dir
libdir = [Char]
flat_libdir
, dynlibdir :: forall dir. InstallDirs dir -> dir
dynlibdir = [Char]
flat_dynlibdir
, datadir :: forall dir. InstallDirs dir -> dir
datadir = [Char]
flat_datadir
, libexecdir :: forall dir. InstallDirs dir -> dir
libexecdir = [Char]
flat_libexecdir
, sysconfdir :: forall dir. InstallDirs dir -> dir
sysconfdir = [Char]
flat_sysconfdir
, prefix :: forall dir. InstallDirs dir -> dir
prefix = [Char]
flat_prefix
} = PackageDescription
-> LocalBuildInfo -> UnitId -> CopyDest -> InstallDirs [Char]
absoluteInstallCommandDirs PackageDescription
pkg_descr LocalBuildInfo
lbi UnitId
cid CopyDest
NoCopyDest
InstallDirs
{ bindir :: forall dir. InstallDirs dir -> dir
bindir = Maybe [Char]
flat_bindirrel
, libdir :: forall dir. InstallDirs dir -> dir
libdir = Maybe [Char]
flat_libdirrel
, dynlibdir :: forall dir. InstallDirs dir -> dir
dynlibdir = Maybe [Char]
flat_dynlibdirrel
, datadir :: forall dir. InstallDirs dir -> dir
datadir = Maybe [Char]
flat_datadirrel
, libexecdir :: forall dir. InstallDirs dir -> dir
libexecdir = Maybe [Char]
flat_libexecdirrel
, sysconfdir :: forall dir. InstallDirs dir -> dir
sysconfdir = Maybe [Char]
flat_sysconfdirrel
} = PackageId -> LocalBuildInfo -> UnitId -> InstallDirs (Maybe [Char])
prefixRelativeComponentInstallDirs (PackageDescription -> PackageId
forall pkg. Package pkg => pkg -> PackageId
packageId PackageDescription
pkg_descr) LocalBuildInfo
lbi UnitId
cid
zBindir, zLibdir, zDynlibdir, zDatadir, zLibexecdir, zSysconfdir :: String
([Char]
zBindir, [Char]
zLibdir, [Char]
zDynlibdir, [Char]
zDatadir, [Char]
zLibexecdir, [Char]
zSysconfdir)
| LocalBuildInfo -> Bool
relocatable LocalBuildInfo
lbi =
( [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_bindir_reloc
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_libdir_reloc
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_dynlibdir_reloc
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_datadir_reloc
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_libexecdir_reloc
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_sysconfdir_reloc
)
| Bool
absolute =
( [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_bindir
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_libdir
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_dynlibdir
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_datadir
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_libexecdir
, [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
flat_sysconfdir
)
| Bool
isWindows =
( [Char]
"maybe (error \"PathsModule.generate\") id (" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Maybe [Char] -> [Char]
forall a. Show a => a -> [Char]
show Maybe [Char]
flat_bindirrel [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")"
, [Char] -> Maybe [Char] -> [Char]
mkGetDir [Char]
flat_libdir Maybe [Char]
flat_libdirrel
, [Char] -> Maybe [Char] -> [Char]
mkGetDir [Char]
flat_dynlibdir Maybe [Char]
flat_dynlibdirrel
, [Char] -> Maybe [Char] -> [Char]
mkGetDir [Char]
flat_datadir Maybe [Char]
flat_datadirrel
, [Char] -> Maybe [Char] -> [Char]
mkGetDir [Char]
flat_libexecdir Maybe [Char]
flat_libexecdirrel
, [Char] -> Maybe [Char] -> [Char]
mkGetDir [Char]
flat_sysconfdir Maybe [Char]
flat_sysconfdirrel
)
| Bool
otherwise =
[Char] -> ([Char], [Char], [Char], [Char], [Char], [Char])
forall a. HasCallStack => [Char] -> a
error [Char]
"panic! generatePathsModule: should never happen"
mkGetDir :: FilePath -> Maybe FilePath -> String
mkGetDir :: [Char] -> Maybe [Char] -> [Char]
mkGetDir [Char]
_ (Just [Char]
dirrel) = [Char]
"getPrefixDirRel " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
dirrel
mkGetDir [Char]
dir Maybe [Char]
Nothing = [Char]
"return " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
dir
flat_bindir_reloc :: [Char]
flat_bindir_reloc = [Char] -> [Char] -> [Char]
shortRelativePath [Char]
flat_prefix [Char]
flat_bindir
flat_libdir_reloc :: [Char]
flat_libdir_reloc = [Char] -> [Char] -> [Char]
shortRelativePath [Char]
flat_prefix [Char]
flat_libdir
flat_dynlibdir_reloc :: [Char]
flat_dynlibdir_reloc = [Char] -> [Char] -> [Char]
shortRelativePath [Char]
flat_prefix [Char]
flat_dynlibdir
flat_datadir_reloc :: [Char]
flat_datadir_reloc = [Char] -> [Char] -> [Char]
shortRelativePath [Char]
flat_prefix [Char]
flat_datadir
flat_libexecdir_reloc :: [Char]
flat_libexecdir_reloc = [Char] -> [Char] -> [Char]
shortRelativePath [Char]
flat_prefix [Char]
flat_libexecdir
flat_sysconfdir_reloc :: [Char]
flat_sysconfdir_reloc = [Char] -> [Char] -> [Char]
shortRelativePath [Char]
flat_prefix [Char]
flat_sysconfdir
pkgPathEnvVar
:: PackageDescription
-> String
-> String
pkgPathEnvVar :: PackageDescription -> [Char] -> [Char]
pkgPathEnvVar PackageDescription
pkg_descr [Char]
var =
PackageName -> [Char]
showPkgName (PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg_descr) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"_" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
var
showPkgName :: PackageName -> String
showPkgName :: PackageName -> [Char]
showPkgName = (Char -> Char) -> [Char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
fixchar ([Char] -> [Char])
-> (PackageName -> [Char]) -> PackageName -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> [Char]
unPackageName
fixchar :: Char -> Char
fixchar :: Char -> Char
fixchar Char
'-' = Char
'_'
fixchar Char
c = Char
c