{-# LANGUAGE CPP #-}
module Data.Array.Accelerate.LLVM.Native.Distribution.Simple.GHC.Internal (
mkGHCiLibName,
ghcLookupProperty,
filterGhciFlags,
getHaskellObjects,
mkGhcOptPackages,
profDetailLevelFlag,
) where
#if MIN_VERSION_Cabal(2,0,0)
import Distribution.Backpack
#endif
import Distribution.PackageDescription as PD hiding (Flag)
import Distribution.Simple.Compiler hiding (Flag)
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program.GHC
import Distribution.Simple.Setup
import Distribution.Simple
import qualified Distribution.ModuleName as ModuleName
import qualified Data.Map as Map
import System.Directory ( getDirectoryContents )
import System.FilePath ( (</>), (<.>), takeExtension )
filterGhciFlags :: [String] -> [String]
filterGhciFlags = filter supported
where
supported ('-':'O':_) = False
supported "-debug" = False
supported "-threaded" = False
supported "-ticky" = False
supported "-eventlog" = False
supported "-prof" = False
supported "-unreg" = False
supported _ = True
#if MIN_VERSION_Cabal(1,24,0)
mkGHCiLibName :: UnitId -> String
mkGHCiLibName lib = getHSLibraryName lib <.> "o"
#else
mkGHCiLibName :: LibraryName -> String
mkGHCiLibName (LibraryName lib) = lib <.> "o"
#endif
ghcLookupProperty :: String -> Compiler -> Bool
ghcLookupProperty prop comp =
case Map.lookup prop (compilerProperties comp) of
Just "YES" -> True
_ -> False
getHaskellObjects :: _GhcImplInfo -> Library -> LocalBuildInfo
-> ComponentLocalBuildInfo
-> FilePath -> String -> Bool -> IO [FilePath]
getHaskellObjects _implInfo lib lbi clbi pref wanted_obj_ext allow_split_objs
| splitObjs lbi && allow_split_objs = do
let splitSuffix = "_" ++ wanted_obj_ext ++ "_split"
dirs = [ pref </> (ModuleName.toFilePath x ++ splitSuffix)
| x <- allLibModules lib clbi ]
objss <- traverse getDirectoryContents dirs
let objs = [ dir </> obj
| (objs',dir) <- zip objss dirs, obj <- objs',
let obj_ext = takeExtension obj,
'.':wanted_obj_ext == obj_ext ]
return objs
| otherwise =
return [ pref </> ModuleName.toFilePath x <.> wanted_obj_ext
| x <- allLibModules lib clbi ]
#if MIN_VERSION_Cabal(2,0,0)
mkGhcOptPackages :: ComponentLocalBuildInfo
-> [(OpenUnitId, ModuleRenaming)]
mkGhcOptPackages = componentIncludes
#else
mkGhcOptPackages :: ComponentLocalBuildInfo
-> [(InstalledPackageId, PackageId, ModuleRenaming)]
mkGhcOptPackages clbi =
map (\(i,p) -> (i,p,lookupRenaming p (componentPackageRenaming clbi)))
(componentPackageDeps clbi)
#endif
profDetailLevelFlag :: Bool -> ProfDetailLevel -> Flag GhcProfAuto
profDetailLevelFlag forLib mpl =
case mpl of
ProfDetailNone -> mempty
ProfDetailDefault | forLib -> toFlag GhcProfAutoExported
| otherwise -> toFlag GhcProfAutoToplevel
ProfDetailExportedFunctions -> toFlag GhcProfAutoExported
ProfDetailToplevelFunctions -> toFlag GhcProfAutoToplevel
ProfDetailAllFunctions -> toFlag GhcProfAutoAll
ProfDetailOther _ -> mempty
#if !MIN_VERSION_Cabal(2,0,0)
allLibModules :: Library -> ComponentLocalBuildInfo -> [ModuleName.ModuleName]
allLibModules lib _ = libModules lib
#endif