autonix-deps-kf5 0.2.0.1 → 0.3.0.0
raw patch · 3 files changed
+51/−109 lines, 3 filesdep +textdep ~autonix-deps
Dependencies added: text
Dependency ranges changed: autonix-deps
Files
- autonix-deps-kf5.cabal +3/−2
- kf5-deps.hs +2/−13
- src/Autonix/KF5.hs +46/−94
autonix-deps-kf5.cabal view
@@ -1,5 +1,5 @@ name: autonix-deps-kf5-version: 0.2.0.1+version: 0.3.0.0 synopsis: Generate dependencies for KDE 5 Nix expressions license: BSD3 license-file: LICENSE@@ -23,7 +23,7 @@ exposed-modules: Autonix.KF5 build-depends:- autonix-deps ==0.2.*+ autonix-deps ==0.3.* , base >=4.7 && <5 , bytestring >=0.10 , conduit ==1.2.*@@ -31,6 +31,7 @@ , filepath >=1.3 , lens >=4.0 , mtl >=2.1+ , text >= 1.2 , transformers >=0.3 hs-source-dirs: src default-language: Haskell2010
kf5-deps.hs view
@@ -2,19 +2,8 @@ module Main where -import Control.Monad.State-import Data.Monoid--import Autonix.Analyze-import Autonix.Args-import Autonix.Deps-import Autonix.Generate+import Autonix import Autonix.KF5 main :: IO ()-main = withArgs $ \manifest -> flip evalStateT mempty $ do- rename "ECM" "extra-cmake-modules"- analyzePackages (analyzeFiles kf5Analyzers) manifest- kf5PostAnalyze- get >>= writeDeps- get >>= writeRenames+main = autonix kf5Analyzers
src/Autonix/KF5.hs view
@@ -7,53 +7,35 @@ 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 qualified Data.Map as M-import Data.Maybe (fromMaybe)+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.Deps+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--renameKF5Pkgs :: (MonadIO m, MonadState Deps m) => Analyzer m-renameKF5Pkgs pkg = awaitForever $ \(path, contents) ->- when (takeFileName path == "metainfo.yaml") $ do- let regex = makeRegex "cmakename:[[:space:]]*([[:alnum:]]*)"- matches = match regex contents- case matches of- ((_ : cmakeName : _) : _) -> rename cmakeName pkg- _ -> return ()--propagateKF5Deps :: (MonadIO m, MonadState Deps m) => Analyzer m-propagateKF5Deps newPkg = awaitForever $ \(path, contents) ->- when (".cmake" `isPrefixOf` takeExtensions path) $ do- let base = takeBaseName $ takeBaseName path- regex = makeRegex- "find_dependency[[:space:]]*\\([[:space:]]*\- \([^[:space:],$\\)]+)"- case splitAt (length base - 6) base of- (oldPkg, "Config") -> do- let new = concatMap (take 1 . drop 1) $ match regex contents- rename (B.pack oldPkg) newPkg- at newPkg %=- Just- . (propagatedBuildInputs %~ S.union (S.fromList new))- . fromMaybe mempty- _ -> return ()+printFilePaths _ _ = awaitForever $ \(path, _) -> liftIO $ putStrLn path -findKF5Components :: (MonadIO m, MonadState Deps m) => Analyzer m-findKF5Components pkg = awaitForever $ \(path, contents) ->+findKF5Components :: (MonadIO m, MonadState (Map Text Package, Renames) m) => Analyzer m+findKF5Components pkg _ = awaitForever $ \(path, contents) -> when ("CMakeLists.txt" == takeFileName path) $ do- let new = filter (not . cmakeReserved)+ 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)@@ -61,12 +43,34 @@ regex = makeRegex "find_package[[:space:]]*\\([[:space:]]*KF5\ \[[:space:]]*([#\\.${}_[:alnum:][:space:]]+)\\)"- ix pkg . buildInputs %= S.union (S.fromList $ map ("KF5" <>) new)+ _1 . ix pkg . Package.buildInputs <>= new -findQt5Components :: (MonadIO m, MonadState Deps m) => Analyzer m-findQt5Components pkg = awaitForever $ \(path, contents) ->+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 = filter (not . cmakeReserved)+ 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)@@ -74,7 +78,7 @@ regex = makeRegex "find_package[[:space:]]*\\([[:space:]]*Qt5\ \[[:space:]]*([#\\.${}_[:alnum:][:space:]]+)\\)"- ix pkg . buildInputs %= S.union (S.fromList $ map ("Qt5" <>) new)+ _1 . ix pkg . Package.buildInputs <>= new cmakeReserved :: ByteString -> Bool cmakeReserved bs = or $ map ($ bs)@@ -86,67 +90,15 @@ , (==) "COMPONENTS" , (==) "REQUIRED" , (==) "CONFIG"+ , (==) "NO_MODULE"+ , (==) "QUIET"+ , (==) "CTest" ] -kf5Analyzers :: (MonadIO m, MonadState Deps m) => [Analyzer m]+kf5Analyzers :: (MonadIO m, MonadState (Map Text Package, Renames) m) => [Analyzer m] kf5Analyzers = [ findKF5Components , findQt5Components- , renameKF5Pkgs , propagateKF5Deps ] ++ cmakeAnalyzers--kf5PostAnalyze :: MonadState Deps m => m ()-kf5PostAnalyze = do- moveNativeInputs- movePropagatedInputs- moveUserEnvPkgs--moveNativeInputs :: MonadState Deps m => m ()-moveNativeInputs = deps %= M.map makeNative- where- makeNative = execState $ forM_ native $ \dep -> do- hasDep <- use (buildInputs.to (S.member dep))- when hasDep $ do- buildInputs %= S.delete dep- nativeBuildInputs %= S.insert dep- hasPropDep <- use (propagatedBuildInputs.to (S.member dep))- when hasPropDep $ do- propagatedBuildInputs %= S.delete dep- propagatedNativeBuildInputs %= S.insert dep- native = [ "BISON"- , "extra-cmake-modules"- , "FLEX"- , "kdoctools"- , "ki18n"- , "LibXslt"- , "Perl"- , "PythonInterp"- ]--movePropagatedInputs :: MonadState Deps m => m ()-movePropagatedInputs = deps %= M.map propagate- where- propagate = execState $ forM_ propagated $ \dep -> do- hasDep <- use (buildInputs.to (S.member dep))- when hasDep $ do- buildInputs %= S.delete dep- propagatedBuildInputs %= S.insert dep- hasNativeDep <- use (nativeBuildInputs.to (S.member dep))- when hasNativeDep $ do- nativeBuildInputs %= S.delete dep- propagatedNativeBuildInputs %= S.insert dep- propagated = [ "extra-cmake-modules" ]--moveUserEnvPkgs :: MonadState Deps m => m ()-moveUserEnvPkgs = deps %= M.map propagate- where- propagate = execState $ forM_ userEnv $ \dep -> do- hasDep <- use (buildInputs.to (S.member dep))- hasNativeDep <- use (buildInputs.to (S.member dep))- hasPropDep <- use (buildInputs.to (S.member dep))- hasPropNativeDep <- use (buildInputs.to (S.member dep))- when (hasDep || hasNativeDep || hasPropDep || hasPropNativeDep)- $ propagatedUserEnvPkgs %= S.insert dep- userEnv = [ "SharedMimeInfo" ]