autonix-deps-kf5 (empty) → 0.1.0.0
raw patch · 5 files changed
+235/−0 lines, 5 filesdep +autonix-depsdep +autonix-deps-kf5dep +basesetup-changed
Dependencies added: autonix-deps, autonix-deps-kf5, base, bytestring, conduit, containers, filepath, lens, mtl, transformers
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- autonix-deps-kf5.cabal +49/−0
- kf5-deps.hs +20/−0
- src/Autonix/KF5.hs +134/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2014, Thomas Tuegel++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Thomas Tuegel nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ autonix-deps-kf5.cabal view
@@ -0,0 +1,49 @@+name: autonix-deps-kf5+version: 0.1.0.0+synopsis: Generate dependencies for KDE 5 Nix expressions+license: BSD3+license-file: LICENSE+author: Thomas Tuegel+maintainer: ttuegel@gmail.com+copyright: 2014 Thomas Tuegel+category: System+build-type: Simple+cabal-version: >=1.10+bug-reports: https://github.com/ttuegel/autonix-deps-kf5/issues+description:+ @autonix-deps-kf5@ automatically detects dependencies for KDE Frameworks 5+ and related software collections. The generated dependencies are used to+ automatically create expressions for use by the Nix package manager.++source-repository head+ type: git+ location: https://github.com/ttuegel/autonix-deps-kf5.git++library+ exposed-modules:+ Autonix.KF5+ build-depends:+ autonix-deps ==0.1.*+ , base >=4.7 && <5+ , bytestring >=0.10+ , conduit ==1.2.*+ , containers >=0.5+ , filepath >=1.3+ , lens >=4.0+ , mtl >=2.1+ , transformers >=0.3+ hs-source-dirs: src+ default-language: Haskell2010+ ghc-options: -Wall++executable kf5-deps+ main-is: kf5-deps.hs+ build-depends:+ autonix-deps+ , autonix-deps-kf5+ , base+ , containers+ , lens+ , mtl+ default-language: Haskell2010+ ghc-options: -Wall
+ kf5-deps.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE OverloadedStrings #-}++module Main where++import Control.Monad.State+import Data.Monoid++import Autonix.Analyze+import Autonix.Args+import Autonix.Deps+import Autonix.Generate+import Autonix.KF5++main :: IO ()+main = withArgs $ \manifest renames -> flip evalStateT mempty $ do+ rename "ECM" "extra-cmake-modules"+ analyzePackages (analyzeFiles kf5Analyzers) manifest renames+ kf5PostAnalyze+ get >>= writeDeps+ get >>= writeRenames
+ src/Autonix/KF5.hs view
@@ -0,0 +1,134 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module Autonix.KF5 where++import Control.Lens+import Control.Monad.IO.Class+import Control.Monad.State+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.Monoid+import qualified Data.Set as S+import System.FilePath (takeBaseName, takeExtensions, takeFileName)++import Autonix.Analyze+import Autonix.CMake+import Autonix.Deps+import Autonix.Regex++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 ()++findKF5Components :: (MonadIO m, MonadState Deps m) => Analyzer m+findKF5Components pkg = awaitForever $ \(path, contents) ->+ when ("CMakeLists.txt" == takeFileName path) $ do+ let new = 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:]]+)\\)"+ ix pkg . buildInputs %= S.union (S.fromList $ map ("KF5" <>) new)++cmakeReserved :: ByteString -> Bool+cmakeReserved bs = or $ map ($ bs)+ [ B.elem '$'+ , B.elem '{'+ , B.elem '}'+ , B.elem '#'+ , B.elem '.'+ , (==) "COMPONENTS"+ , (==) "REQUIRED"+ , (==) "CONFIG"+ ]++kf5Analyzers :: (MonadIO m, MonadState Deps m) => [Analyzer m]+kf5Analyzers = [findKF5Components, 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" ]