packages feed

g2-0.2.0.0: src/G2/Translation/Cabal/Cabal.hs

{-# LANGUAGE CPP #-}

module G2.Translation.Cabal.Cabal (cabalSrcDirs) where

import Distribution.PackageDescription

#if MIN_VERSION_Cabal(3,8,0)
import Distribution.Simple.PackageDescription
#elif MIN_VERSION_Cabal(2,2,0)
import Distribution.PackageDescription.Parsec
#else
import Distribution.PackageDescription.Parse
#endif

import Distribution.Verbosity
#if MIN_VERSION_Cabal(3,6,0)
import Distribution.Utils.Path ( getSymbolicPath )
#endif

-- | Takes the filepath to a Cabal file, and returns a list of FilePaths to red
-- from.
cabalSrcDirs :: FilePath -> IO [FilePath]
cabalSrcDirs fp = do
    gpd <- readGenericPackageDescription silent fp
    return $ genericPackageDescriptionSrcDirs gpd

genericPackageDescriptionSrcDirs :: GenericPackageDescription -> [FilePath]
genericPackageDescriptionSrcDirs (GenericPackageDescription
                                            { condLibrary = cl
                                            , condExecutables = ce
                                            , condTestSuites = ts }) = do
       maybe [] (condTreeSrcDirs libSrcDirs) cl
    ++ concatMap (condTreeSrcDirs execSrcDirs . snd) ce
    ++ concatMap (condTreeSrcDirs testSrcDirs . snd) ts

condTreeSrcDirs :: (a -> [FilePath]) -> CondTree v c a -> [FilePath]
condTreeSrcDirs f (CondNode { condTreeData = t }) = f t

libSrcDirs :: Library -> [FilePath]
libSrcDirs = buildInfoSrcDirs . libBuildInfo

execSrcDirs :: Executable -> [FilePath]
execSrcDirs = buildInfoSrcDirs . buildInfo

testSrcDirs :: TestSuite -> [FilePath]
testSrcDirs = buildInfoSrcDirs . testBuildInfo

buildInfoSrcDirs :: BuildInfo -> [FilePath]
#if MIN_VERSION_Cabal(3,6,0)
buildInfoSrcDirs (BuildInfo { hsSourceDirs = sd }) = map getSymbolicPath sd
#else
buildInfoSrcDirs (BuildInfo { hsSourceDirs = sd }) = sd
#endif