autonix-deps-0.1.0.0: src/Autonix/CMake.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
module Autonix.CMake
( analyzeCMakePackages
, analyzeCMakePrograms
, cmakeAnalyzers
, detectCMake
) where
import Control.Lens
import Control.Monad.IO.Class
import Control.Monad.State
import Data.Conduit
import qualified Data.Set as S
import System.FilePath (takeFileName)
import Autonix.Analyze
import Autonix.Deps
import Autonix.Regex
detectCMake :: MonadState Deps m => Analyzer m
detectCMake pkg = awaitForever $ \(path, _) -> do
when (takeFileName path == "CMakeLists.txt")
$ ix pkg . nativeBuildInputs %= S.insert "cmake"
analyzeCMakePackages :: (MonadIO m, MonadState Deps m) => Analyzer m
analyzeCMakePackages pkg = awaitForever $ \(path, contents) -> do
when (takeFileName path == "CMakeLists.txt") $ do
let new = concatMap (take 1 . drop 1) $ match regex contents
regex = makeRegex
"find_package[[:space:]]*\\([[:space:]]*([^[:space:],$\\)]+)"
ix pkg . buildInputs %= S.union (S.fromList new)
analyzeCMakePrograms :: (MonadIO m, MonadState Deps m) => Analyzer m
analyzeCMakePrograms pkg = awaitForever $ \(path, contents) -> do
when (takeFileName path == "CMakeLists.txt") $ do
let new = concatMap (take 1 . drop 1) $ match regex contents
regex = makeRegex
"find_program[[:space:]]*\\([[:space:]]*([^[:space:],$\\)]+)"
ix pkg . nativeBuildInputs %= S.union (S.fromList new)
cmakeAnalyzers :: (MonadIO m, MonadState Deps m) => [Analyzer m]
cmakeAnalyzers = [detectCMake, analyzeCMakePackages, analyzeCMakePrograms]