{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Autonix.KF5 where
import Control.Lens
import Control.Monad.IO.Class
import Control.Monad.State
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import Data.Conduit
import Data.List (isPrefixOf)
import Data.Map (Map)
import Data.Monoid
import qualified Data.Set as S
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import System.FilePath (takeBaseName, takeExtensions, takeFileName)
import Autonix.Analyze
import Autonix.CMake
import Autonix.Package (Package)
import qualified Autonix.Package as Package
import Autonix.Regex
import Autonix.Renames
printFilePaths :: MonadIO m => Analyzer m
printFilePaths _ _ = awaitForever $ \(path, _) -> liftIO $ putStrLn path
findKF5Components :: (MonadIO m, MonadState (Map Text Package, Renames) m) => Analyzer m
findKF5Components pkg _ = awaitForever $ \(path, contents) ->
when ("CMakeLists.txt" == takeFileName path) $ do
let new = S.fromList
$ map ("kf5" <>)
$ map (T.toLower . T.decodeUtf8)
$ filter (not . cmakeReserved)
$ filter (not . B.null)
$ concatMap B.words
$ concatMap (take 1 . drop 1)
$ match regex contents
regex = makeRegex
"find_package[[:space:]]*\\([[:space:]]*KF5\
\[[:space:]]*([#\\.${}_[:alnum:][:space:]]+)\\)"
_1 . ix pkg . Package.buildInputs <>= new
propagateKF5Deps :: (MonadIO m, MonadState (Map Text Package, Renames) m) => Analyzer m
propagateKF5Deps pkg _ = awaitForever $ \(path, contents) ->
when (".cmake" `isPrefixOf` takeExtensions path) $ do
let base = T.pack $ takeBaseName $ takeBaseName path
regex = makeRegex
"find_dependency[[:space:]]*\\([[:space:]]*\
\([^[:space:],$\\)]+)"
case T.splitAt (T.length base - 6) base of
(upstream, "Config") -> do
let new = S.fromList
$ map (T.toLower . T.decodeUtf8)
$ filter (not . cmakeReserved)
$ filter (not . B.null)
$ concatMap (take 1 . drop 1)
$ match regex contents
_1 . ix pkg . Package.propagatedBuildInputs <>= new
_2 . at (T.toLower upstream) .= Just pkg
_ -> return ()
findQt5Components :: (MonadIO m, MonadState (Map Text Package, Renames) m) => Analyzer m
findQt5Components pkg _ = awaitForever $ \(path, contents) ->
when ("CMakeLists.txt" == takeFileName path) $ do
let new = S.fromList
$ map ("qt5" <>)
$ map (T.toLower . T.decodeUtf8)
$ filter (not . cmakeReserved)
$ filter (not . B.null)
$ concatMap B.words
$ concatMap (take 1 . drop 1)
$ match regex contents
regex = makeRegex
"find_package[[:space:]]*\\([[:space:]]*Qt5\
\[[:space:]]*([#\\.${}_[:alnum:][:space:]]+)\\)"
_1 . ix pkg . Package.buildInputs <>= new
cmakeReserved :: ByteString -> Bool
cmakeReserved bs = or $ map ($ bs)
[ B.elem '$'
, B.elem '{'
, B.elem '}'
, B.elem '#'
, B.elem '.'
, (==) "COMPONENTS"
, (==) "REQUIRED"
, (==) "CONFIG"
, (==) "NO_MODULE"
, (==) "QUIET"
, (==) "CTest"
]
kf5Analyzers :: (MonadIO m, MonadState (Map Text Package, Renames) m) => [Analyzer m]
kf5Analyzers =
[ findKF5Components
, findQt5Components
, propagateKF5Deps
]
++ cmakeAnalyzers