module Distribution.PackageDescription.Check (
PackageCheck(..),
checkPackage,
checkConfiguredPackage,
checkPackageFiles,
checkPackageContent,
CheckPackageContentOps(..),
checkPackageFileNames,
) where
import Distribution.Compat.Prelude
import Prelude ()
import Control.Monad (mapM)
import Data.List (group)
import Distribution.Compat.Lens
import Distribution.Compiler
import Distribution.License
import Distribution.Package
import Distribution.PackageDescription
import Distribution.PackageDescription.Configuration
import Distribution.Pretty (prettyShow)
import Distribution.Simple.BuildPaths (autogenPathsModuleName)
import Distribution.Simple.BuildToolDepends
import Distribution.Simple.CCompiler
import Distribution.Simple.Glob
import Distribution.Simple.Utils hiding (findPackageDesc, notice)
import Distribution.System
import Distribution.Types.ComponentRequestedSpec
import Distribution.Types.CondTree
import Distribution.Types.ExeDependency
import Distribution.Types.LibraryName
import Distribution.Types.UnqualComponentName
import Distribution.Utils.Generic (isAscii)
import Distribution.Verbosity
import Distribution.Version
import Language.Haskell.Extension
import System.FilePath
(splitDirectories, splitExtension, splitPath, takeExtension, takeFileName, (<.>), (</>))
import qualified Data.ByteString.Lazy as BS
import qualified Data.Map as Map
import qualified Distribution.Compat.DList as DList
import qualified Distribution.SPDX as SPDX
import qualified System.Directory as System
import qualified System.Directory (getDirectoryContents)
import qualified System.FilePath.Windows as FilePath.Windows (isValid)
import qualified Data.Set as Set
import qualified Distribution.Types.BuildInfo.Lens as L
import qualified Distribution.Types.GenericPackageDescription.Lens as L
import qualified Distribution.Types.PackageDescription.Lens as L
data PackageCheck =
PackageBuildImpossible { PackageCheck -> String
explanation :: String }
| PackageBuildWarning { explanation :: String }
| PackageDistSuspicious { explanation :: String }
| PackageDistSuspiciousWarn { explanation :: String }
| PackageDistInexcusable { explanation :: String }
deriving (PackageCheck -> PackageCheck -> Bool
(PackageCheck -> PackageCheck -> Bool)
-> (PackageCheck -> PackageCheck -> Bool) -> Eq PackageCheck
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PackageCheck -> PackageCheck -> Bool
$c/= :: PackageCheck -> PackageCheck -> Bool
== :: PackageCheck -> PackageCheck -> Bool
$c== :: PackageCheck -> PackageCheck -> Bool
Eq, Eq PackageCheck
Eq PackageCheck =>
(PackageCheck -> PackageCheck -> Ordering)
-> (PackageCheck -> PackageCheck -> Bool)
-> (PackageCheck -> PackageCheck -> Bool)
-> (PackageCheck -> PackageCheck -> Bool)
-> (PackageCheck -> PackageCheck -> Bool)
-> (PackageCheck -> PackageCheck -> PackageCheck)
-> (PackageCheck -> PackageCheck -> PackageCheck)
-> Ord PackageCheck
PackageCheck -> PackageCheck -> Bool
PackageCheck -> PackageCheck -> Ordering
PackageCheck -> PackageCheck -> PackageCheck
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PackageCheck -> PackageCheck -> PackageCheck
$cmin :: PackageCheck -> PackageCheck -> PackageCheck
max :: PackageCheck -> PackageCheck -> PackageCheck
$cmax :: PackageCheck -> PackageCheck -> PackageCheck
>= :: PackageCheck -> PackageCheck -> Bool
$c>= :: PackageCheck -> PackageCheck -> Bool
> :: PackageCheck -> PackageCheck -> Bool
$c> :: PackageCheck -> PackageCheck -> Bool
<= :: PackageCheck -> PackageCheck -> Bool
$c<= :: PackageCheck -> PackageCheck -> Bool
< :: PackageCheck -> PackageCheck -> Bool
$c< :: PackageCheck -> PackageCheck -> Bool
compare :: PackageCheck -> PackageCheck -> Ordering
$ccompare :: PackageCheck -> PackageCheck -> Ordering
$cp1Ord :: Eq PackageCheck
Ord)
instance Show PackageCheck where
show :: PackageCheck -> String
show notice :: PackageCheck
notice = PackageCheck -> String
explanation PackageCheck
notice
check :: Bool -> PackageCheck -> Maybe PackageCheck
check :: Bool -> PackageCheck -> Maybe PackageCheck
check False _ = Maybe PackageCheck
forall a. Maybe a
Nothing
check True pc :: PackageCheck
pc = PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just PackageCheck
pc
checkSpecVersion :: PackageDescription -> [Int] -> Bool -> PackageCheck
-> Maybe PackageCheck
checkSpecVersion :: PackageDescription
-> [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkSpecVersion pkg :: PackageDescription
pkg specver :: [Int]
specver cond :: Bool
cond pc :: PackageCheck
pc
| PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [Int]
specver = Maybe PackageCheck
forall a. Maybe a
Nothing
| Bool
otherwise = Bool -> PackageCheck -> Maybe PackageCheck
check Bool
cond PackageCheck
pc
checkPackage :: GenericPackageDescription
-> Maybe PackageDescription
-> [PackageCheck]
checkPackage :: GenericPackageDescription
-> Maybe PackageDescription -> [PackageCheck]
checkPackage gpkg :: GenericPackageDescription
gpkg mpkg :: Maybe PackageDescription
mpkg =
PackageDescription -> [PackageCheck]
checkConfiguredPackage PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ GenericPackageDescription -> [PackageCheck]
checkConditionals GenericPackageDescription
gpkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ GenericPackageDescription -> [PackageCheck]
checkPackageVersions GenericPackageDescription
gpkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ GenericPackageDescription -> [PackageCheck]
checkDevelopmentOnlyFlags GenericPackageDescription
gpkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ GenericPackageDescription -> [PackageCheck]
checkFlagNames GenericPackageDescription
gpkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ GenericPackageDescription -> [PackageCheck]
checkUnusedFlags GenericPackageDescription
gpkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ GenericPackageDescription -> [PackageCheck]
checkUnicodeXFields GenericPackageDescription
gpkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkPathsModuleExtensions PackageDescription
pkg
where
pkg :: PackageDescription
pkg = PackageDescription
-> Maybe PackageDescription -> PackageDescription
forall a. a -> Maybe a -> a
fromMaybe (GenericPackageDescription -> PackageDescription
flattenPackageDescription GenericPackageDescription
gpkg) Maybe PackageDescription
mpkg
checkConfiguredPackage :: PackageDescription -> [PackageCheck]
checkConfiguredPackage :: PackageDescription -> [PackageCheck]
checkConfiguredPackage pkg :: PackageDescription
pkg =
PackageDescription -> [PackageCheck]
checkSanity PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkFields PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkLicense PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkSourceRepos PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkAllGhcOptions PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkCCOptions PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkCxxOptions PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkCPPOptions PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkPaths PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ PackageDescription -> [PackageCheck]
checkCabalVersion PackageDescription
pkg
checkSanity :: PackageDescription -> [PackageCheck]
checkSanity :: PackageDescription -> [PackageCheck]
checkSanity pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (String -> Bool)
-> (PackageDescription -> String) -> PackageDescription -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
unPackageName (PackageName -> String)
-> (PackageDescription -> PackageName)
-> PackageDescription
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName (PackageDescription -> Bool) -> PackageDescription -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription
pkg) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible "No 'name' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Version
nullVersion Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== PackageDescription -> Version
forall pkg. Package pkg => pkg -> Version
packageVersion PackageDescription
pkg) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible "No 'version' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (((PackageDescription -> Bool) -> Bool)
-> [PackageDescription -> Bool] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ((PackageDescription -> Bool) -> PackageDescription -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription
pkg) [ [Executable] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Executable] -> Bool)
-> (PackageDescription -> [Executable])
-> PackageDescription
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> [Executable]
executables
, [TestSuite] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([TestSuite] -> Bool)
-> (PackageDescription -> [TestSuite])
-> PackageDescription
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> [TestSuite]
testSuites
, [Benchmark] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Benchmark] -> Bool)
-> (PackageDescription -> [Benchmark])
-> PackageDescription
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> [Benchmark]
benchmarks
, [Library] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Library] -> Bool)
-> (PackageDescription -> [Library]) -> PackageDescription -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> [Library]
allLibraries
, [ForeignLib] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([ForeignLib] -> Bool)
-> (PackageDescription -> [ForeignLib])
-> PackageDescription
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> [ForeignLib]
foreignLibs ]) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible
"No executables, libraries, tests, or benchmarks found. Nothing to do."
, Bool -> PackageCheck -> Maybe PackageCheck
check ((LibraryName -> Bool) -> [LibraryName] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (LibraryName -> LibraryName -> Bool
forall a. Eq a => a -> a -> Bool
== LibraryName
LMainLibName) ((Library -> LibraryName) -> [Library] -> [LibraryName]
forall a b. (a -> b) -> [a] -> [b]
map Library -> LibraryName
libName ([Library] -> [LibraryName]) -> [Library] -> [LibraryName]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [Library]
subLibraries PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ "Found one or more unnamed internal libraries. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Only the non-internal library can have the same name as the package."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([UnqualComponentName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [UnqualComponentName]
duplicateNames)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ "Duplicate sections: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((UnqualComponentName -> String)
-> [UnqualComponentName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map UnqualComponentName -> String
unUnqualComponentName [UnqualComponentName]
duplicateNames)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". The name of every library, executable, test suite,"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " and benchmark section in"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " the package must be unique."
, Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg)) (UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (UnqualComponentName -> String)
-> [UnqualComponentName] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [UnqualComponentName]
subLibNames)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ "Illegal internal library name "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageName -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". Internal libraries cannot have the same name as the package."
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " Maybe you wanted a non-internal library?"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " If so, rewrite the section stanza"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " from 'library: '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageName -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' to 'library'."
]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ (Library -> [PackageCheck]) -> [Library] -> [PackageCheck]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (PackageDescription -> Library -> [PackageCheck]
checkLibrary PackageDescription
pkg) (PackageDescription -> [Library]
allLibraries PackageDescription
pkg)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ (Executable -> [PackageCheck]) -> [Executable] -> [PackageCheck]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (PackageDescription -> Executable -> [PackageCheck]
checkExecutable PackageDescription
pkg) (PackageDescription -> [Executable]
executables PackageDescription
pkg)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ (TestSuite -> [PackageCheck]) -> [TestSuite] -> [PackageCheck]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (PackageDescription -> TestSuite -> [PackageCheck]
checkTestSuite PackageDescription
pkg) (PackageDescription -> [TestSuite]
testSuites PackageDescription
pkg)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ (Benchmark -> [PackageCheck]) -> [Benchmark] -> [PackageCheck]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (PackageDescription -> Benchmark -> [PackageCheck]
checkBenchmark PackageDescription
pkg) (PackageDescription -> [Benchmark]
benchmarks PackageDescription
pkg)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ [Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
> Version
cabalVersion) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"This package description follows version "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> Version
specVersion PackageDescription
pkg) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " of the Cabal specification. This "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "tool only supports up to version " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow Version
cabalVersion String -> ShowS
forall a. [a] -> [a] -> [a]
++ "."
]
where
subLibNames :: [UnqualComponentName]
subLibNames = (Library -> Maybe UnqualComponentName)
-> [Library] -> [UnqualComponentName]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (LibraryName -> Maybe UnqualComponentName
libraryNameString (LibraryName -> Maybe UnqualComponentName)
-> (Library -> LibraryName) -> Library -> Maybe UnqualComponentName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Library -> LibraryName
libName) ([Library] -> [UnqualComponentName])
-> [Library] -> [UnqualComponentName]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [Library]
subLibraries PackageDescription
pkg
exeNames :: [UnqualComponentName]
exeNames = (Executable -> UnqualComponentName)
-> [Executable] -> [UnqualComponentName]
forall a b. (a -> b) -> [a] -> [b]
map Executable -> UnqualComponentName
exeName ([Executable] -> [UnqualComponentName])
-> [Executable] -> [UnqualComponentName]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [Executable]
executables PackageDescription
pkg
testNames :: [UnqualComponentName]
testNames = (TestSuite -> UnqualComponentName)
-> [TestSuite] -> [UnqualComponentName]
forall a b. (a -> b) -> [a] -> [b]
map TestSuite -> UnqualComponentName
testName ([TestSuite] -> [UnqualComponentName])
-> [TestSuite] -> [UnqualComponentName]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [TestSuite]
testSuites PackageDescription
pkg
bmNames :: [UnqualComponentName]
bmNames = (Benchmark -> UnqualComponentName)
-> [Benchmark] -> [UnqualComponentName]
forall a b. (a -> b) -> [a] -> [b]
map Benchmark -> UnqualComponentName
benchmarkName ([Benchmark] -> [UnqualComponentName])
-> [Benchmark] -> [UnqualComponentName]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [Benchmark]
benchmarks PackageDescription
pkg
duplicateNames :: [UnqualComponentName]
duplicateNames = [UnqualComponentName] -> [UnqualComponentName]
forall a. Ord a => [a] -> [a]
dups ([UnqualComponentName] -> [UnqualComponentName])
-> [UnqualComponentName] -> [UnqualComponentName]
forall a b. (a -> b) -> a -> b
$ [UnqualComponentName]
subLibNames [UnqualComponentName]
-> [UnqualComponentName] -> [UnqualComponentName]
forall a. [a] -> [a] -> [a]
++ [UnqualComponentName]
exeNames [UnqualComponentName]
-> [UnqualComponentName] -> [UnqualComponentName]
forall a. [a] -> [a] -> [a]
++ [UnqualComponentName]
testNames [UnqualComponentName]
-> [UnqualComponentName] -> [UnqualComponentName]
forall a. [a] -> [a] -> [a]
++ [UnqualComponentName]
bmNames
checkLibrary :: PackageDescription -> Library -> [PackageCheck]
checkLibrary :: PackageDescription -> Library -> [PackageCheck]
checkLibrary pkg :: PackageDescription
pkg lib :: Library
lib =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ModuleName]
moduleDuplicates)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Duplicate modules in library: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ModuleName -> String) -> [ModuleName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ModuleName -> String
forall a. Pretty a => a -> String
prettyShow [ModuleName]
moduleDuplicates)
, Bool -> PackageCheck -> Maybe PackageCheck
check ([ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Library -> [ModuleName]
explicitLibModules Library
lib) Bool -> Bool -> Bool
&& [ModuleReexport] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Library -> [ModuleReexport]
reexportedModules Library
lib)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
LibraryName -> String
showLibraryName (Library -> LibraryName
libName Library
lib) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " does not expose any modules"
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,25] (Bool -> Bool
not ([ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Library -> [ModuleName]
signatures Library
lib))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'signatures' field the package needs to specify "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "at least 'cabal-version: 2.0'."
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (ModuleName -> Bool) -> [ModuleName] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((ModuleName -> [ModuleName] -> Bool)
-> [ModuleName] -> ModuleName -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Library -> [ModuleName]
explicitLibModules Library
lib)) (Library -> [ModuleName]
libModulesAutogen Library
lib)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"An 'autogen-module' is neither on 'exposed-modules' or "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'other-modules'."
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> [String] -> Bool) -> [String] -> String -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Library -> [String]
forall a. HasBuildInfo a => a -> [String]
allExplicitIncludes Library
lib)) (Getting [String] Library [String] -> Library -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] Library [String]
forall a. HasBuildInfo a => Lens' a [String]
L.autogenIncludes Library
lib)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"An include in 'autogen-includes' is neither in 'includes' or "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'install-includes'."
]
where
checkVersion :: [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion :: [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion ver :: [Int]
ver cond :: Bool
cond pc :: PackageCheck
pc
| PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [Int]
ver = Maybe PackageCheck
forall a. Maybe a
Nothing
| Bool
otherwise = Bool -> PackageCheck -> Maybe PackageCheck
check Bool
cond PackageCheck
pc
moduleDuplicates :: [ModuleName]
moduleDuplicates = [ModuleName] -> [ModuleName]
forall a. Ord a => [a] -> [a]
dups (Library -> [ModuleName]
explicitLibModules Library
lib [ModuleName] -> [ModuleName] -> [ModuleName]
forall a. [a] -> [a] -> [a]
++
(ModuleReexport -> ModuleName) -> [ModuleReexport] -> [ModuleName]
forall a b. (a -> b) -> [a] -> [b]
map ModuleReexport -> ModuleName
moduleReexportName (Library -> [ModuleReexport]
reexportedModules Library
lib))
allExplicitIncludes :: L.HasBuildInfo a => a -> [FilePath]
allExplicitIncludes :: a -> [String]
allExplicitIncludes x :: a
x = Getting [String] a [String] -> a -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] a [String]
forall a. HasBuildInfo a => Lens' a [String]
L.includes a
x [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Getting [String] a [String] -> a -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] a [String]
forall a. HasBuildInfo a => Lens' a [String]
L.installIncludes a
x
checkExecutable :: PackageDescription -> Executable -> [PackageCheck]
checkExecutable :: PackageDescription -> Executable -> [PackageCheck]
checkExecutable pkg :: PackageDescription
pkg exe :: Executable
exe =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Executable -> String
modulePath Executable
exe)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"No 'main-is' field found for executable " String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (Executable -> UnqualComponentName
exeName Executable
exe)
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Executable -> String
modulePath Executable
exe))
Bool -> Bool -> Bool
&& (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
fileExtensionSupportedLanguage (String -> Bool) -> String -> Bool
forall a b. (a -> b) -> a -> b
$ Executable -> String
modulePath Executable
exe)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'main-is' field must specify a '.hs' or '.lhs' file "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "(even if it is generated by a preprocessor), "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "or it may specify a C/C++/obj-C source file."
, PackageDescription
-> [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkSpecVersion PackageDescription
pkg [1,17]
(String -> Bool
fileExtensionSupportedLanguage (Executable -> String
modulePath Executable
exe)
Bool -> Bool -> Bool
&& ShowS
takeExtension (Executable -> String
modulePath Executable
exe) String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [".hs", ".lhs"]) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses a C/C++/obj-C source file for the 'main-is' field. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "To use this feature you must specify 'cabal-version: >= 1.18'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ModuleName]
moduleDuplicates)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Duplicate modules in executable '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (Executable -> UnqualComponentName
exeName Executable
exe) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "': "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ModuleName -> String) -> [ModuleName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ModuleName -> String
forall a. Pretty a => a -> String
prettyShow [ModuleName]
moduleDuplicates)
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (ModuleName -> Bool) -> [ModuleName] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((ModuleName -> [ModuleName] -> Bool)
-> [ModuleName] -> ModuleName -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Executable -> [ModuleName]
exeModules Executable
exe)) (Executable -> [ModuleName]
exeModulesAutogen Executable
exe)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"On executable '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (Executable -> UnqualComponentName
exeName Executable
exe) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' an 'autogen-module' is not "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "on 'other-modules'"
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> [String] -> Bool) -> [String] -> String -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Getting [String] Executable [String] -> Executable -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] Executable [String]
forall a. HasBuildInfo a => Lens' a [String]
L.includes Executable
exe)) (Getting [String] Executable [String] -> Executable -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] Executable [String]
forall a. HasBuildInfo a => Lens' a [String]
L.autogenIncludes Executable
exe)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible "An include in 'autogen-includes' is not in 'includes'."
]
where
moduleDuplicates :: [ModuleName]
moduleDuplicates = [ModuleName] -> [ModuleName]
forall a. Ord a => [a] -> [a]
dups (Executable -> [ModuleName]
exeModules Executable
exe)
checkTestSuite :: PackageDescription -> TestSuite -> [PackageCheck]
checkTestSuite :: PackageDescription -> TestSuite -> [PackageCheck]
checkTestSuite pkg :: PackageDescription
pkg test :: TestSuite
test =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
case TestSuite -> TestSuiteInterface
testInterface TestSuite
test of
TestSuiteUnsupported tt :: TestType
tt@(TestTypeUnknown _ _) -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (TestType -> String
forall a. Pretty a => a -> String
prettyShow TestType
tt) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a known type of test suite. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The known test suite types are: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((TestType -> String) -> [TestType] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map TestType -> String
forall a. Pretty a => a -> String
prettyShow [TestType]
knownTestTypes)
TestSuiteUnsupported tt :: TestType
tt -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (TestType -> String
forall a. Pretty a => a -> String
prettyShow TestType
tt) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a supported test suite version. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The known test suite types are: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((TestType -> String) -> [TestType] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map TestType -> String
forall a. Pretty a => a -> String
prettyShow [TestType]
knownTestTypes)
_ -> Maybe PackageCheck
forall a. Maybe a
Nothing
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ModuleName]
moduleDuplicates) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Duplicate modules in test suite '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (TestSuite -> UnqualComponentName
testName TestSuite
test) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "': "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ModuleName -> String) -> [ModuleName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ModuleName -> String
forall a. Pretty a => a -> String
prettyShow [ModuleName]
moduleDuplicates)
, Bool -> PackageCheck -> Maybe PackageCheck
check Bool
mainIsWrongExt (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'main-is' field must specify a '.hs' or '.lhs' file "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "(even if it is generated by a preprocessor), "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "or it may specify a C/C++/obj-C source file."
, PackageDescription
-> [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkSpecVersion PackageDescription
pkg [1,17] (Bool
mainIsNotHsExt Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
mainIsWrongExt) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses a C/C++/obj-C source file for the 'main-is' field. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "To use this feature you must specify 'cabal-version: >= 1.18'."
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (ModuleName -> Bool) -> [ModuleName] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((ModuleName -> [ModuleName] -> Bool)
-> [ModuleName] -> ModuleName -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (TestSuite -> [ModuleName]
testModules TestSuite
test)) (TestSuite -> [ModuleName]
testModulesAutogen TestSuite
test)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"On test suite '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (TestSuite -> UnqualComponentName
testName TestSuite
test) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' an 'autogen-module' is not "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "on 'other-modules'"
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> [String] -> Bool) -> [String] -> String -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Getting [String] TestSuite [String] -> TestSuite -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] TestSuite [String]
forall a. HasBuildInfo a => Lens' a [String]
L.includes TestSuite
test)) (Getting [String] TestSuite [String] -> TestSuite -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] TestSuite [String]
forall a. HasBuildInfo a => Lens' a [String]
L.autogenIncludes TestSuite
test)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible "An include in 'autogen-includes' is not in 'includes'."
]
where
moduleDuplicates :: [ModuleName]
moduleDuplicates = [ModuleName] -> [ModuleName]
forall a. Ord a => [a] -> [a]
dups ([ModuleName] -> [ModuleName]) -> [ModuleName] -> [ModuleName]
forall a b. (a -> b) -> a -> b
$ TestSuite -> [ModuleName]
testModules TestSuite
test
mainIsWrongExt :: Bool
mainIsWrongExt = case TestSuite -> TestSuiteInterface
testInterface TestSuite
test of
TestSuiteExeV10 _ f :: String
f -> Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
fileExtensionSupportedLanguage String
f
_ -> Bool
False
mainIsNotHsExt :: Bool
mainIsNotHsExt = case TestSuite -> TestSuiteInterface
testInterface TestSuite
test of
TestSuiteExeV10 _ f :: String
f -> ShowS
takeExtension String
f String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [".hs", ".lhs"]
_ -> Bool
False
checkBenchmark :: PackageDescription -> Benchmark -> [PackageCheck]
checkBenchmark :: PackageDescription -> Benchmark -> [PackageCheck]
checkBenchmark _pkg :: PackageDescription
_pkg bm :: Benchmark
bm =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
case Benchmark -> BenchmarkInterface
benchmarkInterface Benchmark
bm of
BenchmarkUnsupported tt :: BenchmarkType
tt@(BenchmarkTypeUnknown _ _) -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (BenchmarkType -> String
forall a. Pretty a => a -> String
prettyShow BenchmarkType
tt) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a known type of benchmark. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The known benchmark types are: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((BenchmarkType -> String) -> [BenchmarkType] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map BenchmarkType -> String
forall a. Pretty a => a -> String
prettyShow [BenchmarkType]
knownBenchmarkTypes)
BenchmarkUnsupported tt :: BenchmarkType
tt -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (BenchmarkType -> String
forall a. Pretty a => a -> String
prettyShow BenchmarkType
tt) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a supported benchmark version. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The known benchmark types are: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((BenchmarkType -> String) -> [BenchmarkType] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map BenchmarkType -> String
forall a. Pretty a => a -> String
prettyShow [BenchmarkType]
knownBenchmarkTypes)
_ -> Maybe PackageCheck
forall a. Maybe a
Nothing
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ModuleName]
moduleDuplicates) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Duplicate modules in benchmark '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (Benchmark -> UnqualComponentName
benchmarkName Benchmark
bm) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "': "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ModuleName -> String) -> [ModuleName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ModuleName -> String
forall a. Pretty a => a -> String
prettyShow [ModuleName]
moduleDuplicates)
, Bool -> PackageCheck -> Maybe PackageCheck
check Bool
mainIsWrongExt (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'main-is' field must specify a '.hs' or '.lhs' file "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "(even if it is generated by a preprocessor)."
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (ModuleName -> Bool) -> [ModuleName] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((ModuleName -> [ModuleName] -> Bool)
-> [ModuleName] -> ModuleName -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Benchmark -> [ModuleName]
benchmarkModules Benchmark
bm)) (Benchmark -> [ModuleName]
benchmarkModulesAutogen Benchmark
bm)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"On benchmark '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ UnqualComponentName -> String
forall a. Pretty a => a -> String
prettyShow (Benchmark -> UnqualComponentName
benchmarkName Benchmark
bm) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' an 'autogen-module' is "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "not on 'other-modules'"
, Bool -> PackageCheck -> Maybe PackageCheck
check
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> [String] -> Bool) -> [String] -> String -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (Getting [String] Benchmark [String] -> Benchmark -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] Benchmark [String]
forall a. HasBuildInfo a => Lens' a [String]
L.includes Benchmark
bm)) (Getting [String] Benchmark [String] -> Benchmark -> [String]
forall a s. Getting a s a -> s -> a
view Getting [String] Benchmark [String]
forall a. HasBuildInfo a => Lens' a [String]
L.autogenIncludes Benchmark
bm)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible "An include in 'autogen-includes' is not in 'includes'."
]
where
moduleDuplicates :: [ModuleName]
moduleDuplicates = [ModuleName] -> [ModuleName]
forall a. Ord a => [a] -> [a]
dups ([ModuleName] -> [ModuleName]) -> [ModuleName] -> [ModuleName]
forall a b. (a -> b) -> a -> b
$ Benchmark -> [ModuleName]
benchmarkModules Benchmark
bm
mainIsWrongExt :: Bool
mainIsWrongExt = case Benchmark -> BenchmarkInterface
benchmarkInterface Benchmark
bm of
BenchmarkExeV10 _ f :: String
f -> ShowS
takeExtension String
f String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [".hs", ".lhs"]
_ -> Bool
False
checkFields :: PackageDescription -> [PackageCheck]
checkFields :: PackageDescription -> [PackageCheck]
checkFields pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool)
-> (PackageDescription -> Bool) -> PackageDescription -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
FilePath.Windows.isValid (String -> Bool)
-> (PackageDescription -> String) -> PackageDescription -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
forall a. Pretty a => a -> String
prettyShow (PackageName -> String)
-> (PackageDescription -> PackageName)
-> PackageDescription
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName (PackageDescription -> Bool) -> PackageDescription -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription
pkg) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unfortunately, the package name '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageName -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' is one of the reserved system file names on Windows. Many tools "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "need to convert package names to file names so using this name "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "would cause problems."
, Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
isPrefixOf "z-") (String -> Bool)
-> (PackageDescription -> String) -> PackageDescription -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
forall a. Pretty a => a -> String
prettyShow (PackageName -> String)
-> (PackageDescription -> PackageName)
-> PackageDescription
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName (PackageDescription -> Bool) -> PackageDescription -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription
pkg) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Package names with the prefix 'z-' are reserved by Cabal and "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "cannot be used."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Maybe BuildType -> Bool
forall a. Maybe a -> Bool
isNothing (PackageDescription -> Maybe BuildType
buildTypeRaw PackageDescription
pkg) Bool -> Bool -> Bool
&& PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
< [Int] -> Version
mkVersion [2,1]) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"No 'build-type' specified. If you do not need a custom Setup.hs or "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "./configure script then use 'build-type: Simple'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Maybe SetupBuildInfo -> Bool
forall a. Maybe a -> Bool
isJust (PackageDescription -> Maybe SetupBuildInfo
setupBuildInfo PackageDescription
pkg) Bool -> Bool -> Bool
&& PackageDescription -> BuildType
buildType PackageDescription
pkg BuildType -> BuildType -> Bool
forall a. Eq a => a -> a -> Bool
/= BuildType
Custom) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Ignoring the 'custom-setup' section because the 'build-type' is "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "not 'Custom'. Use 'build-type: Custom' if you need to use a "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "custom Setup.hs script."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownCompilers)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unknown compiler " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep (ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ShowS
quote [String]
unknownCompilers)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " in 'tested-with' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownLanguages)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unknown languages: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep [String]
unknownLanguages
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownExtensions)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unknown extensions: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep [String]
unknownExtensions
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
languagesUsedAsExtensions)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Languages listed as extensions: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep [String]
languagesUsedAsExtensions
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". Languages must be specified in either the 'default-language' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " or the 'other-languages' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([(Extension, Maybe Extension)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Extension, Maybe Extension)]
ourDeprecatedExtensions)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Deprecated extensions: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep (((Extension, Maybe Extension) -> String)
-> [(Extension, Maybe Extension)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ShowS
quote ShowS
-> ((Extension, Maybe Extension) -> String)
-> (Extension, Maybe Extension)
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Extension -> String
forall a. Pretty a => a -> String
prettyShow (Extension -> String)
-> ((Extension, Maybe Extension) -> Extension)
-> (Extension, Maybe Extension)
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Extension, Maybe Extension) -> Extension
forall a b. (a, b) -> a
fst) [(Extension, Maybe Extension)]
ourDeprecatedExtensions)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords
[ "Instead of '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Extension -> String
forall a. Pretty a => a -> String
prettyShow Extension
ext
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' use '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Extension -> String
forall a. Pretty a => a -> String
prettyShow Extension
replacement String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'."
| (ext :: Extension
ext, Just replacement :: Extension
replacement) <- [(Extension, Maybe Extension)]
ourDeprecatedExtensions ]
, Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
category PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious "No 'category' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
maintainer PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious "No 'maintainer' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
synopsis PackageDescription
pkg) Bool -> Bool -> Bool
&& String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
description PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable "No 'synopsis' or 'description' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
description PackageDescription
pkg) Bool -> Bool -> Bool
&& Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
synopsis PackageDescription
pkg))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious "No 'description' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
synopsis PackageDescription
pkg) Bool -> Bool -> Bool
&& Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
description PackageDescription
pkg))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious "No 'synopsis' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (PackageDescription -> String
synopsis PackageDescription
pkg) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 80) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious
"The 'synopsis' field is rather long (max 80 chars is recommended)."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
description PackageDescription
pkg))
Bool -> Bool -> Bool
&& String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (PackageDescription -> String
description PackageDescription
pkg) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (PackageDescription -> String
synopsis PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'description' field should be longer than the 'synopsis' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "field. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "It's useful to provide an informative 'description' to allow "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Haskell programmers who have never heard about your package to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "understand the purpose of your package. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The 'description' field content is typically shown by tooling "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "(e.g. 'cabal info', Haddock, Hackage) below the 'synopsis' which "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "serves as a headline. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Please refer to <https://www.haskell.org/"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "cabal/users-guide/developing-packages.html#package-properties>"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " for more details."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
testedWithImpossibleRanges)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Invalid 'tested-with' version range: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
forall a. Pretty a => a -> String
prettyShow [Dependency]
testedWithImpossibleRanges)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". To indicate that you have tested a package with multiple "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "different versions of the same compiler use multiple entries, "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "for example 'tested-with: GHC==6.10.4, GHC==6.12.3' and not "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'tested-with: GHC==6.10.4 && ==6.12.3'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool
False Bool -> Bool -> Bool
&& Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
depInternalLibraryWithExtraVersion)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package has an extraneous version range for a dependency on an "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "internal library: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
forall a. Pretty a => a -> String
prettyShow [Dependency]
depInternalLibraryWithExtraVersion)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". This version range includes the current package but isn't needed "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "as the current package's library will always be used."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
depInternalLibraryWithImpossibleVersion)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package has an impossible version range for a dependency on an "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "internal library: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
forall a. Pretty a => a -> String
prettyShow [Dependency]
depInternalLibraryWithImpossibleVersion)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". This version range does not include the current package, and must "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "be removed as the current package's library will always be used."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([ExeDependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ExeDependency]
depInternalExecutableWithExtraVersion)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package has an extraneous version range for a dependency on an "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "internal executable: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ExeDependency -> String) -> [ExeDependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ExeDependency -> String
forall a. Pretty a => a -> String
prettyShow [ExeDependency]
depInternalExecutableWithExtraVersion)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". This version range includes the current package but isn't needed "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "as the current package's executable will always be used."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([ExeDependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ExeDependency]
depInternalExecutableWithImpossibleVersion)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package has an impossible version range for a dependency on an "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "internal executable: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ExeDependency -> String) -> [ExeDependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ExeDependency -> String
forall a. Pretty a => a -> String
prettyShow [ExeDependency]
depInternalExecutableWithImpossibleVersion)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". This version range does not include the current package, and must "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "be removed as the current package's executable will always be used."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([ExeDependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ExeDependency]
depMissingInternalExecutable)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package depends on a missing internal executable: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((ExeDependency -> String) -> [ExeDependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ExeDependency -> String
forall a. Pretty a => a -> String
prettyShow [ExeDependency]
depInternalExecutableWithImpossibleVersion)
]
where
unknownCompilers :: [String]
unknownCompilers = [ String
name | (OtherCompiler name :: String
name, _) <- PackageDescription -> [(CompilerFlavor, VersionRange)]
testedWith PackageDescription
pkg ]
unknownLanguages :: [String]
unknownLanguages = [ String
name | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, UnknownLanguage name :: String
name <- BuildInfo -> [Language]
allLanguages BuildInfo
bi ]
unknownExtensions :: [String]
unknownExtensions = [ String
name | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, UnknownExtension name :: String
name <- BuildInfo -> [Extension]
allExtensions BuildInfo
bi
, String
name String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` (Language -> String) -> [Language] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Language -> String
forall a. Pretty a => a -> String
prettyShow [Language]
knownLanguages ]
ourDeprecatedExtensions :: [(Extension, Maybe Extension)]
ourDeprecatedExtensions = [(Extension, Maybe Extension)] -> [(Extension, Maybe Extension)]
forall a. Eq a => [a] -> [a]
nub ([(Extension, Maybe Extension)] -> [(Extension, Maybe Extension)])
-> [(Extension, Maybe Extension)] -> [(Extension, Maybe Extension)]
forall a b. (a -> b) -> a -> b
$ [Maybe (Extension, Maybe Extension)]
-> [(Extension, Maybe Extension)]
forall a. [Maybe a] -> [a]
catMaybes
[ ((Extension, Maybe Extension) -> Bool)
-> [(Extension, Maybe Extension)]
-> Maybe (Extension, Maybe Extension)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((Extension -> Extension -> Bool
forall a. Eq a => a -> a -> Bool
==Extension
ext) (Extension -> Bool)
-> ((Extension, Maybe Extension) -> Extension)
-> (Extension, Maybe Extension)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Extension, Maybe Extension) -> Extension
forall a b. (a, b) -> a
fst) [(Extension, Maybe Extension)]
deprecatedExtensions
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, Extension
ext <- BuildInfo -> [Extension]
allExtensions BuildInfo
bi ]
languagesUsedAsExtensions :: [String]
languagesUsedAsExtensions =
[ String
name | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, UnknownExtension name :: String
name <- BuildInfo -> [Extension]
allExtensions BuildInfo
bi
, String
name String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Language -> String) -> [Language] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Language -> String
forall a. Pretty a => a -> String
prettyShow [Language]
knownLanguages ]
testedWithImpossibleRanges :: [Dependency]
testedWithImpossibleRanges =
[ PackageName -> VersionRange -> Set LibraryName -> Dependency
Dependency (String -> PackageName
mkPackageName (CompilerFlavor -> String
forall a. Pretty a => a -> String
prettyShow CompilerFlavor
compiler)) VersionRange
vr Set LibraryName
forall a. Set a
Set.empty
| (compiler :: CompilerFlavor
compiler, vr :: VersionRange
vr) <- PackageDescription -> [(CompilerFlavor, VersionRange)]
testedWith PackageDescription
pkg
, VersionRange -> Bool
isNoVersion VersionRange
vr ]
internalLibraries :: [PackageName]
internalLibraries =
(Library -> PackageName) -> [Library] -> [PackageName]
forall a b. (a -> b) -> [a] -> [b]
map (PackageName
-> (UnqualComponentName -> PackageName)
-> Maybe UnqualComponentName
-> PackageName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName PackageDescription
pkg) (UnqualComponentName -> PackageName
unqualComponentNameToPackageName) (Maybe UnqualComponentName -> PackageName)
-> (Library -> Maybe UnqualComponentName) -> Library -> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LibraryName -> Maybe UnqualComponentName
libraryNameString (LibraryName -> Maybe UnqualComponentName)
-> (Library -> LibraryName) -> Library -> Maybe UnqualComponentName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Library -> LibraryName
libName)
(PackageDescription -> [Library]
allLibraries PackageDescription
pkg)
internalExecutables :: [UnqualComponentName]
internalExecutables = (Executable -> UnqualComponentName)
-> [Executable] -> [UnqualComponentName]
forall a b. (a -> b) -> [a] -> [b]
map Executable -> UnqualComponentName
exeName ([Executable] -> [UnqualComponentName])
-> [Executable] -> [UnqualComponentName]
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [Executable]
executables PackageDescription
pkg
internalLibDeps :: [Dependency]
internalLibDeps =
[ Dependency
dep
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, dep :: Dependency
dep@(Dependency name :: PackageName
name _ _) <- BuildInfo -> [Dependency]
targetBuildDepends BuildInfo
bi
, PackageName
name PackageName -> [PackageName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PackageName]
internalLibraries
]
internalExeDeps :: [ExeDependency]
internalExeDeps =
[ ExeDependency
dep
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, ExeDependency
dep <- PackageDescription -> BuildInfo -> [ExeDependency]
getAllToolDependencies PackageDescription
pkg BuildInfo
bi
, PackageDescription -> ExeDependency -> Bool
isInternal PackageDescription
pkg ExeDependency
dep
]
depInternalLibraryWithExtraVersion :: [Dependency]
depInternalLibraryWithExtraVersion =
[ Dependency
dep
| dep :: Dependency
dep@(Dependency _ versionRange :: VersionRange
versionRange _) <- [Dependency]
internalLibDeps
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ VersionRange -> Bool
isAnyVersion VersionRange
versionRange
, PackageDescription -> Version
forall pkg. Package pkg => pkg -> Version
packageVersion PackageDescription
pkg Version -> VersionRange -> Bool
`withinRange` VersionRange
versionRange
]
depInternalLibraryWithImpossibleVersion :: [Dependency]
depInternalLibraryWithImpossibleVersion =
[ Dependency
dep
| dep :: Dependency
dep@(Dependency _ versionRange :: VersionRange
versionRange _) <- [Dependency]
internalLibDeps
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription -> Version
forall pkg. Package pkg => pkg -> Version
packageVersion PackageDescription
pkg Version -> VersionRange -> Bool
`withinRange` VersionRange
versionRange
]
depInternalExecutableWithExtraVersion :: [ExeDependency]
depInternalExecutableWithExtraVersion =
[ ExeDependency
dep
| dep :: ExeDependency
dep@(ExeDependency _ _ versionRange :: VersionRange
versionRange) <- [ExeDependency]
internalExeDeps
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ VersionRange -> Bool
isAnyVersion VersionRange
versionRange
, PackageDescription -> Version
forall pkg. Package pkg => pkg -> Version
packageVersion PackageDescription
pkg Version -> VersionRange -> Bool
`withinRange` VersionRange
versionRange
]
depInternalExecutableWithImpossibleVersion :: [ExeDependency]
depInternalExecutableWithImpossibleVersion =
[ ExeDependency
dep
| dep :: ExeDependency
dep@(ExeDependency _ _ versionRange :: VersionRange
versionRange) <- [ExeDependency]
internalExeDeps
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription -> Version
forall pkg. Package pkg => pkg -> Version
packageVersion PackageDescription
pkg Version -> VersionRange -> Bool
`withinRange` VersionRange
versionRange
]
depMissingInternalExecutable :: [ExeDependency]
depMissingInternalExecutable =
[ ExeDependency
dep
| dep :: ExeDependency
dep@(ExeDependency _ eName :: UnqualComponentName
eName _) <- [ExeDependency]
internalExeDeps
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ UnqualComponentName
eName UnqualComponentName -> [UnqualComponentName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [UnqualComponentName]
internalExecutables
]
checkLicense :: PackageDescription -> [PackageCheck]
checkLicense :: PackageDescription -> [PackageCheck]
checkLicense pkg :: PackageDescription
pkg = case PackageDescription -> Either License License
licenseRaw PackageDescription
pkg of
Right l :: License
l -> PackageDescription -> License -> [PackageCheck]
checkOldLicense PackageDescription
pkg License
l
Left l :: License
l -> PackageDescription -> License -> [PackageCheck]
checkNewLicense PackageDescription
pkg License
l
checkNewLicense :: PackageDescription -> SPDX.License -> [PackageCheck]
checkNewLicense :: PackageDescription -> License -> [PackageCheck]
checkNewLicense _pkg :: PackageDescription
_pkg lic :: License
lic = [Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes
[ Bool -> PackageCheck -> Maybe PackageCheck
check (License
lic License -> License -> Bool
forall a. Eq a => a -> a -> Bool
== License
SPDX.NONE) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable
"The 'license' field is missing or is NONE."
]
checkOldLicense :: PackageDescription -> License -> [PackageCheck]
checkOldLicense :: PackageDescription -> License -> [PackageCheck]
checkOldLicense pkg :: PackageDescription
pkg lic :: License
lic = [Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes
[ Bool -> PackageCheck -> Maybe PackageCheck
check (License
lic License -> License -> Bool
forall a. Eq a => a -> a -> Bool
== License
UnspecifiedLicense) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable
"The 'license' field is missing."
, Bool -> PackageCheck -> Maybe PackageCheck
check (License
lic License -> License -> Bool
forall a. Eq a => a -> a -> Bool
== License
AllRightsReserved) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious
"The 'license' is AllRightsReserved. Is that really what you want?"
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,4] (License
lic License -> [License] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [License]
compatLicenses) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unfortunately the license " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
quote (License -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> License
license PackageDescription
pkg))
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " messes up the parser in earlier Cabal versions so you need to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "specify 'cabal-version: >= 1.4'. Alternatively if you require "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "compatibility with earlier Cabal versions then use 'OtherLicense'."
, case License
lic of
UnknownLicense l :: String
l -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote ("license: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
l) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a recognised license. The "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "known licenses are: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((License -> String) -> [License] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map License -> String
forall a. Pretty a => a -> String
prettyShow [License]
knownLicenses)
_ -> Maybe PackageCheck
forall a. Maybe a
Nothing
, Bool -> PackageCheck -> Maybe PackageCheck
check (License
lic License -> License -> Bool
forall a. Eq a => a -> a -> Bool
== License
BSD4) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Using 'license: BSD4' is almost always a misunderstanding. 'BSD4' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "refers to the old 4-clause BSD license with the advertising "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "clause. 'BSD3' refers the new 3-clause BSD license."
, case License -> Maybe [Version]
unknownLicenseVersion (License
lic) of
Just knownVersions :: [Version]
knownVersions -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'license: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ License -> String
forall a. Pretty a => a -> String
prettyShow (License
lic) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' is not a known "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "version of that license. The known versions are "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Version -> String) -> [Version] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Version -> String
forall a. Pretty a => a -> String
prettyShow [Version]
knownVersions)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". If this is not a mistake and you think it should be a known "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "version then please file a ticket."
_ -> Maybe PackageCheck
forall a. Maybe a
Nothing
, Bool -> PackageCheck -> Maybe PackageCheck
check (License
lic License -> [License] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [ License
AllRightsReserved
, License
UnspecifiedLicense, License
PublicDomain]
Bool -> Bool -> Bool
&& [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> [String]
licenseFiles PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious "A 'license-file' is not specified."
]
where
unknownLicenseVersion :: License -> Maybe [Version]
unknownLicenseVersion (GPL (Just v :: Version
v))
| Version
v Version -> [Version] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Version]
knownVersions = [Version] -> Maybe [Version]
forall a. a -> Maybe a
Just [Version]
knownVersions
where knownVersions :: [Version]
knownVersions = [ Version
v' | GPL (Just v' :: Version
v') <- [License]
knownLicenses ]
unknownLicenseVersion (LGPL (Just v :: Version
v))
| Version
v Version -> [Version] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Version]
knownVersions = [Version] -> Maybe [Version]
forall a. a -> Maybe a
Just [Version]
knownVersions
where knownVersions :: [Version]
knownVersions = [ Version
v' | LGPL (Just v' :: Version
v') <- [License]
knownLicenses ]
unknownLicenseVersion (AGPL (Just v :: Version
v))
| Version
v Version -> [Version] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Version]
knownVersions = [Version] -> Maybe [Version]
forall a. a -> Maybe a
Just [Version]
knownVersions
where knownVersions :: [Version]
knownVersions = [ Version
v' | AGPL (Just v' :: Version
v') <- [License]
knownLicenses ]
unknownLicenseVersion (Apache (Just v :: Version
v))
| Version
v Version -> [Version] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Version]
knownVersions = [Version] -> Maybe [Version]
forall a. a -> Maybe a
Just [Version]
knownVersions
where knownVersions :: [Version]
knownVersions = [ Version
v' | Apache (Just v' :: Version
v') <- [License]
knownLicenses ]
unknownLicenseVersion _ = Maybe [Version]
forall a. Maybe a
Nothing
checkVersion :: [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion :: [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion ver :: [Int]
ver cond :: Bool
cond pc :: PackageCheck
pc
| PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [Int]
ver = Maybe PackageCheck
forall a. Maybe a
Nothing
| Bool
otherwise = Bool -> PackageCheck -> Maybe PackageCheck
check Bool
cond PackageCheck
pc
compatLicenses :: [License]
compatLicenses = [ Maybe Version -> License
GPL Maybe Version
forall a. Maybe a
Nothing, Maybe Version -> License
LGPL Maybe Version
forall a. Maybe a
Nothing, Maybe Version -> License
AGPL Maybe Version
forall a. Maybe a
Nothing, License
BSD3, License
BSD4
, License
PublicDomain, License
AllRightsReserved
, License
UnspecifiedLicense, License
OtherLicense ]
checkSourceRepos :: PackageDescription -> [PackageCheck]
checkSourceRepos :: PackageDescription -> [PackageCheck]
checkSourceRepos pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe PackageCheck] -> [PackageCheck])
-> [Maybe PackageCheck] -> [PackageCheck]
forall a b. (a -> b) -> a -> b
$ [[Maybe PackageCheck]] -> [Maybe PackageCheck]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[
case SourceRepo -> RepoKind
repoKind SourceRepo
repo of
RepoKindUnknown kind :: String
kind -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote String
kind String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a recognised kind of source-repository. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The repo kind is usually 'head' or 'this'"
_ -> Maybe PackageCheck
forall a. Maybe a
Nothing
, Bool -> PackageCheck -> Maybe PackageCheck
check (Maybe RepoType -> Bool
forall a. Maybe a -> Bool
isNothing (SourceRepo -> Maybe RepoType
repoType SourceRepo
repo)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable
"The source-repository 'type' is a required field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Maybe String -> Bool
forall a. Maybe a -> Bool
isNothing (SourceRepo -> Maybe String
repoLocation SourceRepo
repo)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable
"The source-repository 'location' is a required field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (SourceRepo -> Maybe RepoType
repoType SourceRepo
repo Maybe RepoType -> Maybe RepoType -> Bool
forall a. Eq a => a -> a -> Bool
== RepoType -> Maybe RepoType
forall a. a -> Maybe a
Just RepoType
CVS Bool -> Bool -> Bool
&& Maybe String -> Bool
forall a. Maybe a -> Bool
isNothing (SourceRepo -> Maybe String
repoModule SourceRepo
repo)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable
"For a CVS source-repository, the 'module' is a required field."
, Bool -> PackageCheck -> Maybe PackageCheck
check (SourceRepo -> RepoKind
repoKind SourceRepo
repo RepoKind -> RepoKind -> Bool
forall a. Eq a => a -> a -> Bool
== RepoKind
RepoThis Bool -> Bool -> Bool
&& Maybe String -> Bool
forall a. Maybe a -> Bool
isNothing (SourceRepo -> Maybe String
repoTag SourceRepo
repo)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"For the 'this' kind of source-repository, the 'tag' is a required "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "field. It should specify the tag corresponding to this version "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "or release of the package."
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> (String -> Bool) -> Maybe String -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False String -> Bool
isAbsoluteOnAnyPlatform (SourceRepo -> Maybe String
repoSubdir SourceRepo
repo)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable
"The 'subdir' field of a source-repository must be a relative path."
]
| SourceRepo
repo <- PackageDescription -> [SourceRepo]
sourceRepos PackageDescription
pkg ]
checkAllGhcOptions :: PackageDescription -> [PackageCheck]
checkAllGhcOptions :: PackageDescription -> [PackageCheck]
checkAllGhcOptions pkg :: PackageDescription
pkg =
String
-> (BuildInfo -> [String]) -> PackageDescription -> [PackageCheck]
checkGhcOptions "ghc-options" (CompilerFlavor -> BuildInfo -> [String]
hcOptions CompilerFlavor
GHC) PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ String
-> (BuildInfo -> [String]) -> PackageDescription -> [PackageCheck]
checkGhcOptions "ghc-prof-options" (CompilerFlavor -> BuildInfo -> [String]
hcProfOptions CompilerFlavor
GHC) PackageDescription
pkg
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ String
-> (BuildInfo -> [String]) -> PackageDescription -> [PackageCheck]
checkGhcOptions "ghc-shared-options" (CompilerFlavor -> BuildInfo -> [String]
hcSharedOptions CompilerFlavor
GHC) PackageDescription
pkg
checkGhcOptions :: String -> (BuildInfo -> [String]) -> PackageDescription -> [PackageCheck]
checkGhcOptions :: String
-> (BuildInfo -> [String]) -> PackageDescription -> [PackageCheck]
checkGhcOptions fieldName :: String
fieldName getOptions :: BuildInfo -> [String]
getOptions pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
[String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-fasm"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -fasm' is unnecessary and will not work on CPU "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "architectures other than x86, x86-64, ppc or sparc."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-fvia-C"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++": -fvia-C' is usually unnecessary. If your package "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "needs -via-C for correctness rather than performance then it "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is using the FFI incorrectly and will probably not work with GHC "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "6.10 or later."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-fhpc"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -fhpc' is not not necessary. Use the configure flag "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " --enable-coverage instead."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-prof"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -prof' is not necessary and will lead to problems "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "when used on a library. Use the configure flag "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "--enable-library-profiling and/or --enable-profiling."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-o"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -o' is not needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The output files are named automatically."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-hide-package"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -hide-package' is never needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Cabal hides all packages."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["--make"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": --make' is never needed. Cabal uses this automatically."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-main-is"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -main-is' is not portable."
, [String] -> PackageCheck -> Maybe PackageCheck
checkNonTestAndBenchmarkFlags ["-O0", "-Onot"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -O0' is not needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Use the --disable-optimization configure flag."
, [String] -> PackageCheck -> Maybe PackageCheck
checkTestAndBenchmarkFlags ["-O0", "-Onot"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -O0' is not needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Use the --disable-optimization configure flag."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags [ "-O", "-O1"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -O' is not needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Cabal automatically adds the '-O' flag. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Setting it yourself interferes with the --disable-optimization flag."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-O2"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -O2' is rarely needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Check that it is giving a real benefit "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "and not just imposing longer compile times on your users."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-split-sections"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -split-sections' is not needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Use the --enable-split-sections configure flag."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-split-objs"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -split-objs' is not needed. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Use the --enable-split-objs configure flag."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-optl-Wl,-s", "-optl-s"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -optl-Wl,-s' is not needed and is not portable to all"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " operating systems. Cabal 1.4 and later automatically strip"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " executables. Cabal also has a flag --disable-executable-stripping"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " which is necessary when building packages for some Linux"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " distributions and using '-optl-Wl,-s' prevents that from working."
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-fglasgow-exts"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Instead of '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -fglasgow-exts' it is preferable to use "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "the 'extensions' field."
, Bool -> PackageCheck -> Maybe PackageCheck
check ("-threaded" String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
lib_ghc_options) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -threaded' has no effect for libraries. It should "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "only be used for executables."
, Bool -> PackageCheck -> Maybe PackageCheck
check ("-rtsopts" String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
lib_ghc_options) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -rtsopts' has no effect for libraries. It should "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "only be used for executables."
, Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\opt :: String
opt -> "-with-rtsopts" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
opt) [String]
lib_ghc_options) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -with-rtsopts' has no effect for libraries. It "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "should only be used for executables."
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "extensions"
[ (String
flag, Extension -> String
forall a. Pretty a => a -> String
prettyShow Extension
extension) | String
flag <- [String]
all_ghc_options
, Just extension :: Extension
extension <- [String -> Maybe Extension
ghcExtension String
flag] ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "extensions"
[ (String
flag, String
extension) | flag :: String
flag@('-':'X':extension :: String
extension) <- [String]
all_ghc_options ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "cpp-options" ([(String, String)] -> Maybe PackageCheck)
-> [(String, String)] -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
[ (String
flag, String
flag) | flag :: String
flag@('-':'D':_) <- [String]
all_ghc_options ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
flag, String
flag) | flag :: String
flag@('-':'U':_) <- [String]
all_ghc_options ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "include-dirs"
[ (String
flag, String
dir) | flag :: String
flag@('-':'I':dir :: String
dir) <- [String]
all_ghc_options ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "extra-libraries"
[ (String
flag, String
lib) | flag :: String
flag@('-':'l':lib :: String
lib) <- [String]
all_ghc_options ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "extra-lib-dirs"
[ (String
flag, String
dir) | flag :: String
flag@('-':'L':dir :: String
dir) <- [String]
all_ghc_options ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "frameworks"
[ (String
flag, String
fmwk) | (flag :: String
flag@String
"-framework", fmwk :: String
fmwk) <-
[String] -> [String] -> [(String, String)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
all_ghc_options ([String] -> [String]
forall a. [a] -> [a]
safeTail [String]
all_ghc_options) ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
fieldName "extra-framework-dirs"
[ (String
flag, String
dir) | (flag :: String
flag@String
"-framework-path", dir :: String
dir) <-
[String] -> [String] -> [(String, String)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
all_ghc_options ([String] -> [String]
forall a. [a] -> [a]
safeTail [String]
all_ghc_options) ]
]
where
all_ghc_options :: [String]
all_ghc_options = (BuildInfo -> [String]) -> [BuildInfo] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap BuildInfo -> [String]
getOptions (PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg)
lib_ghc_options :: [String]
lib_ghc_options = (Library -> [String]) -> [Library] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (BuildInfo -> [String]
getOptions (BuildInfo -> [String])
-> (Library -> BuildInfo) -> Library -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Library -> BuildInfo
libBuildInfo)
(PackageDescription -> [Library]
allLibraries PackageDescription
pkg)
test_ghc_options :: [String]
test_ghc_options = (TestSuite -> [String]) -> [TestSuite] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (BuildInfo -> [String]
getOptions (BuildInfo -> [String])
-> (TestSuite -> BuildInfo) -> TestSuite -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TestSuite -> BuildInfo
testBuildInfo)
(PackageDescription -> [TestSuite]
testSuites PackageDescription
pkg)
benchmark_ghc_options :: [String]
benchmark_ghc_options = (Benchmark -> [String]) -> [Benchmark] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (BuildInfo -> [String]
getOptions (BuildInfo -> [String])
-> (Benchmark -> BuildInfo) -> Benchmark -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Benchmark -> BuildInfo
benchmarkBuildInfo)
(PackageDescription -> [Benchmark]
benchmarks PackageDescription
pkg)
test_and_benchmark_ghc_options :: [String]
test_and_benchmark_ghc_options = [String]
test_ghc_options [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String]
benchmark_ghc_options
non_test_and_benchmark_ghc_options :: [String]
non_test_and_benchmark_ghc_options = (BuildInfo -> [String]) -> [BuildInfo] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap BuildInfo -> [String]
getOptions
(PackageDescription -> [BuildInfo]
allBuildInfo (PackageDescription
pkg { testSuites :: [TestSuite]
testSuites = []
, benchmarks :: [Benchmark]
benchmarks = []
}))
checkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkFlags flags :: [String]
flags = Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
flags) [String]
all_ghc_options)
checkTestAndBenchmarkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkTestAndBenchmarkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkTestAndBenchmarkFlags flags :: [String]
flags = Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
flags) [String]
test_and_benchmark_ghc_options)
checkNonTestAndBenchmarkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkNonTestAndBenchmarkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkNonTestAndBenchmarkFlags flags :: [String]
flags = Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
flags) [String]
non_test_and_benchmark_ghc_options)
ghcExtension :: String -> Maybe Extension
ghcExtension ('-':'f':name :: String
name) = case String
name of
"allow-overlapping-instances" -> KnownExtension -> Maybe Extension
enable KnownExtension
OverlappingInstances
"no-allow-overlapping-instances" -> KnownExtension -> Maybe Extension
disable KnownExtension
OverlappingInstances
"th" -> KnownExtension -> Maybe Extension
enable KnownExtension
TemplateHaskell
"no-th" -> KnownExtension -> Maybe Extension
disable KnownExtension
TemplateHaskell
"ffi" -> KnownExtension -> Maybe Extension
enable KnownExtension
ForeignFunctionInterface
"no-ffi" -> KnownExtension -> Maybe Extension
disable KnownExtension
ForeignFunctionInterface
"fi" -> KnownExtension -> Maybe Extension
enable KnownExtension
ForeignFunctionInterface
"no-fi" -> KnownExtension -> Maybe Extension
disable KnownExtension
ForeignFunctionInterface
"monomorphism-restriction" -> KnownExtension -> Maybe Extension
enable KnownExtension
MonomorphismRestriction
"no-monomorphism-restriction" -> KnownExtension -> Maybe Extension
disable KnownExtension
MonomorphismRestriction
"mono-pat-binds" -> KnownExtension -> Maybe Extension
enable KnownExtension
MonoPatBinds
"no-mono-pat-binds" -> KnownExtension -> Maybe Extension
disable KnownExtension
MonoPatBinds
"allow-undecidable-instances" -> KnownExtension -> Maybe Extension
enable KnownExtension
UndecidableInstances
"no-allow-undecidable-instances" -> KnownExtension -> Maybe Extension
disable KnownExtension
UndecidableInstances
"allow-incoherent-instances" -> KnownExtension -> Maybe Extension
enable KnownExtension
IncoherentInstances
"no-allow-incoherent-instances" -> KnownExtension -> Maybe Extension
disable KnownExtension
IncoherentInstances
"arrows" -> KnownExtension -> Maybe Extension
enable KnownExtension
Arrows
"no-arrows" -> KnownExtension -> Maybe Extension
disable KnownExtension
Arrows
"generics" -> KnownExtension -> Maybe Extension
enable KnownExtension
Generics
"no-generics" -> KnownExtension -> Maybe Extension
disable KnownExtension
Generics
"implicit-prelude" -> KnownExtension -> Maybe Extension
enable KnownExtension
ImplicitPrelude
"no-implicit-prelude" -> KnownExtension -> Maybe Extension
disable KnownExtension
ImplicitPrelude
"implicit-params" -> KnownExtension -> Maybe Extension
enable KnownExtension
ImplicitParams
"no-implicit-params" -> KnownExtension -> Maybe Extension
disable KnownExtension
ImplicitParams
"bang-patterns" -> KnownExtension -> Maybe Extension
enable KnownExtension
BangPatterns
"no-bang-patterns" -> KnownExtension -> Maybe Extension
disable KnownExtension
BangPatterns
"scoped-type-variables" -> KnownExtension -> Maybe Extension
enable KnownExtension
ScopedTypeVariables
"no-scoped-type-variables" -> KnownExtension -> Maybe Extension
disable KnownExtension
ScopedTypeVariables
"extended-default-rules" -> KnownExtension -> Maybe Extension
enable KnownExtension
ExtendedDefaultRules
"no-extended-default-rules" -> KnownExtension -> Maybe Extension
disable KnownExtension
ExtendedDefaultRules
_ -> Maybe Extension
forall a. Maybe a
Nothing
ghcExtension "-cpp" = KnownExtension -> Maybe Extension
enable KnownExtension
CPP
ghcExtension _ = Maybe Extension
forall a. Maybe a
Nothing
enable :: KnownExtension -> Maybe Extension
enable e :: KnownExtension
e = Extension -> Maybe Extension
forall a. a -> Maybe a
Just (KnownExtension -> Extension
EnableExtension KnownExtension
e)
disable :: KnownExtension -> Maybe Extension
disable e :: KnownExtension
e = Extension -> Maybe Extension
forall a. a -> Maybe a
Just (KnownExtension -> Extension
DisableExtension KnownExtension
e)
checkCCOptions :: PackageDescription -> [PackageCheck]
checkCCOptions :: PackageDescription -> [PackageCheck]
checkCCOptions = String
-> String
-> (BuildInfo -> [String])
-> PackageDescription
-> [PackageCheck]
checkCLikeOptions "C" "cc-options" BuildInfo -> [String]
ccOptions
checkCxxOptions :: PackageDescription -> [PackageCheck]
checkCxxOptions :: PackageDescription -> [PackageCheck]
checkCxxOptions = String
-> String
-> (BuildInfo -> [String])
-> PackageDescription
-> [PackageCheck]
checkCLikeOptions "C++" "cxx-options" BuildInfo -> [String]
cxxOptions
checkCLikeOptions :: String -> String -> (BuildInfo -> [String]) -> PackageDescription -> [PackageCheck]
checkCLikeOptions :: String
-> String
-> (BuildInfo -> [String])
-> PackageDescription
-> [PackageCheck]
checkCLikeOptions label :: String
label prefix :: String
prefix accessor :: BuildInfo -> [String]
accessor pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
prefix "include-dirs"
[ (String
flag, String
dir) | flag :: String
flag@('-':'I':dir :: String
dir) <- [String]
all_cLikeOptions ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
prefix "extra-libraries"
[ (String
flag, String
lib) | flag :: String
flag@('-':'l':lib :: String
lib) <- [String]
all_cLikeOptions ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives String
prefix "extra-lib-dirs"
[ (String
flag, String
dir) | flag :: String
flag@('-':'L':dir :: String
dir) <- [String]
all_cLikeOptions ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives "ld-options" "extra-libraries"
[ (String
flag, String
lib) | flag :: String
flag@('-':'l':lib :: String
lib) <- [String]
all_ldOptions ]
, String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives "ld-options" "extra-lib-dirs"
[ (String
flag, String
dir) | flag :: String
flag@('-':'L':dir :: String
dir) <- [String]
all_ldOptions ]
, [String] -> PackageCheck -> Maybe PackageCheck
checkCCFlags [ "-O", "-Os", "-O0", "-O1", "-O2", "-O3" ] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
prefixString -> ShowS
forall a. [a] -> [a] -> [a]
++": -O[n]' is generally not needed. When building with "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " optimisations Cabal automatically adds '-O2' for "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
labelString -> ShowS
forall a. [a] -> [a] -> [a]
++" code. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Setting it yourself interferes with the --disable-optimization flag."
]
where all_cLikeOptions :: [String]
all_cLikeOptions = [ String
opts | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, String
opts <- BuildInfo -> [String]
accessor BuildInfo
bi ]
all_ldOptions :: [String]
all_ldOptions = [ String
opts | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, String
opts <- BuildInfo -> [String]
ldOptions BuildInfo
bi ]
checkCCFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkCCFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkCCFlags flags :: [String]
flags = Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
flags) [String]
all_cLikeOptions)
checkCPPOptions :: PackageDescription -> [PackageCheck]
checkCPPOptions :: PackageDescription -> [PackageCheck]
checkCPPOptions pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives "cpp-options" "include-dirs"
[ (String
flag, String
dir) | flag :: String
flag@('-':'I':dir :: String
dir) <- [String]
all_cppOptions]
]
where all_cppOptions :: [String]
all_cppOptions = [ String
opts | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, String
opts <- BuildInfo -> [String]
cppOptions BuildInfo
bi ]
checkAlternatives :: String -> String -> [(String, String)]
-> Maybe PackageCheck
checkAlternatives :: String -> String -> [(String, String)] -> Maybe PackageCheck
checkAlternatives badField :: String
badField goodField :: String
goodField flags :: [(String, String)]
flags =
Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not ([String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
badFlags)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Instead of " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
quote (String
badField String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords [String]
badFlags)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " use " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
quote (String
goodField String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords [String]
goodFlags)
where (badFlags :: [String]
badFlags, goodFlags :: [String]
goodFlags) = [(String, String)] -> ([String], [String])
forall a b. [(a, b)] -> ([a], [b])
unzip [(String, String)]
flags
checkPaths :: PackageDescription -> [PackageCheck]
checkPaths :: PackageDescription -> [PackageCheck]
checkPaths pkg :: PackageDescription
pkg =
[ String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (String
kind String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is a relative path outside of the source tree. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "This will not work when generating a tarball with 'sdist'."
| (path :: String
path, kind :: String
kind) <- [(String, String)]
relPaths [(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [(String, String)]
absPaths
, String -> Bool
isOutsideTree String
path ]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++
[ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (String
kind String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is an absolute path."
| (path :: String
path, kind :: String
kind) <- [(String, String)]
relPaths
, String -> Bool
isAbsoluteOnAnyPlatform String
path ]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++
[ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
ShowS
quote (String
kind String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path) String -> ShowS
forall a. [a] -> [a] -> [a]
++ " points inside the 'dist' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "directory. This is not reliable because the location of this "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "directory is configurable by the user (or package manager). In "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "addition the layout of the 'dist' directory is subject to change "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "in future versions of Cabal."
| (path :: String
path, kind :: String
kind) <- [(String, String)]
relPaths [(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [(String, String)]
absPaths
, String -> Bool
isInsideDist String
path ]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++
[ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'ghc-options' contains the path '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' which points "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "inside the 'dist' directory. This is not reliable because the "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "location of this directory is configurable by the user (or package "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "manager). In addition the layout of the 'dist' directory is subject "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "to change in future versions of Cabal."
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, (GHC, flags :: [String]
flags) <- PerCompilerFlavor [String] -> [(CompilerFlavor, [String])]
forall v. PerCompilerFlavor v -> [(CompilerFlavor, v)]
perCompilerFlavorToList (PerCompilerFlavor [String] -> [(CompilerFlavor, [String])])
-> PerCompilerFlavor [String] -> [(CompilerFlavor, [String])]
forall a b. (a -> b) -> a -> b
$ BuildInfo -> PerCompilerFlavor [String]
options BuildInfo
bi
, String
path <- [String]
flags
, String -> Bool
isInsideDist String
path ]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++
[ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"In the 'data-files' field: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> GlobSyntaxError -> String
explainGlobSyntaxError String
pat GlobSyntaxError
err
| String
pat <- PackageDescription -> [String]
dataFiles PackageDescription
pkg
, Left err :: GlobSyntaxError
err <- [Version -> String -> Either GlobSyntaxError Glob
parseFileGlob (PackageDescription -> Version
specVersion PackageDescription
pkg) String
pat]
]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++
[ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"In the 'extra-source-files' field: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> GlobSyntaxError -> String
explainGlobSyntaxError String
pat GlobSyntaxError
err
| String
pat <- PackageDescription -> [String]
extraSrcFiles PackageDescription
pkg
, Left err :: GlobSyntaxError
err <- [Version -> String -> Either GlobSyntaxError Glob
parseFileGlob (PackageDescription -> Version
specVersion PackageDescription
pkg) String
pat]
]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++
[ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"In the 'extra-doc-files' field: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> GlobSyntaxError -> String
explainGlobSyntaxError String
pat GlobSyntaxError
err
| String
pat <- PackageDescription -> [String]
extraDocFiles PackageDescription
pkg
, Left err :: GlobSyntaxError
err <- [Version -> String -> Either GlobSyntaxError Glob
parseFileGlob (PackageDescription -> Version
specVersion PackageDescription
pkg) String
pat]
]
where
isOutsideTree :: String -> Bool
isOutsideTree path :: String
path = case String -> [String]
splitDirectories String
path of
"..":_ -> Bool
True
".":"..":_ -> Bool
True
_ -> Bool
False
isInsideDist :: String -> Bool
isInsideDist path :: String
path = case ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ShowS
lowercase (String -> [String]
splitDirectories String
path) of
"dist" :_ -> Bool
True
".":"dist":_ -> Bool
True
_ -> Bool
False
relPaths :: [(String, String)]
relPaths =
[ (String
path, "extra-source-files") | String
path <- PackageDescription -> [String]
extraSrcFiles PackageDescription
pkg ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "extra-tmp-files") | String
path <- PackageDescription -> [String]
extraTmpFiles PackageDescription
pkg ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "extra-doc-files") | String
path <- PackageDescription -> [String]
extraDocFiles PackageDescription
pkg ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "data-files") | String
path <- PackageDescription -> [String]
dataFiles PackageDescription
pkg ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "data-dir") | String
path <- [PackageDescription -> String
dataDir PackageDescription
pkg]]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "license-file") | String
path <- PackageDescription -> [String]
licenseFiles PackageDescription
pkg ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [[(String, String)]] -> [(String, String)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [ (String
path, "asm-sources") | String
path <- BuildInfo -> [String]
asmSources BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "cmm-sources") | String
path <- BuildInfo -> [String]
cmmSources BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "c-sources") | String
path <- BuildInfo -> [String]
cSources BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "cxx-sources") | String
path <- BuildInfo -> [String]
cxxSources BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "js-sources") | String
path <- BuildInfo -> [String]
jsSources BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "install-includes") | String
path <- BuildInfo -> [String]
installIncludes BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "hs-source-dirs") | String
path <- BuildInfo -> [String]
hsSourceDirs BuildInfo
bi ]
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg ]
absPaths :: [(String, String)]
absPaths = [[(String, String)]] -> [(String, String)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [ (String
path, "includes") | String
path <- BuildInfo -> [String]
includes BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "include-dirs") | String
path <- BuildInfo -> [String]
includeDirs BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
path, "extra-lib-dirs") | String
path <- BuildInfo -> [String]
extraLibDirs BuildInfo
bi ]
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg ]
checkCabalVersion :: PackageDescription -> [PackageCheck]
checkCabalVersion :: PackageDescription -> [PackageCheck]
checkCabalVersion pkg :: PackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [1,10]
Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
simpleSpecVersionRangeSyntax) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Packages relying on Cabal 1.10 or later must only specify a "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "version range of the form 'cabal-version: >= x.y'. Use "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> Version
specVersion PackageDescription
pkg) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
< [Int] -> Version
mkVersion [1,9]
Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
simpleSpecVersionRangeSyntax) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"It is recommended that the 'cabal-version' field only specify a "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "version range of the form '>= x.y'. Use "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> Version
specVersion PackageDescription
pkg) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Tools based on Cabal 1.10 and later will ignore upper bounds."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,12] Bool
simpleSpecVersionSyntax (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"With Cabal 1.10 or earlier, the 'cabal-version' field must use "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "range syntax rather than a simple version number. Use "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> Version
specVersion PackageDescription
pkg) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [1,12]
Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
simpleSpecVersionSyntax) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
(if PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [2,0] then String -> PackageCheck
PackageDistSuspicious else String -> PackageCheck
PackageDistSuspiciousWarn) (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Packages relying on Cabal 1.12 or later should specify a "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "specific version of the Cabal spec of the form "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: x.y'. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Use 'cabal-version: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow (PackageDescription -> Version
specVersion PackageDescription
pkg) String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,8] (Bool -> Bool
not ([TestSuite] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([TestSuite] -> Bool) -> [TestSuite] -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [TestSuite]
testSuites PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'test-suite' section is new in Cabal 1.10. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Unfortunately it messes up the parser in older Cabal versions "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "so you must specify at least 'cabal-version: >= 1.8', but note "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "that only Cabal 1.10 and later can actually run such test suites."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,10] ((Maybe Language -> Bool) -> [Maybe Language] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Maybe Language -> Bool
forall a. Maybe a -> Bool
isJust ((BuildInfo -> Maybe Language) -> [Maybe Language]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> Maybe Language
defaultLanguage)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'default-language' field the package needs to specify "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "at least 'cabal-version: >= 1.10'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [1,10]
Bool -> Bool -> Bool
&& ((Maybe Language -> Bool) -> [Maybe Language] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Maybe Language -> Bool
forall a. Maybe a -> Bool
isNothing ((BuildInfo -> Maybe Language) -> [Maybe Language]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> Maybe Language
defaultLanguage))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Packages using 'cabal-version: >= 1.10' must specify the "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'default-language' field for each component (e.g. Haskell98 or "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Haskell2010). If a component uses different languages in "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "different modules then list the other ones in the "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'other-languages' field."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,18]
(Bool -> Bool
not (Bool -> Bool) -> ([String] -> Bool) -> [String] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([String] -> Bool) -> [String] -> Bool
forall a b. (a -> b) -> a -> b
$ PackageDescription -> [String]
extraDocFiles PackageDescription
pkg) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'extra-doc-files' field the package needs to specify "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "at least 'cabal-version: >= 1.18'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [2,0]
(Bool -> Bool
not ([Library] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> [Library]
subLibraries PackageDescription
pkg))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use multiple 'library' sections or a named library section "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "the package needs to specify at least 'cabal-version: 2.0'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,21]
((Library -> Bool) -> [Library] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not(Bool -> Bool) -> (Library -> Bool) -> Library -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[ModuleReexport] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null([ModuleReexport] -> Bool)
-> (Library -> [ModuleReexport]) -> Library -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Library -> [ModuleReexport]
reexportedModules) (PackageDescription -> [Library]
allLibraries PackageDescription
pkg)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'reexported-module' field the package needs to specify "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "at least 'cabal-version: >= 1.22'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,25] Bool
usesBackpackIncludes (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'mixins' field the package needs to specify "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "at least 'cabal-version: 2.0'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,23] (([String] -> Bool) -> [[String]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> ([String] -> Bool) -> [String] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ((BuildInfo -> [String]) -> [[String]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> [String]
extraFrameworkDirs)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'extra-framework-dirs' field the package needs to specify"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " at least 'cabal-version: >= 1.24'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,10] (([Extension] -> Bool) -> [[Extension]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> ([Extension] -> Bool) -> [Extension] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Extension] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ((BuildInfo -> [Extension]) -> [[Extension]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> [Extension]
defaultExtensions)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"To use the 'default-extensions' field the package needs to specify "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "at least 'cabal-version: >= 1.10'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [1,10]
Bool -> Bool -> Bool
&& (([Extension] -> Bool) -> [[Extension]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> ([Extension] -> Bool) -> [Extension] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Extension] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ((BuildInfo -> [Extension]) -> [[Extension]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> [Extension]
oldExtensions))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"For packages using 'cabal-version: >= 1.10' the 'extensions' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "field is deprecated. The new 'default-extensions' field lists "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "extensions that are used in all modules in the component, while "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "the 'other-extensions' field lists extensions that are used in "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "some modules, e.g. via the {-# LANGUAGE #-} pragma."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,8] (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
versionRangeExpressions)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses full version-range expressions "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "in a 'build-depends' field: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
displayRawDependency [Dependency]
versionRangeExpressions)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". To use this new syntax the package needs to specify at least "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= 1.8'. Alternatively, if broader compatibility "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is important, then convert to conjunctive normal form, and use "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "multiple 'build-depends:' lines, one conjunct per line."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,6] (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
depsUsingWildcardSyntax)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses wildcard syntax in the 'build-depends' field: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
forall a. Pretty a => a -> String
prettyShow [Dependency]
depsUsingWildcardSyntax)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". To use this new syntax the package need to specify at least "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= 1.6'. Alternatively, if broader compatibility "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is important then use: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep
[ Dependency -> String
forall a. Pretty a => a -> String
prettyShow (PackageName -> VersionRange -> Set LibraryName -> Dependency
Dependency PackageName
name (VersionRange -> VersionRange
eliminateWildcardSyntax VersionRange
versionRange) Set LibraryName
forall a. Set a
Set.empty)
| Dependency name :: PackageName
name versionRange :: VersionRange
versionRange _ <- [Dependency]
depsUsingWildcardSyntax ]
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [2,0] (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
depsUsingMajorBoundSyntax)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses major bounded version syntax in the "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'build-depends' field: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
forall a. Pretty a => a -> String
prettyShow [Dependency]
depsUsingMajorBoundSyntax)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". To use this new syntax the package need to specify at least "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: 2.0'. Alternatively, if broader compatibility "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is important then use: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep
[ Dependency -> String
forall a. Pretty a => a -> String
prettyShow (PackageName -> VersionRange -> Set LibraryName -> Dependency
Dependency PackageName
name (VersionRange -> VersionRange
eliminateMajorBoundSyntax VersionRange
versionRange) Set LibraryName
forall a. Set a
Set.empty)
| Dependency name :: PackageName
name versionRange :: VersionRange
versionRange _ <- [Dependency]
depsUsingMajorBoundSyntax ]
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [3,0] (([String] -> Bool) -> [[String]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> ([String] -> Bool) -> [String] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)
(((BuildInfo -> [String]) -> [[String]])
-> [BuildInfo -> [String]] -> [[String]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (BuildInfo -> [String]) -> [[String]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField
[ BuildInfo -> [String]
asmSources
, BuildInfo -> [String]
cmmSources
, BuildInfo -> [String]
extraBundledLibs
, BuildInfo -> [String]
extraLibFlavours ])) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The use of 'asm-sources', 'cmm-sources', 'extra-bundled-libraries' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " and 'extra-library-flavours' requires the package "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " to specify at least 'cabal-version: 3.0'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [2,5] (([String] -> Bool) -> [[String]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> ([String] -> Bool) -> [String] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([[String]] -> Bool) -> [[String]] -> Bool
forall a b. (a -> b) -> a -> b
$ (BuildInfo -> [String]) -> [[String]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> [String]
extraDynLibFlavours) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The use of 'extra-dynamic-library-flavours' requires the package "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " to specify at least 'cabal-version: >= 2.5'. The flavours are: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep [ String
flav
| [String]
flavs <- (BuildInfo -> [String]) -> [[String]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> [String]
extraDynLibFlavours
, String
flav <- [String]
flavs ]
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [2,1] (([ModuleName] -> Bool) -> [[ModuleName]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> ([ModuleName] -> Bool) -> [ModuleName] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)
((BuildInfo -> [ModuleName]) -> [[ModuleName]]
forall b. (BuildInfo -> b) -> [b]
buildInfoField BuildInfo -> [ModuleName]
virtualModules)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The use of 'virtual-modules' requires the package "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " to specify at least 'cabal-version: >= 2.1'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,8] (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
testedWithVersionRangeExpressions)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses full version-range expressions "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "in a 'tested-with' field: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
displayRawDependency [Dependency]
testedWithVersionRangeExpressions)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". To use this new syntax the package needs to specify at least "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= 1.8'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,6] (Bool -> Bool
not ([Dependency] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Dependency]
testedWithUsingWildcardSyntax)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package uses wildcard syntax in the 'tested-with' field: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Dependency -> String) -> [Dependency] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Dependency -> String
forall a. Pretty a => a -> String
prettyShow [Dependency]
testedWithUsingWildcardSyntax)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". To use this new syntax the package need to specify at least "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'cabal-version: >= 1.6'. Alternatively, if broader compatibility "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is important then use: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep
[ Dependency -> String
forall a. Pretty a => a -> String
prettyShow (PackageName -> VersionRange -> Set LibraryName -> Dependency
Dependency PackageName
name (VersionRange -> VersionRange
eliminateWildcardSyntax VersionRange
versionRange) Set LibraryName
forall a. Set a
Set.empty)
| Dependency name :: PackageName
name versionRange :: VersionRange
versionRange _ <- [Dependency]
testedWithUsingWildcardSyntax ]
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,6] (Bool -> Bool
not ([SourceRepo] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> [SourceRepo]
sourceRepos PackageDescription
pkg))) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'source-repository' section is new in Cabal 1.6. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Unfortunately it messes up the parser in earlier Cabal versions "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "so you need to specify 'cabal-version: >= 1.6'."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,2,3] (Bool -> Bool
not ([Extension] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Extension]
mentionedExtensionsThatNeedCabal12)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unfortunately the language extensions "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Extension -> String) -> [Extension] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ShowS
quote ShowS -> (Extension -> String) -> Extension -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Extension -> String
forall a. Pretty a => a -> String
prettyShow) [Extension]
mentionedExtensionsThatNeedCabal12)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " break the parser in earlier Cabal versions so you need to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "specify 'cabal-version: >= 1.2.3'. Alternatively if you require "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "compatibility with earlier Cabal versions then you may be able to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "use an equivalent compiler-specific flag."
, [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion [1,4] (Bool -> Bool
not ([Extension] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Extension]
mentionedExtensionsThatNeedCabal14)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unfortunately the language extensions "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep ((Extension -> String) -> [Extension] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ShowS
quote ShowS -> (Extension -> String) -> Extension -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Extension -> String
forall a. Pretty a => a -> String
prettyShow) [Extension]
mentionedExtensionsThatNeedCabal14)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " break the parser in earlier Cabal versions so you need to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "specify 'cabal-version: >= 1.4'. Alternatively if you require "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "compatibility with earlier Cabal versions then you may be able to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "use an equivalent compiler-specific flag."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [1,23]
Bool -> Bool -> Bool
&& Maybe SetupBuildInfo -> Bool
forall a. Maybe a -> Bool
isNothing (PackageDescription -> Maybe SetupBuildInfo
setupBuildInfo PackageDescription
pkg)
Bool -> Bool -> Bool
&& PackageDescription -> BuildType
buildType PackageDescription
pkg BuildType -> BuildType -> Bool
forall a. Eq a => a -> a -> Bool
== BuildType
Custom) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Packages using 'cabal-version: >= 1.24' with 'build-type: Custom' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "must use a 'custom-setup' section with a 'setup-depends' field "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "that specifies the dependencies of the Setup.hs script itself. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The 'setup-depends' field uses the same syntax as 'build-depends', "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "so a simple example would be 'setup-depends: base, Cabal'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
< [Int] -> Version
mkVersion [1,23]
Bool -> Bool -> Bool
&& Maybe SetupBuildInfo -> Bool
forall a. Maybe a -> Bool
isNothing (PackageDescription -> Maybe SetupBuildInfo
setupBuildInfo PackageDescription
pkg)
Bool -> Bool -> Bool
&& PackageDescription -> BuildType
buildType PackageDescription
pkg BuildType -> BuildType -> Bool
forall a. Eq a => a -> a -> Bool
== BuildType
Custom) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"From version 1.24 cabal supports specifying explicit dependencies "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "for Custom setup scripts. Consider using cabal-version >= 1.24 and "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "adding a 'custom-setup' section with a 'setup-depends' field "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "that specifies the dependencies of the Setup.hs script itself. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The 'setup-depends' field uses the same syntax as 'build-depends', "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "so a simple example would be 'setup-depends: base, Cabal'."
, Bool -> PackageCheck -> Maybe PackageCheck
check (PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [1,25]
Bool -> Bool -> Bool
&& ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (PackageDescription -> ModuleName
autogenPathsModuleName PackageDescription
pkg) [ModuleName]
allModuleNames
Bool -> Bool -> Bool
&& Bool -> Bool
not (ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (PackageDescription -> ModuleName
autogenPathsModuleName PackageDescription
pkg) [ModuleName]
allModuleNamesAutogen) ) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Packages using 'cabal-version: 2.0' and the autogenerated "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "module Paths_* must include it also on the 'autogen-modules' field "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "besides 'exposed-modules' and 'other-modules'. This specifies that "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "the module does not come with the package and is generated on "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "setup. Modules built with a custom Setup.hs script also go here "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "to ensure that commands like sdist don't fail."
]
where
checkVersion :: [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion :: [Int] -> Bool -> PackageCheck -> Maybe PackageCheck
checkVersion ver :: [Int]
ver cond :: Bool
cond pc :: PackageCheck
pc
| PackageDescription -> Version
specVersion PackageDescription
pkg Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [Int]
ver = Maybe PackageCheck
forall a. Maybe a
Nothing
| Bool
otherwise = Bool -> PackageCheck -> Maybe PackageCheck
check Bool
cond PackageCheck
pc
buildInfoField :: (BuildInfo -> b) -> [b]
buildInfoField field :: BuildInfo -> b
field = (BuildInfo -> b) -> [BuildInfo] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map BuildInfo -> b
field (PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg)
versionRangeExpressions :: [Dependency]
versionRangeExpressions =
[ Dependency
dep | dep :: Dependency
dep@(Dependency _ vr :: VersionRange
vr _) <- PackageDescription -> [Dependency]
allBuildDepends PackageDescription
pkg
, VersionRange -> Bool
usesNewVersionRangeSyntax VersionRange
vr ]
testedWithVersionRangeExpressions :: [Dependency]
testedWithVersionRangeExpressions =
[ PackageName -> VersionRange -> Set LibraryName -> Dependency
Dependency (String -> PackageName
mkPackageName (CompilerFlavor -> String
forall a. Pretty a => a -> String
prettyShow CompilerFlavor
compiler)) VersionRange
vr Set LibraryName
forall a. Set a
Set.empty
| (compiler :: CompilerFlavor
compiler, vr :: VersionRange
vr) <- PackageDescription -> [(CompilerFlavor, VersionRange)]
testedWith PackageDescription
pkg
, VersionRange -> Bool
usesNewVersionRangeSyntax VersionRange
vr ]
simpleSpecVersionRangeSyntax :: Bool
simpleSpecVersionRangeSyntax =
(Version -> Bool)
-> (VersionRange -> Bool) -> Either Version VersionRange -> Bool
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
True) ((VersionRangeF Bool -> Bool) -> VersionRange -> Bool
forall a. (VersionRangeF a -> a) -> VersionRange -> a
cataVersionRange VersionRangeF Bool -> Bool
forall a. VersionRangeF a -> Bool
alg) (PackageDescription -> Either Version VersionRange
specVersionRaw PackageDescription
pkg)
where
alg :: VersionRangeF a -> Bool
alg (OrLaterVersionF _) = Bool
True
alg _ = Bool
False
simpleSpecVersionSyntax :: Bool
simpleSpecVersionSyntax =
(Version -> Bool)
-> (VersionRange -> Bool) -> Either Version VersionRange -> Bool
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
True) (Bool -> VersionRange -> Bool
forall a b. a -> b -> a
const Bool
False) (PackageDescription -> Either Version VersionRange
specVersionRaw PackageDescription
pkg)
usesNewVersionRangeSyntax :: VersionRange -> Bool
usesNewVersionRangeSyntax :: VersionRange -> Bool
usesNewVersionRangeSyntax
= (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 2)
(Int -> Bool) -> (VersionRange -> Int) -> VersionRange -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VersionRangeF Int -> Int) -> VersionRange -> Int
forall a. (VersionRangeF a -> a) -> VersionRange -> a
cataVersionRange VersionRangeF Int -> Int
alg
where
alg :: VersionRangeF Int -> Int
alg (UnionVersionRangesF a :: Int
a b :: Int
b) = Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
b
alg (IntersectVersionRangesF a :: Int
a b :: Int
b) = Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
b
alg (VersionRangeParensF _) = 3
alg _ = 1 :: Int
depsUsingWildcardSyntax :: [Dependency]
depsUsingWildcardSyntax = [ Dependency
dep | dep :: Dependency
dep@(Dependency _ vr :: VersionRange
vr _) <- PackageDescription -> [Dependency]
allBuildDepends PackageDescription
pkg
, VersionRange -> Bool
usesWildcardSyntax VersionRange
vr ]
depsUsingMajorBoundSyntax :: [Dependency]
depsUsingMajorBoundSyntax = [ Dependency
dep | dep :: Dependency
dep@(Dependency _ vr :: VersionRange
vr _) <- PackageDescription -> [Dependency]
allBuildDepends PackageDescription
pkg
, VersionRange -> Bool
usesMajorBoundSyntax VersionRange
vr ]
usesBackpackIncludes :: Bool
usesBackpackIncludes = (BuildInfo -> Bool) -> [BuildInfo] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> (BuildInfo -> Bool) -> BuildInfo -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Mixin] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Mixin] -> Bool) -> (BuildInfo -> [Mixin]) -> BuildInfo -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuildInfo -> [Mixin]
mixins) (PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg)
testedWithUsingWildcardSyntax :: [Dependency]
testedWithUsingWildcardSyntax =
[ PackageName -> VersionRange -> Set LibraryName -> Dependency
Dependency (String -> PackageName
mkPackageName (CompilerFlavor -> String
forall a. Pretty a => a -> String
prettyShow CompilerFlavor
compiler)) VersionRange
vr Set LibraryName
forall a. Set a
Set.empty
| (compiler :: CompilerFlavor
compiler, vr :: VersionRange
vr) <- PackageDescription -> [(CompilerFlavor, VersionRange)]
testedWith PackageDescription
pkg
, VersionRange -> Bool
usesWildcardSyntax VersionRange
vr ]
usesWildcardSyntax :: VersionRange -> Bool
usesWildcardSyntax :: VersionRange -> Bool
usesWildcardSyntax = (VersionRangeF Bool -> Bool) -> VersionRange -> Bool
forall a. (VersionRangeF a -> a) -> VersionRange -> a
cataVersionRange VersionRangeF Bool -> Bool
alg
where
alg :: VersionRangeF Bool -> Bool
alg (WildcardVersionF _) = Bool
True
alg (UnionVersionRangesF a :: Bool
a b :: Bool
b) = Bool
a Bool -> Bool -> Bool
|| Bool
b
alg (IntersectVersionRangesF a :: Bool
a b :: Bool
b) = Bool
a Bool -> Bool -> Bool
|| Bool
b
alg (VersionRangeParensF a :: Bool
a) = Bool
a
alg _ = Bool
False
eliminateWildcardSyntax :: VersionRange -> VersionRange
eliminateWildcardSyntax = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange
where
embed :: VersionRangeF VersionRange -> VersionRange
embed (WildcardVersionF v :: Version
v) = VersionRange -> VersionRange -> VersionRange
intersectVersionRanges
(Version -> VersionRange
orLaterVersion Version
v) (Version -> VersionRange
earlierVersion (Version -> Version
wildcardUpperBound Version
v))
embed (MajorBoundVersionF v :: Version
v) = VersionRange -> VersionRange -> VersionRange
intersectVersionRanges
(Version -> VersionRange
orLaterVersion Version
v) (Version -> VersionRange
earlierVersion (Version -> Version
majorUpperBound Version
v))
embed vr :: VersionRangeF VersionRange
vr = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr
usesMajorBoundSyntax :: VersionRange -> Bool
usesMajorBoundSyntax :: VersionRange -> Bool
usesMajorBoundSyntax = (VersionRangeF Bool -> Bool) -> VersionRange -> Bool
forall a. (VersionRangeF a -> a) -> VersionRange -> a
cataVersionRange VersionRangeF Bool -> Bool
alg
where
alg :: VersionRangeF Bool -> Bool
alg (MajorBoundVersionF _) = Bool
True
alg (UnionVersionRangesF a :: Bool
a b :: Bool
b) = Bool
a Bool -> Bool -> Bool
|| Bool
b
alg (IntersectVersionRangesF a :: Bool
a b :: Bool
b) = Bool
a Bool -> Bool -> Bool
|| Bool
b
alg (VersionRangeParensF a :: Bool
a) = Bool
a
alg _ = Bool
False
eliminateMajorBoundSyntax :: VersionRange -> VersionRange
eliminateMajorBoundSyntax = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange
where
embed :: VersionRangeF VersionRange -> VersionRange
embed (MajorBoundVersionF v :: Version
v) = VersionRange -> VersionRange -> VersionRange
intersectVersionRanges
(Version -> VersionRange
orLaterVersion Version
v) (Version -> VersionRange
earlierVersion (Version -> Version
majorUpperBound Version
v))
embed vr :: VersionRangeF VersionRange
vr = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr
mentionedExtensions :: [Extension]
mentionedExtensions = [ Extension
ext | BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, Extension
ext <- BuildInfo -> [Extension]
allExtensions BuildInfo
bi ]
mentionedExtensionsThatNeedCabal12 :: [Extension]
mentionedExtensionsThatNeedCabal12 =
[Extension] -> [Extension]
forall a. Eq a => [a] -> [a]
nub ((Extension -> Bool) -> [Extension] -> [Extension]
forall a. (a -> Bool) -> [a] -> [a]
filter (Extension -> [Extension] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extension]
compatExtensionsExtra) [Extension]
mentionedExtensions)
mentionedExtensionsThatNeedCabal14 :: [Extension]
mentionedExtensionsThatNeedCabal14 =
[Extension] -> [Extension]
forall a. Eq a => [a] -> [a]
nub ((Extension -> Bool) -> [Extension] -> [Extension]
forall a. (a -> Bool) -> [a] -> [a]
filter (Extension -> [Extension] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Extension]
compatExtensions) [Extension]
mentionedExtensions)
compatExtensions :: [Extension]
compatExtensions =
(KnownExtension -> Extension) -> [KnownExtension] -> [Extension]
forall a b. (a -> b) -> [a] -> [b]
map KnownExtension -> Extension
EnableExtension
[ KnownExtension
OverlappingInstances, KnownExtension
UndecidableInstances, KnownExtension
IncoherentInstances
, KnownExtension
RecursiveDo, KnownExtension
ParallelListComp, KnownExtension
MultiParamTypeClasses
, KnownExtension
FunctionalDependencies, KnownExtension
Rank2Types
, KnownExtension
RankNTypes, KnownExtension
PolymorphicComponents, KnownExtension
ExistentialQuantification
, KnownExtension
ScopedTypeVariables, KnownExtension
ImplicitParams, KnownExtension
FlexibleContexts
, KnownExtension
FlexibleInstances, KnownExtension
EmptyDataDecls, KnownExtension
CPP, KnownExtension
BangPatterns
, KnownExtension
TypeSynonymInstances, KnownExtension
TemplateHaskell, KnownExtension
ForeignFunctionInterface
, KnownExtension
Arrows, KnownExtension
Generics, KnownExtension
NamedFieldPuns, KnownExtension
PatternGuards
, KnownExtension
GeneralizedNewtypeDeriving, KnownExtension
ExtensibleRecords, KnownExtension
RestrictedTypeSynonyms
, KnownExtension
HereDocuments] [Extension] -> [Extension] -> [Extension]
forall a. [a] -> [a] -> [a]
++
(KnownExtension -> Extension) -> [KnownExtension] -> [Extension]
forall a b. (a -> b) -> [a] -> [b]
map KnownExtension -> Extension
DisableExtension
[KnownExtension
MonomorphismRestriction, KnownExtension
ImplicitPrelude] [Extension] -> [Extension] -> [Extension]
forall a. [a] -> [a] -> [a]
++
[Extension]
compatExtensionsExtra
compatExtensionsExtra :: [Extension]
compatExtensionsExtra =
(KnownExtension -> Extension) -> [KnownExtension] -> [Extension]
forall a b. (a -> b) -> [a] -> [b]
map KnownExtension -> Extension
EnableExtension
[ KnownExtension
KindSignatures, KnownExtension
MagicHash, KnownExtension
TypeFamilies, KnownExtension
StandaloneDeriving
, KnownExtension
UnicodeSyntax, KnownExtension
PatternSignatures, KnownExtension
UnliftedFFITypes, KnownExtension
LiberalTypeSynonyms
, KnownExtension
TypeOperators, KnownExtension
RecordWildCards, KnownExtension
RecordPuns, KnownExtension
DisambiguateRecordFields
, KnownExtension
OverloadedStrings, KnownExtension
GADTs, KnownExtension
RelaxedPolyRec
, KnownExtension
ExtendedDefaultRules, KnownExtension
UnboxedTuples, KnownExtension
DeriveDataTypeable
, KnownExtension
ConstrainedClassMethods
] [Extension] -> [Extension] -> [Extension]
forall a. [a] -> [a] -> [a]
++
(KnownExtension -> Extension) -> [KnownExtension] -> [Extension]
forall a b. (a -> b) -> [a] -> [b]
map KnownExtension -> Extension
DisableExtension
[KnownExtension
MonoPatBinds]
allModuleNames :: [ModuleName]
allModuleNames =
(case PackageDescription -> Maybe Library
library PackageDescription
pkg of
Nothing -> []
(Just lib :: Library
lib) -> Library -> [ModuleName]
explicitLibModules Library
lib
)
[ModuleName] -> [ModuleName] -> [ModuleName]
forall a. [a] -> [a] -> [a]
++ (BuildInfo -> [ModuleName]) -> [BuildInfo] -> [ModuleName]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap BuildInfo -> [ModuleName]
otherModules (PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg)
allModuleNamesAutogen :: [ModuleName]
allModuleNamesAutogen = (BuildInfo -> [ModuleName]) -> [BuildInfo] -> [ModuleName]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap BuildInfo -> [ModuleName]
autogenModules (PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg)
displayRawDependency :: Dependency -> String
displayRawDependency :: Dependency -> String
displayRawDependency (Dependency pkg :: PackageName
pkg vr :: VersionRange
vr _sublibs :: Set LibraryName
_sublibs) =
PackageName -> String
forall a. Pretty a => a -> String
prettyShow PackageName
pkg String -> ShowS
forall a. [a] -> [a] -> [a]
++ " " String -> ShowS
forall a. [a] -> [a] -> [a]
++ VersionRange -> String
forall a. Pretty a => a -> String
prettyShow VersionRange
vr
checkPackageVersions :: GenericPackageDescription -> [PackageCheck]
checkPackageVersions :: GenericPackageDescription -> [PackageCheck]
checkPackageVersions pkg :: GenericPackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (VersionRange -> Bool
boundedAbove VersionRange
baseDependency)) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The dependency 'build-depends: base' does not specify an upper "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "bound on the version number. Each major release of the 'base' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "package changes the API in various ways and most packages will "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "need some changes to compile with it. The recommended practise "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is to specify an upper bound on the version of the 'base' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "package. This ensures your package will continue to build when a "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "new major version of the 'base' package is released. If you are "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "not sure what upper bound to use then use the next major "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "version. For example if you have tested your package with 'base' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "version 4.5 and 4.6 then use 'build-depends: base >= 4.5 && < 4.7'."
]
where
finalised :: Either [Dependency] (PackageDescription, FlagAssignment)
finalised = FlagAssignment
-> ComponentRequestedSpec
-> (Dependency -> Bool)
-> Platform
-> CompilerInfo
-> [Dependency]
-> GenericPackageDescription
-> Either [Dependency] (PackageDescription, FlagAssignment)
finalizePD
FlagAssignment
forall a. Monoid a => a
mempty ComponentRequestedSpec
defaultComponentRequestedSpec (Bool -> Dependency -> Bool
forall a b. a -> b -> a
const Bool
True)
Platform
buildPlatform
(CompilerId -> AbiTag -> CompilerInfo
unknownCompilerInfo
(CompilerFlavor -> Version -> CompilerId
CompilerId CompilerFlavor
buildCompilerFlavor Version
nullVersion)
AbiTag
NoAbiTag)
[] GenericPackageDescription
pkg
baseDependency :: VersionRange
baseDependency = case Either [Dependency] (PackageDescription, FlagAssignment)
finalised of
Right (pkg' :: PackageDescription
pkg', _) | Bool -> Bool
not ([VersionRange] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [VersionRange]
baseDeps) ->
(VersionRange -> VersionRange -> VersionRange)
-> VersionRange -> [VersionRange] -> VersionRange
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr VersionRange -> VersionRange -> VersionRange
intersectVersionRanges VersionRange
anyVersion [VersionRange]
baseDeps
where
baseDeps :: [VersionRange]
baseDeps =
[ VersionRange
vr | Dependency pname :: PackageName
pname vr :: VersionRange
vr _ <- PackageDescription -> [Dependency]
allBuildDepends PackageDescription
pkg'
, PackageName
pname PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== String -> PackageName
mkPackageName "base" ]
_ -> VersionRange
noVersion
boundedAbove :: VersionRange -> Bool
boundedAbove :: VersionRange -> Bool
boundedAbove vr :: VersionRange
vr = case VersionRange -> [VersionInterval]
asVersionIntervals VersionRange
vr of
[] -> Bool
True
intervals :: [VersionInterval]
intervals -> case [VersionInterval] -> VersionInterval
forall a. [a] -> a
last [VersionInterval]
intervals of
(_, UpperBound _ _) -> Bool
True
(_, NoUpperBound ) -> Bool
False
checkConditionals :: GenericPackageDescription -> [PackageCheck]
checkConditionals :: GenericPackageDescription -> [PackageCheck]
checkConditionals pkg :: GenericPackageDescription
pkg =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownOSs) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unknown operating system name "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep (ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ShowS
quote [String]
unknownOSs)
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownArches) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unknown architecture name "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep (ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ShowS
quote [String]
unknownArches)
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownImpls) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unknown compiler name "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
commaSep (ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ShowS
quote [String]
unknownImpls)
]
where
unknownOSs :: [String]
unknownOSs = [ String
os | OS (OtherOS os :: String
os) <- [ConfVar]
conditions ]
unknownArches :: [String]
unknownArches = [ String
arch | Arch (OtherArch arch :: String
arch) <- [ConfVar]
conditions ]
unknownImpls :: [String]
unknownImpls = [ String
impl | Impl (OtherCompiler impl :: String
impl) _ <- [ConfVar]
conditions ]
conditions :: [ConfVar]
conditions = (CondTree ConfVar [Dependency] Library -> [ConfVar])
-> [CondTree ConfVar [Dependency] Library] -> [ConfVar]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CondTree ConfVar [Dependency] Library -> [ConfVar]
forall a c a. CondTree a c a -> [a]
fvs (Maybe (CondTree ConfVar [Dependency] Library)
-> [CondTree ConfVar [Dependency] Library]
forall a. Maybe a -> [a]
maybeToList (GenericPackageDescription
-> Maybe (CondTree ConfVar [Dependency] Library)
condLibrary GenericPackageDescription
pkg))
[ConfVar] -> [ConfVar] -> [ConfVar]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> [ConfVar])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> [ConfVar]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CondTree ConfVar [Dependency] Library -> [ConfVar]
forall a c a. CondTree a c a -> [a]
fvs (CondTree ConfVar [Dependency] Library -> [ConfVar])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> CondTree ConfVar [Dependency] Library)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> [ConfVar]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> CondTree ConfVar [Dependency] Library
forall a b. (a, b) -> b
snd) (GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
condSubLibraries GenericPackageDescription
pkg)
[ConfVar] -> [ConfVar] -> [ConfVar]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> [ConfVar])
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] ForeignLib)]
-> [ConfVar]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CondTree ConfVar [Dependency] ForeignLib -> [ConfVar]
forall a c a. CondTree a c a -> [a]
fvs (CondTree ConfVar [Dependency] ForeignLib -> [ConfVar])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> CondTree ConfVar [Dependency] ForeignLib)
-> (UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> [ConfVar]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> CondTree ConfVar [Dependency] ForeignLib
forall a b. (a, b) -> b
snd) (GenericPackageDescription
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] ForeignLib)]
condForeignLibs GenericPackageDescription
pkg)
[ConfVar] -> [ConfVar] -> [ConfVar]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> [ConfVar])
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
-> [ConfVar]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CondTree ConfVar [Dependency] Executable -> [ConfVar]
forall a c a. CondTree a c a -> [a]
fvs (CondTree ConfVar [Dependency] Executable -> [ConfVar])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> CondTree ConfVar [Dependency] Executable)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> [ConfVar]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> CondTree ConfVar [Dependency] Executable
forall a b. (a, b) -> b
snd) (GenericPackageDescription
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
condExecutables GenericPackageDescription
pkg)
[ConfVar] -> [ConfVar] -> [ConfVar]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> [ConfVar])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> [ConfVar]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CondTree ConfVar [Dependency] TestSuite -> [ConfVar]
forall a c a. CondTree a c a -> [a]
fvs (CondTree ConfVar [Dependency] TestSuite -> [ConfVar])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> CondTree ConfVar [Dependency] TestSuite)
-> (UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> [ConfVar]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> CondTree ConfVar [Dependency] TestSuite
forall a b. (a, b) -> b
snd) (GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
condTestSuites GenericPackageDescription
pkg)
[ConfVar] -> [ConfVar] -> [ConfVar]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> [ConfVar])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> [ConfVar]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CondTree ConfVar [Dependency] Benchmark -> [ConfVar]
forall a c a. CondTree a c a -> [a]
fvs (CondTree ConfVar [Dependency] Benchmark -> [ConfVar])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> CondTree ConfVar [Dependency] Benchmark)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> [ConfVar]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> CondTree ConfVar [Dependency] Benchmark
forall a b. (a, b) -> b
snd) (GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
condBenchmarks GenericPackageDescription
pkg)
fvs :: CondTree a c a -> [a]
fvs (CondNode _ _ ifs :: [CondBranch a c a]
ifs) = (CondBranch a c a -> [a]) -> [CondBranch a c a] -> [a]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CondBranch a c a -> [a]
compfv [CondBranch a c a]
ifs
compfv :: CondBranch a c a -> [a]
compfv (CondBranch c :: Condition a
c ct :: CondTree a c a
ct mct :: Maybe (CondTree a c a)
mct) = Condition a -> [a]
forall a. Condition a -> [a]
condfv Condition a
c [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ CondTree a c a -> [a]
fvs CondTree a c a
ct [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> (CondTree a c a -> [a]) -> Maybe (CondTree a c a) -> [a]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] CondTree a c a -> [a]
fvs Maybe (CondTree a c a)
mct
condfv :: Condition a -> [a]
condfv c :: Condition a
c = case Condition a
c of
Var v :: a
v -> [a
v]
Lit _ -> []
CNot c1 :: Condition a
c1 -> Condition a -> [a]
condfv Condition a
c1
COr c1 :: Condition a
c1 c2 :: Condition a
c2 -> Condition a -> [a]
condfv Condition a
c1 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ Condition a -> [a]
condfv Condition a
c2
CAnd c1 :: Condition a
c1 c2 :: Condition a
c2 -> Condition a -> [a]
condfv Condition a
c1 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ Condition a -> [a]
condfv Condition a
c2
checkFlagNames :: GenericPackageDescription -> [PackageCheck]
checkFlagNames :: GenericPackageDescription -> [PackageCheck]
checkFlagNames gpd :: GenericPackageDescription
gpd
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
invalidFlagNames = []
| Bool
otherwise = [ String -> PackageCheck
PackageDistInexcusable
(String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ "Suspicious flag names: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords [String]
invalidFlagNames String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "To avoid ambiguity in command line interfaces, flag shouldn't "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "start with a dash. Also for better compatibility, flag names "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "shouldn't contain non-ascii characters."
]
where
invalidFlagNames :: [String]
invalidFlagNames =
[ String
fn
| Flag
flag <- GenericPackageDescription -> [Flag]
genPackageFlags GenericPackageDescription
gpd
, let fn :: String
fn = FlagName -> String
unFlagName (Flag -> FlagName
flagName Flag
flag)
, String -> Bool
invalidFlagName String
fn
]
invalidFlagName :: String -> Bool
invalidFlagName ('-':_) = Bool
True
invalidFlagName cs :: String
cs = (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isAscii) String
cs
checkUnusedFlags :: GenericPackageDescription -> [PackageCheck]
checkUnusedFlags :: GenericPackageDescription -> [PackageCheck]
checkUnusedFlags gpd :: GenericPackageDescription
gpd
| Set FlagName
declared Set FlagName -> Set FlagName -> Bool
forall a. Eq a => a -> a -> Bool
== Set FlagName
used = []
| Bool
otherwise = [ String -> PackageCheck
PackageDistSuspicious
(String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ "Declared and used flag sets differ: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ Set FlagName -> String
s Set FlagName
declared String -> ShowS
forall a. [a] -> [a] -> [a]
++ " /= " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Set FlagName -> String
s Set FlagName
used String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". "
]
where
s :: Set.Set FlagName -> String
s :: Set FlagName -> String
s = [String] -> String
commaSep ([String] -> String)
-> (Set FlagName -> [String]) -> Set FlagName -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> String) -> [FlagName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map FlagName -> String
unFlagName ([FlagName] -> [String])
-> (Set FlagName -> [FlagName]) -> Set FlagName -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set FlagName -> [FlagName]
forall a. Set a -> [a]
Set.toList
declared :: Set.Set FlagName
declared :: Set FlagName
declared = Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[Flag]
[Flag]
Lens' GenericPackageDescription [Flag]
L.genPackageFlags LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[Flag]
[Flag]
-> ((FlagName -> Const (Set FlagName) FlagName)
-> [Flag] -> Const (Set FlagName) [Flag])
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Flag -> Const (Set FlagName) Flag)
-> [Flag] -> Const (Set FlagName) [Flag]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Flag -> Const (Set FlagName) Flag)
-> [Flag] -> Const (Set FlagName) [Flag])
-> ((FlagName -> Const (Set FlagName) FlagName)
-> Flag -> Const (Set FlagName) Flag)
-> (FlagName -> Const (Set FlagName) FlagName)
-> [Flag]
-> Const (Set FlagName) [Flag]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> Flag -> Const (Set FlagName) Flag
Lens' Flag FlagName
L.flagName) GenericPackageDescription
gpd
used :: Set.Set FlagName
used :: Set FlagName
used = [Set FlagName] -> Set FlagName
forall a. Monoid a => [a] -> a
mconcat
[ Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
(Maybe (CondTree ConfVar [Dependency] Library))
(Maybe (CondTree ConfVar [Dependency] Library))
Lens'
GenericPackageDescription
(Maybe (CondTree ConfVar [Dependency] Library))
L.condLibrary LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
(Maybe (CondTree ConfVar [Dependency] Library))
(Maybe (CondTree ConfVar [Dependency] Library))
-> ((FlagName -> Const (Set FlagName) FlagName)
-> Maybe (CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName) (Maybe (CondTree ConfVar [Dependency] Library)))
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CondTree ConfVar [Dependency] Library
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Library))
-> Maybe (CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName) (Maybe (CondTree ConfVar [Dependency] Library))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((CondTree ConfVar [Dependency] Library
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Library))
-> Maybe (CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName) (Maybe (CondTree ConfVar [Dependency] Library)))
-> ((FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Library
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Library))
-> (FlagName -> Const (Set FlagName) FlagName)
-> Maybe (CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName) (Maybe (CondTree ConfVar [Dependency] Library))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
ConfVar
ConfVar
forall v c a w. Traversal (CondTree v c a) (CondTree w c a) v w
traverseCondTreeV LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
ConfVar
ConfVar
-> ((FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar)
-> (FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Library
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Library)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar
Traversal' ConfVar FlagName
L._Flag) GenericPackageDescription
gpd
, Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
Lens'
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
L.condSubLibraries LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> ((FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)])
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Library))
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Library))
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)])
-> ((FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Library))
-> (FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] Library)
(UnqualComponentName, CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
forall c a b. Lens (c, a) (c, b) a b
_2 LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] Library)
(UnqualComponentName, CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
-> ((FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Library
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Library))
-> (FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Library)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
ConfVar
ConfVar
forall v c a w. Traversal (CondTree v c a) (CondTree w c a) v w
traverseCondTreeV LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Library)
(CondTree ConfVar [Dependency] Library)
ConfVar
ConfVar
-> ((FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar)
-> (FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Library
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Library)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar
Traversal' ConfVar FlagName
L._Flag) GenericPackageDescription
gpd
, Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
Lens'
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
L.condForeignLibs LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
-> ((FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] ForeignLib)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)])
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib))
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] ForeignLib)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (((UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib))
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] ForeignLib)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)])
-> ((FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib))
-> (FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] ForeignLib)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
(CondTree ConfVar [Dependency] ForeignLib)
(CondTree ConfVar [Dependency] ForeignLib)
forall c a b. Lens (c, a) (c, b) a b
_2 LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
(CondTree ConfVar [Dependency] ForeignLib)
(CondTree ConfVar [Dependency] ForeignLib)
-> ((FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] ForeignLib
-> Const (Set FlagName) (CondTree ConfVar [Dependency] ForeignLib))
-> (FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] ForeignLib)
(CondTree ConfVar [Dependency] ForeignLib)
ConfVar
ConfVar
forall v c a w. Traversal (CondTree v c a) (CondTree w c a) v w
traverseCondTreeV LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] ForeignLib)
(CondTree ConfVar [Dependency] ForeignLib)
ConfVar
ConfVar
-> ((FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar)
-> (FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] ForeignLib
-> Const (Set FlagName) (CondTree ConfVar [Dependency] ForeignLib)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar
Traversal' ConfVar FlagName
L._Flag) GenericPackageDescription
gpd
, Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
Lens'
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
L.condExecutables LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
-> ((FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)])
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Executable))
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (((UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Executable))
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)])
-> ((FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Executable))
-> (FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] Executable)
(UnqualComponentName, CondTree ConfVar [Dependency] Executable)
(CondTree ConfVar [Dependency] Executable)
(CondTree ConfVar [Dependency] Executable)
forall c a b. Lens (c, a) (c, b) a b
_2 LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] Executable)
(UnqualComponentName, CondTree ConfVar [Dependency] Executable)
(CondTree ConfVar [Dependency] Executable)
(CondTree ConfVar [Dependency] Executable)
-> ((FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Executable
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Executable))
-> (FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Executable)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Executable)
(CondTree ConfVar [Dependency] Executable)
ConfVar
ConfVar
forall v c a w. Traversal (CondTree v c a) (CondTree w c a) v w
traverseCondTreeV LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Executable)
(CondTree ConfVar [Dependency] Executable)
ConfVar
ConfVar
-> ((FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar)
-> (FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Executable
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Executable)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar
Traversal' ConfVar FlagName
L._Flag) GenericPackageDescription
gpd
, Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
Lens'
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
L.condTestSuites LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> ((FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)])
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite))
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (((UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite))
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)])
-> ((FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite))
-> (FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
(CondTree ConfVar [Dependency] TestSuite)
(CondTree ConfVar [Dependency] TestSuite)
forall c a b. Lens (c, a) (c, b) a b
_2 LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
(CondTree ConfVar [Dependency] TestSuite)
(CondTree ConfVar [Dependency] TestSuite)
-> ((FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] TestSuite
-> Const (Set FlagName) (CondTree ConfVar [Dependency] TestSuite))
-> (FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] TestSuite)
(CondTree ConfVar [Dependency] TestSuite)
ConfVar
ConfVar
forall v c a w. Traversal (CondTree v c a) (CondTree w c a) v w
traverseCondTreeV LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] TestSuite)
(CondTree ConfVar [Dependency] TestSuite)
ConfVar
ConfVar
-> ((FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar)
-> (FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] TestSuite
-> Const (Set FlagName) (CondTree ConfVar [Dependency] TestSuite)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar
Traversal' ConfVar FlagName
L._Flag) GenericPackageDescription
gpd
, Getting (Set FlagName) GenericPackageDescription FlagName
-> GenericPackageDescription -> Set FlagName
forall a s. Getting (Set a) s a -> s -> Set a
toSetOf (LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
Lens'
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
L.condBenchmarks LensLike
(Const (Set FlagName))
GenericPackageDescription
GenericPackageDescription
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> ((FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)])
-> Getting (Set FlagName) GenericPackageDescription FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark))
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (((UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark))
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)])
-> ((FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark))
-> (FlagName -> Const (Set FlagName) FlagName)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> Const
(Set FlagName)
[(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
(CondTree ConfVar [Dependency] Benchmark)
(CondTree ConfVar [Dependency] Benchmark)
forall c a b. Lens (c, a) (c, b) a b
_2 LensLike
(Const (Set FlagName))
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
(CondTree ConfVar [Dependency] Benchmark)
(CondTree ConfVar [Dependency] Benchmark)
-> ((FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Benchmark
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Benchmark))
-> (FlagName -> Const (Set FlagName) FlagName)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> Const
(Set FlagName)
(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Benchmark)
(CondTree ConfVar [Dependency] Benchmark)
ConfVar
ConfVar
forall v c a w. Traversal (CondTree v c a) (CondTree w c a) v w
traverseCondTreeV LensLike
(Const (Set FlagName))
(CondTree ConfVar [Dependency] Benchmark)
(CondTree ConfVar [Dependency] Benchmark)
ConfVar
ConfVar
-> ((FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar)
-> (FlagName -> Const (Set FlagName) FlagName)
-> CondTree ConfVar [Dependency] Benchmark
-> Const (Set FlagName) (CondTree ConfVar [Dependency] Benchmark)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FlagName -> Const (Set FlagName) FlagName)
-> ConfVar -> Const (Set FlagName) ConfVar
Traversal' ConfVar FlagName
L._Flag) GenericPackageDescription
gpd
]
checkUnicodeXFields :: GenericPackageDescription -> [PackageCheck]
checkUnicodeXFields :: GenericPackageDescription -> [PackageCheck]
checkUnicodeXFields gpd :: GenericPackageDescription
gpd
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
nonAsciiXFields = []
| Bool
otherwise = [ String -> PackageCheck
PackageDistInexcusable
(String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ "Non ascii custom fields: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords [String]
nonAsciiXFields String -> ShowS
forall a. [a] -> [a] -> [a]
++ ". "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "For better compatibility, custom field names "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "shouldn't contain non-ascii characters."
]
where
nonAsciiXFields :: [String]
nonAsciiXFields :: [String]
nonAsciiXFields = [ String
n | (n :: String
n, _) <- [(String, String)]
xfields, (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isAscii) String
n ]
xfields :: [(String,String)]
xfields :: [(String, String)]
xfields = DList (String, String) -> [(String, String)]
forall a. DList a -> [a]
DList.runDList (DList (String, String) -> [(String, String)])
-> DList (String, String) -> [(String, String)]
forall a b. (a -> b) -> a -> b
$ [DList (String, String)] -> DList (String, String)
forall a. Monoid a => [a] -> a
mconcat
[ Getting
(DList (String, String)) GenericPackageDescription (String, String)
-> GenericPackageDescription -> DList (String, String)
forall a s. Getting (DList a) s a -> s -> DList a
toDListOf (LensLike
(Const (DList (String, String)))
GenericPackageDescription
GenericPackageDescription
PackageDescription
PackageDescription
Lens' GenericPackageDescription PackageDescription
L.packageDescription LensLike
(Const (DList (String, String)))
GenericPackageDescription
GenericPackageDescription
PackageDescription
PackageDescription
-> (((String, String)
-> Const (DList (String, String)) (String, String))
-> PackageDescription
-> Const (DList (String, String)) PackageDescription)
-> Getting
(DList (String, String)) GenericPackageDescription (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (DList (String, String)))
PackageDescription
PackageDescription
[(String, String)]
[(String, String)]
Lens' PackageDescription [(String, String)]
L.customFieldsPD LensLike
(Const (DList (String, String)))
PackageDescription
PackageDescription
[(String, String)]
[(String, String)]
-> (((String, String)
-> Const (DList (String, String)) (String, String))
-> [(String, String)]
-> Const (DList (String, String)) [(String, String)])
-> ((String, String)
-> Const (DList (String, String)) (String, String))
-> PackageDescription
-> Const (DList (String, String)) PackageDescription
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, String)
-> Const (DList (String, String)) (String, String))
-> [(String, String)]
-> Const (DList (String, String)) [(String, String)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse) GenericPackageDescription
gpd
, Getting
(DList (String, String)) GenericPackageDescription (String, String)
-> GenericPackageDescription -> DList (String, String)
forall a s. Getting (DList a) s a -> s -> DList a
toDListOf (LensLike
(Const (DList (String, String)))
GenericPackageDescription
GenericPackageDescription
BuildInfo
BuildInfo
forall a. HasBuildInfos a => Traversal' a BuildInfo
L.traverseBuildInfos LensLike
(Const (DList (String, String)))
GenericPackageDescription
GenericPackageDescription
BuildInfo
BuildInfo
-> (((String, String)
-> Const (DList (String, String)) (String, String))
-> BuildInfo -> Const (DList (String, String)) BuildInfo)
-> Getting
(DList (String, String)) GenericPackageDescription (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LensLike
(Const (DList (String, String)))
BuildInfo
BuildInfo
[(String, String)]
[(String, String)]
forall a. HasBuildInfo a => Lens' a [(String, String)]
L.customFieldsBI LensLike
(Const (DList (String, String)))
BuildInfo
BuildInfo
[(String, String)]
[(String, String)]
-> (((String, String)
-> Const (DList (String, String)) (String, String))
-> [(String, String)]
-> Const (DList (String, String)) [(String, String)])
-> ((String, String)
-> Const (DList (String, String)) (String, String))
-> BuildInfo
-> Const (DList (String, String)) BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, String)
-> Const (DList (String, String)) (String, String))
-> [(String, String)]
-> Const (DList (String, String)) [(String, String)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse) GenericPackageDescription
gpd
]
checkPathsModuleExtensions :: PackageDescription -> [PackageCheck]
checkPathsModuleExtensions :: PackageDescription -> [PackageCheck]
checkPathsModuleExtensions pd :: PackageDescription
pd
| PackageDescription -> Version
specVersion PackageDescription
pd Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
mkVersion [2,1] = []
| (BuildInfo -> Bool) -> [BuildInfo] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any BuildInfo -> Bool
checkBI (PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pd) Bool -> Bool -> Bool
|| (Library -> Bool) -> [Library] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Library -> Bool
checkLib (PackageDescription -> [Library]
allLibraries PackageDescription
pd)
= PackageCheck -> [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return (PackageCheck -> [PackageCheck]) -> PackageCheck -> [PackageCheck]
forall a b. (a -> b) -> a -> b
$ String -> PackageCheck
PackageBuildImpossible (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ "The package uses RebindableSyntax with OverloadedStrings or OverloadedLists"
, "in default-extensions, and also Paths_ autogen module."
, "That configuration is known to cause compile failures with Cabal < 2.2."
, "To use these default-extensions with Paths_ autogen module"
, "specify at least 'cabal-version: 2.2'."
]
| Bool
otherwise = []
where
mn :: ModuleName
mn = PackageDescription -> ModuleName
autogenPathsModuleName PackageDescription
pd
checkLib :: Library -> Bool
checkLib :: Library -> Bool
checkLib l :: Library
l = ModuleName
mn ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Library -> [ModuleName]
exposedModules Library
l Bool -> Bool -> Bool
&& [Extension] -> Bool
forall (t :: * -> *). Foldable t => t Extension -> Bool
checkExts (Library
l Library -> Getting [Extension] Library [Extension] -> [Extension]
forall s a. s -> Getting a s a -> a
^. Getting [Extension] Library [Extension]
forall a. HasBuildInfo a => Lens' a [Extension]
L.defaultExtensions)
checkBI :: BuildInfo -> Bool
checkBI :: BuildInfo -> Bool
checkBI bi :: BuildInfo
bi =
(ModuleName
mn ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` BuildInfo -> [ModuleName]
otherModules BuildInfo
bi Bool -> Bool -> Bool
|| ModuleName
mn ModuleName -> [ModuleName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` BuildInfo -> [ModuleName]
autogenModules BuildInfo
bi) Bool -> Bool -> Bool
&&
[Extension] -> Bool
forall (t :: * -> *). Foldable t => t Extension -> Bool
checkExts (BuildInfo
bi BuildInfo
-> Getting [Extension] BuildInfo [Extension] -> [Extension]
forall s a. s -> Getting a s a -> a
^. Getting [Extension] BuildInfo [Extension]
forall a. HasBuildInfo a => Lens' a [Extension]
L.defaultExtensions)
checkExts :: t Extension -> Bool
checkExts exts :: t Extension
exts = Extension
rebind Extension -> t Extension -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` t Extension
exts Bool -> Bool -> Bool
&& (Extension
strings Extension -> t Extension -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` t Extension
exts Bool -> Bool -> Bool
|| Extension
lists Extension -> t Extension -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` t Extension
exts)
where
rebind :: Extension
rebind = KnownExtension -> Extension
EnableExtension KnownExtension
RebindableSyntax
strings :: Extension
strings = KnownExtension -> Extension
EnableExtension KnownExtension
OverloadedStrings
lists :: Extension
lists = KnownExtension -> Extension
EnableExtension KnownExtension
OverloadedLists
checkDevelopmentOnlyFlagsBuildInfo :: BuildInfo -> [PackageCheck]
checkDevelopmentOnlyFlagsBuildInfo :: BuildInfo -> [PackageCheck]
checkDevelopmentOnlyFlagsBuildInfo bi :: BuildInfo
bi =
String -> [String] -> [PackageCheck]
checkDevelopmentOnlyFlagsOptions "ghc-options" (CompilerFlavor -> BuildInfo -> [String]
hcOptions CompilerFlavor
GHC BuildInfo
bi)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ String -> [String] -> [PackageCheck]
checkDevelopmentOnlyFlagsOptions "ghc-prof-options" (CompilerFlavor -> BuildInfo -> [String]
hcProfOptions CompilerFlavor
GHC BuildInfo
bi)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ String -> [String] -> [PackageCheck]
checkDevelopmentOnlyFlagsOptions "ghc-shared-options" (CompilerFlavor -> BuildInfo -> [String]
hcSharedOptions CompilerFlavor
GHC BuildInfo
bi)
checkDevelopmentOnlyFlagsOptions :: String -> [String] -> [PackageCheck]
checkDevelopmentOnlyFlagsOptions :: String -> [String] -> [PackageCheck]
checkDevelopmentOnlyFlagsOptions fieldName :: String
fieldName ghcOptions :: [String]
ghcOptions =
[Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [
Bool -> PackageCheck -> Maybe PackageCheck
check Bool
has_WerrorWall (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -Wall -Werror' makes the package very easy to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "break with future GHC versions because new GHC versions often "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "add new warnings. Use just '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -Wall' instead."
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
extraExplanation
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not Bool
has_WerrorWall Bool -> Bool -> Bool
&& Bool
has_Werror) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -Werror' makes the package easy to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "break with future GHC versions because new GHC versions often "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "add new warnings. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
extraExplanation
, Bool -> PackageCheck -> Maybe PackageCheck
check (Bool
has_J) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -j[N]' can make sense for specific user's setup,"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " but it is not appropriate for a distributed package."
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
extraExplanation
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-fdefer-type-errors"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -fdefer-type-errors' is fine during development but "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "is not appropriate for a distributed package. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
extraExplanation
, Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\opt :: String
opt -> "-d" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
opt Bool -> Bool -> Bool
&& String
opt String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= "-dynamic")
[String]
ghcOptions) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -d*' debug flags are not appropriate "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "for a distributed package. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
extraExplanation
, [String] -> PackageCheck -> Maybe PackageCheck
checkFlags ["-fprof-auto", "-fprof-auto-top", "-fprof-auto-calls",
"-fprof-cafs", "-fno-prof-count-entries",
"-auto-all", "-auto", "-caf-all"] (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistSuspicious (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldName String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": -fprof*' profiling flags are typically not "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "appropriate for a distributed library package. These flags are "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "useful to profile this package, but when profiling other packages "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "that use this one these flags clutter the profile output with "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "excessive detail. If you think other packages really want to see "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "cost centres from this package then use '-fprof-auto-exported' "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "which puts cost centres only on exported functions. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
extraExplanation
]
where
extraExplanation :: String
extraExplanation =
" Alternatively, if you want to use this, make it conditional based "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "on a Cabal configuration flag (with 'manual: True' and 'default: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "False') and enable that flag during development."
has_WerrorWall :: Bool
has_WerrorWall = Bool
has_Werror Bool -> Bool -> Bool
&& ( Bool
has_Wall Bool -> Bool -> Bool
|| Bool
has_W )
has_Werror :: Bool
has_Werror = "-Werror" String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
ghcOptions
has_Wall :: Bool
has_Wall = "-Wall" String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
ghcOptions
has_W :: Bool
has_W = "-W" String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
ghcOptions
has_J :: Bool
has_J = (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any
(\o :: String
o -> case String
o of
"-j" -> Bool
True
('-' : 'j' : d :: Char
d : _) -> Char -> Bool
isDigit Char
d
_ -> Bool
False
)
[String]
ghcOptions
checkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkFlags :: [String] -> PackageCheck -> Maybe PackageCheck
checkFlags flags :: [String]
flags = Bool -> PackageCheck -> Maybe PackageCheck
check ((String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
flags) [String]
ghcOptions)
checkDevelopmentOnlyFlags :: GenericPackageDescription -> [PackageCheck]
checkDevelopmentOnlyFlags :: GenericPackageDescription -> [PackageCheck]
checkDevelopmentOnlyFlags pkg :: GenericPackageDescription
pkg =
(BuildInfo -> [PackageCheck]) -> [BuildInfo] -> [PackageCheck]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap BuildInfo -> [PackageCheck]
checkDevelopmentOnlyFlagsBuildInfo
[ BuildInfo
bi
| (conditions :: [Condition ConfVar]
conditions, bi :: BuildInfo
bi) <- [([Condition ConfVar], BuildInfo)]
allConditionalBuildInfo
, Bool -> Bool
not ((Condition ConfVar -> Bool) -> [Condition ConfVar] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Condition ConfVar -> Bool
guardedByManualFlag [Condition ConfVar]
conditions) ]
where
guardedByManualFlag :: Condition ConfVar -> Bool
guardedByManualFlag = Condition ConfVar -> Bool
definitelyFalse
definitelyFalse :: Condition ConfVar -> Bool
definitelyFalse (Var (Flag n :: FlagName
n)) = Bool -> (Bool -> Bool) -> Maybe Bool -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False Bool -> Bool
not (FlagName -> Map FlagName Bool -> Maybe Bool
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup FlagName
n Map FlagName Bool
manualFlags)
definitelyFalse (Var _) = Bool
False
definitelyFalse (Lit b :: Bool
b) = Bool -> Bool
not Bool
b
definitelyFalse (CNot c :: Condition ConfVar
c) = Condition ConfVar -> Bool
definitelyTrue Condition ConfVar
c
definitelyFalse (COr c1 :: Condition ConfVar
c1 c2 :: Condition ConfVar
c2) = Condition ConfVar -> Bool
definitelyFalse Condition ConfVar
c1 Bool -> Bool -> Bool
&& Condition ConfVar -> Bool
definitelyFalse Condition ConfVar
c2
definitelyFalse (CAnd c1 :: Condition ConfVar
c1 c2 :: Condition ConfVar
c2) = Condition ConfVar -> Bool
definitelyFalse Condition ConfVar
c1 Bool -> Bool -> Bool
|| Condition ConfVar -> Bool
definitelyFalse Condition ConfVar
c2
definitelyTrue :: Condition ConfVar -> Bool
definitelyTrue (Var (Flag n :: FlagName
n)) = Bool -> Maybe Bool -> Bool
forall a. a -> Maybe a -> a
fromMaybe Bool
False (FlagName -> Map FlagName Bool -> Maybe Bool
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup FlagName
n Map FlagName Bool
manualFlags)
definitelyTrue (Var _) = Bool
False
definitelyTrue (Lit b :: Bool
b) = Bool
b
definitelyTrue (CNot c :: Condition ConfVar
c) = Condition ConfVar -> Bool
definitelyFalse Condition ConfVar
c
definitelyTrue (COr c1 :: Condition ConfVar
c1 c2 :: Condition ConfVar
c2) = Condition ConfVar -> Bool
definitelyTrue Condition ConfVar
c1 Bool -> Bool -> Bool
|| Condition ConfVar -> Bool
definitelyTrue Condition ConfVar
c2
definitelyTrue (CAnd c1 :: Condition ConfVar
c1 c2 :: Condition ConfVar
c2) = Condition ConfVar -> Bool
definitelyTrue Condition ConfVar
c1 Bool -> Bool -> Bool
&& Condition ConfVar -> Bool
definitelyTrue Condition ConfVar
c2
manualFlags :: Map FlagName Bool
manualFlags = [(FlagName, Bool)] -> Map FlagName Bool
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (Flag -> FlagName
flagName Flag
flag, Flag -> Bool
flagDefault Flag
flag)
| Flag
flag <- GenericPackageDescription -> [Flag]
genPackageFlags GenericPackageDescription
pkg
, Flag -> Bool
flagManual Flag
flag ]
allConditionalBuildInfo :: [([Condition ConfVar], BuildInfo)]
allConditionalBuildInfo :: [([Condition ConfVar], BuildInfo)]
allConditionalBuildInfo =
(CondTree ConfVar [Dependency] Library
-> [([Condition ConfVar], BuildInfo)])
-> [CondTree ConfVar [Dependency] Library]
-> [([Condition ConfVar], BuildInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Library -> BuildInfo)
-> CondTree ConfVar [Dependency] Library
-> [([Condition ConfVar], BuildInfo)]
forall a b v c. (a -> b) -> CondTree v c a -> [([Condition v], b)]
collectCondTreePaths Library -> BuildInfo
libBuildInfo)
(Maybe (CondTree ConfVar [Dependency] Library)
-> [CondTree ConfVar [Dependency] Library]
forall a. Maybe a -> [a]
maybeToList (GenericPackageDescription
-> Maybe (CondTree ConfVar [Dependency] Library)
condLibrary GenericPackageDescription
pkg))
[([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> [([Condition ConfVar], BuildInfo)])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
-> [([Condition ConfVar], BuildInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Library -> BuildInfo)
-> CondTree ConfVar [Dependency] Library
-> [([Condition ConfVar], BuildInfo)]
forall a b v c. (a -> b) -> CondTree v c a -> [([Condition v], b)]
collectCondTreePaths Library -> BuildInfo
libBuildInfo (CondTree ConfVar [Dependency] Library
-> [([Condition ConfVar], BuildInfo)])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> CondTree ConfVar [Dependency] Library)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> [([Condition ConfVar], BuildInfo)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] Library)
-> CondTree ConfVar [Dependency] Library
forall a b. (a, b) -> b
snd)
(GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
condSubLibraries GenericPackageDescription
pkg)
[([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> [([Condition ConfVar], BuildInfo)])
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
-> [([Condition ConfVar], BuildInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Executable -> BuildInfo)
-> CondTree ConfVar [Dependency] Executable
-> [([Condition ConfVar], BuildInfo)]
forall a b v c. (a -> b) -> CondTree v c a -> [([Condition v], b)]
collectCondTreePaths Executable -> BuildInfo
buildInfo (CondTree ConfVar [Dependency] Executable
-> [([Condition ConfVar], BuildInfo)])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> CondTree ConfVar [Dependency] Executable)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> [([Condition ConfVar], BuildInfo)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] Executable)
-> CondTree ConfVar [Dependency] Executable
forall a b. (a, b) -> b
snd)
(GenericPackageDescription
-> [(UnqualComponentName,
CondTree ConfVar [Dependency] Executable)]
condExecutables GenericPackageDescription
pkg)
[([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> [([Condition ConfVar], BuildInfo)])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> [([Condition ConfVar], BuildInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((TestSuite -> BuildInfo)
-> CondTree ConfVar [Dependency] TestSuite
-> [([Condition ConfVar], BuildInfo)]
forall a b v c. (a -> b) -> CondTree v c a -> [([Condition v], b)]
collectCondTreePaths TestSuite -> BuildInfo
testBuildInfo (CondTree ConfVar [Dependency] TestSuite
-> [([Condition ConfVar], BuildInfo)])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> CondTree ConfVar [Dependency] TestSuite)
-> (UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> [([Condition ConfVar], BuildInfo)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)
-> CondTree ConfVar [Dependency] TestSuite
forall a b. (a, b) -> b
snd)
(GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
condTestSuites GenericPackageDescription
pkg)
[([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
-> [([Condition ConfVar], BuildInfo)]
forall a. [a] -> [a] -> [a]
++ ((UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> [([Condition ConfVar], BuildInfo)])
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
-> [([Condition ConfVar], BuildInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Benchmark -> BuildInfo)
-> CondTree ConfVar [Dependency] Benchmark
-> [([Condition ConfVar], BuildInfo)]
forall a b v c. (a -> b) -> CondTree v c a -> [([Condition v], b)]
collectCondTreePaths Benchmark -> BuildInfo
benchmarkBuildInfo (CondTree ConfVar [Dependency] Benchmark
-> [([Condition ConfVar], BuildInfo)])
-> ((UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> CondTree ConfVar [Dependency] Benchmark)
-> (UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> [([Condition ConfVar], BuildInfo)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)
-> CondTree ConfVar [Dependency] Benchmark
forall a b. (a, b) -> b
snd)
(GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
condBenchmarks GenericPackageDescription
pkg)
collectCondTreePaths :: (a -> b)
-> CondTree v c a
-> [([Condition v], b)]
collectCondTreePaths :: (a -> b) -> CondTree v c a -> [([Condition v], b)]
collectCondTreePaths mapData :: a -> b
mapData = [Condition v] -> CondTree v c a -> [([Condition v], b)]
forall v c. [Condition v] -> CondTree v c a -> [([Condition v], b)]
go []
where
go :: [Condition v] -> CondTree v c a -> [([Condition v], b)]
go conditions :: [Condition v]
conditions condNode :: CondTree v c a
condNode =
([Condition v] -> [Condition v]
forall a. [a] -> [a]
reverse [Condition v]
conditions, a -> b
mapData (CondTree v c a -> a
forall v c a. CondTree v c a -> a
condTreeData CondTree v c a
condNode))
([Condition v], b) -> [([Condition v], b)] -> [([Condition v], b)]
forall a. a -> [a] -> [a]
: [[([Condition v], b)]] -> [([Condition v], b)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [Condition v] -> CondTree v c a -> [([Condition v], b)]
go (Condition v
conditionCondition v -> [Condition v] -> [Condition v]
forall a. a -> [a] -> [a]
:[Condition v]
conditions) CondTree v c a
ifThen
| (CondBranch condition :: Condition v
condition ifThen :: CondTree v c a
ifThen _) <- CondTree v c a -> [CondBranch v c a]
forall v c a. CondTree v c a -> [CondBranch v c a]
condTreeComponents CondTree v c a
condNode ]
[([Condition v], b)]
-> [([Condition v], b)] -> [([Condition v], b)]
forall a. [a] -> [a] -> [a]
++ [[([Condition v], b)]] -> [([Condition v], b)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [Condition v] -> CondTree v c a -> [([Condition v], b)]
go (Condition v
conditionCondition v -> [Condition v] -> [Condition v]
forall a. a -> [a] -> [a]
:[Condition v]
conditions) CondTree v c a
elseThen
| (CondBranch condition :: Condition v
condition _ (Just elseThen :: CondTree v c a
elseThen)) <- CondTree v c a -> [CondBranch v c a]
forall v c a. CondTree v c a -> [CondBranch v c a]
condTreeComponents CondTree v c a
condNode ]
checkPackageFiles :: Verbosity -> PackageDescription -> FilePath -> NoCallStackIO [PackageCheck]
checkPackageFiles :: Verbosity
-> PackageDescription -> String -> NoCallStackIO [PackageCheck]
checkPackageFiles verbosity :: Verbosity
verbosity pkg :: PackageDescription
pkg root :: String
root = do
[PackageCheck]
contentChecks <- CheckPackageContentOps IO
-> PackageDescription -> NoCallStackIO [PackageCheck]
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkPackageContent CheckPackageContentOps IO
checkFilesIO PackageDescription
pkg
[PackageCheck]
preDistributionChecks <- Verbosity
-> PackageDescription -> String -> NoCallStackIO [PackageCheck]
checkPackageFilesPreDistribution Verbosity
verbosity PackageDescription
pkg String
root
[PackageCheck] -> NoCallStackIO [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return ([PackageCheck] -> [PackageCheck]
forall a. Ord a => [a] -> [a]
sort [PackageCheck]
contentChecks [PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ [PackageCheck] -> [PackageCheck]
forall a. Ord a => [a] -> [a]
sort [PackageCheck]
preDistributionChecks)
where
checkFilesIO :: CheckPackageContentOps IO
checkFilesIO = CheckPackageContentOps :: forall (m :: * -> *).
(String -> m Bool)
-> (String -> m Bool)
-> (String -> m [String])
-> (String -> m ByteString)
-> CheckPackageContentOps m
CheckPackageContentOps {
doesFileExist :: String -> IO Bool
doesFileExist = String -> IO Bool
System.doesFileExist (String -> IO Bool) -> ShowS -> String -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
relative,
doesDirectoryExist :: String -> IO Bool
doesDirectoryExist = String -> IO Bool
System.doesDirectoryExist (String -> IO Bool) -> ShowS -> String -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
relative,
getDirectoryContents :: String -> IO [String]
getDirectoryContents = String -> IO [String]
System.Directory.getDirectoryContents (String -> IO [String]) -> ShowS -> String -> IO [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
relative,
getFileContents :: String -> IO ByteString
getFileContents = String -> IO ByteString
BS.readFile (String -> IO ByteString) -> ShowS -> String -> IO ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
relative
}
relative :: ShowS
relative path :: String
path = String
root String -> ShowS
</> String
path
data CheckPackageContentOps m = CheckPackageContentOps {
CheckPackageContentOps m -> String -> m Bool
doesFileExist :: FilePath -> m Bool,
CheckPackageContentOps m -> String -> m Bool
doesDirectoryExist :: FilePath -> m Bool,
CheckPackageContentOps m -> String -> m [String]
getDirectoryContents :: FilePath -> m [FilePath],
CheckPackageContentOps m -> String -> m ByteString
getFileContents :: FilePath -> m BS.ByteString
}
checkPackageContent :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m [PackageCheck]
checkPackageContent :: CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkPackageContent ops :: CheckPackageContentOps m
ops pkg :: PackageDescription
pkg = do
Maybe PackageCheck
cabalBomError <- CheckPackageContentOps m -> m (Maybe PackageCheck)
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> m (Maybe PackageCheck)
checkCabalFileBOM CheckPackageContentOps m
ops
Maybe PackageCheck
cabalNameError <- CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
checkCabalFileName CheckPackageContentOps m
ops PackageDescription
pkg
[PackageCheck]
licenseErrors <- CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkLicensesExist CheckPackageContentOps m
ops PackageDescription
pkg
Maybe PackageCheck
setupError <- CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
checkSetupExists CheckPackageContentOps m
ops PackageDescription
pkg
Maybe PackageCheck
configureError <- CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
checkConfigureExists CheckPackageContentOps m
ops PackageDescription
pkg
[PackageCheck]
localPathErrors <- CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkLocalPathsExist CheckPackageContentOps m
ops PackageDescription
pkg
[PackageCheck]
vcsLocation <- CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkMissingVcsInfo CheckPackageContentOps m
ops PackageDescription
pkg
[PackageCheck] -> m [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return ([PackageCheck] -> m [PackageCheck])
-> [PackageCheck] -> m [PackageCheck]
forall a b. (a -> b) -> a -> b
$ [PackageCheck]
licenseErrors
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ [Maybe PackageCheck] -> [PackageCheck]
forall a. [Maybe a] -> [a]
catMaybes [Maybe PackageCheck
cabalBomError, Maybe PackageCheck
cabalNameError, Maybe PackageCheck
setupError, Maybe PackageCheck
configureError]
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ [PackageCheck]
localPathErrors
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ [PackageCheck]
vcsLocation
checkCabalFileBOM :: Monad m => CheckPackageContentOps m
-> m (Maybe PackageCheck)
checkCabalFileBOM :: CheckPackageContentOps m -> m (Maybe PackageCheck)
checkCabalFileBOM ops :: CheckPackageContentOps m
ops = do
Either PackageCheck String
epdfile <- CheckPackageContentOps m -> m (Either PackageCheck String)
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> m (Either PackageCheck String)
findPackageDesc CheckPackageContentOps m
ops
case Either PackageCheck String
epdfile of
Left _ -> Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe PackageCheck -> m (Maybe PackageCheck))
-> Maybe PackageCheck -> m (Maybe PackageCheck)
forall a b. (a -> b) -> a -> b
$ Maybe PackageCheck
forall a. Maybe a
Nothing
Right pdfile :: String
pdfile -> ((Bool -> PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Bool -> Maybe PackageCheck
forall a b c. (a -> b -> c) -> b -> a -> c
flip Bool -> PackageCheck -> Maybe PackageCheck
check PackageCheck
pc (Bool -> Maybe PackageCheck)
-> (ByteString -> Bool) -> ByteString -> Maybe PackageCheck
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Bool
BS.isPrefixOf ByteString
bomUtf8)
(ByteString -> Maybe PackageCheck)
-> m ByteString -> m (Maybe PackageCheck)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` (CheckPackageContentOps m -> String -> m ByteString
forall (m :: * -> *).
CheckPackageContentOps m -> String -> m ByteString
getFileContents CheckPackageContentOps m
ops String
pdfile)
where pc :: PackageCheck
pc = String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
String
pdfile String -> ShowS
forall a. [a] -> [a] -> [a]
++ " starts with an Unicode byte order mark (BOM)."
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " This may cause problems with older cabal versions."
where
bomUtf8 :: BS.ByteString
bomUtf8 :: ByteString
bomUtf8 = [Word8] -> ByteString
BS.pack [0xef,0xbb,0xbf]
checkCabalFileName :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m (Maybe PackageCheck)
checkCabalFileName :: CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
checkCabalFileName ops :: CheckPackageContentOps m
ops pkg :: PackageDescription
pkg = do
Either PackageCheck String
epdfile <- CheckPackageContentOps m -> m (Either PackageCheck String)
forall (m :: * -> *).
Monad m =>
CheckPackageContentOps m -> m (Either PackageCheck String)
findPackageDesc CheckPackageContentOps m
ops
case Either PackageCheck String
epdfile of
Left _ -> Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe PackageCheck
forall a. Maybe a
Nothing
Right pdfile :: String
pdfile
| ShowS
takeFileName String
pdfile String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
expectedCabalname -> Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe PackageCheck
forall a. Maybe a
Nothing
| Bool
otherwise -> Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe PackageCheck -> m (Maybe PackageCheck))
-> Maybe PackageCheck -> m (Maybe PackageCheck)
forall a b. (a -> b) -> a -> b
$ PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$ String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The filename " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
pdfile String -> ShowS
forall a. [a] -> [a] -> [a]
++ " does not match package name " String -> ShowS
forall a. [a] -> [a] -> [a]
++
"(expected: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
expectedCabalname String -> ShowS
forall a. [a] -> [a] -> [a]
++ ")"
where
pkgname :: String
pkgname = PackageName -> String
unPackageName (PackageName -> String)
-> (PackageDescription -> PackageName)
-> PackageDescription
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageDescription -> PackageName
forall pkg. Package pkg => pkg -> PackageName
packageName (PackageDescription -> String) -> PackageDescription -> String
forall a b. (a -> b) -> a -> b
$ PackageDescription
pkg
expectedCabalname :: String
expectedCabalname = String
pkgname String -> ShowS
<.> "cabal"
findPackageDesc :: Monad m => CheckPackageContentOps m
-> m (Either PackageCheck FilePath)
findPackageDesc :: CheckPackageContentOps m -> m (Either PackageCheck String)
findPackageDesc ops :: CheckPackageContentOps m
ops
= do let dir :: String
dir = "."
[String]
files <- CheckPackageContentOps m -> String -> m [String]
forall (m :: * -> *).
CheckPackageContentOps m -> String -> m [String]
getDirectoryContents CheckPackageContentOps m
ops String
dir
[String]
cabalFiles <- (String -> m Bool) -> [String] -> m [String]
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM (CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesFileExist CheckPackageContentOps m
ops)
[ String
dir String -> ShowS
</> String
file
| String
file <- [String]
files
, let (name :: String
name, ext :: String
ext) = String -> (String, String)
splitExtension String
file
, Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
name) Bool -> Bool -> Bool
&& String
ext String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== ".cabal" ]
case [String]
cabalFiles of
[] -> Either PackageCheck String -> m (Either PackageCheck String)
forall (m :: * -> *) a. Monad m => a -> m a
return (PackageCheck -> Either PackageCheck String
forall a b. a -> Either a b
Left (PackageCheck -> Either PackageCheck String)
-> PackageCheck -> Either PackageCheck String
forall a b. (a -> b) -> a -> b
$ String -> PackageCheck
PackageBuildImpossible String
noDesc)
[cabalFile :: String
cabalFile] -> Either PackageCheck String -> m (Either PackageCheck String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Either PackageCheck String
forall a b. b -> Either a b
Right String
cabalFile)
multiple :: [String]
multiple -> Either PackageCheck String -> m (Either PackageCheck String)
forall (m :: * -> *) a. Monad m => a -> m a
return (PackageCheck -> Either PackageCheck String
forall a b. a -> Either a b
Left (PackageCheck -> Either PackageCheck String)
-> PackageCheck -> Either PackageCheck String
forall a b. (a -> b) -> a -> b
$ String -> PackageCheck
PackageBuildImpossible
(String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$ [String] -> String
multiDesc [String]
multiple)
where
noDesc :: String
noDesc :: String
noDesc = "No cabal file found.\n"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Please create a package description file <pkgname>.cabal"
multiDesc :: [String] -> String
multiDesc :: [String] -> String
multiDesc l :: [String]
l = "Multiple cabal files found while checking.\n"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Please use only one of: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate ", " [String]
l
checkLicensesExist :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m [PackageCheck]
checkLicensesExist :: CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkLicensesExist ops :: CheckPackageContentOps m
ops pkg :: PackageDescription
pkg = do
[Bool]
exists <- (String -> m Bool) -> [String] -> m [Bool]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesFileExist CheckPackageContentOps m
ops) (PackageDescription -> [String]
licenseFiles PackageDescription
pkg)
[PackageCheck] -> m [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return
[ String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fieldname String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' field refers to the file "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
quote String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ " which does not exist."
| (file :: String
file, False) <- [String] -> [Bool] -> [(String, Bool)]
forall a b. [a] -> [b] -> [(a, b)]
zip (PackageDescription -> [String]
licenseFiles PackageDescription
pkg) [Bool]
exists ]
where
fieldname :: String
fieldname | [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (PackageDescription -> [String]
licenseFiles PackageDescription
pkg) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 1 = "license-file"
| Bool
otherwise = "license-files"
checkSetupExists :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m (Maybe PackageCheck)
checkSetupExists :: CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
checkSetupExists ops :: CheckPackageContentOps m
ops pkg :: PackageDescription
pkg = do
let simpleBuild :: Bool
simpleBuild = PackageDescription -> BuildType
buildType PackageDescription
pkg BuildType -> BuildType -> Bool
forall a. Eq a => a -> a -> Bool
== BuildType
Simple
Bool
hsexists <- CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesFileExist CheckPackageContentOps m
ops "Setup.hs"
Bool
lhsexists <- CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesFileExist CheckPackageContentOps m
ops "Setup.lhs"
Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe PackageCheck -> m (Maybe PackageCheck))
-> Maybe PackageCheck -> m (Maybe PackageCheck)
forall a b. (a -> b) -> a -> b
$ Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not Bool
simpleBuild Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
hsexists Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
lhsexists) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The package is missing a Setup.hs or Setup.lhs script."
checkConfigureExists :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m (Maybe PackageCheck)
checkConfigureExists :: CheckPackageContentOps m
-> PackageDescription -> m (Maybe PackageCheck)
checkConfigureExists ops :: CheckPackageContentOps m
ops pd :: PackageDescription
pd
| PackageDescription -> BuildType
buildType PackageDescription
pd BuildType -> BuildType -> Bool
forall a. Eq a => a -> a -> Bool
== BuildType
Configure = do
Bool
exists <- CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesFileExist CheckPackageContentOps m
ops "configure"
Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe PackageCheck -> m (Maybe PackageCheck))
-> Maybe PackageCheck -> m (Maybe PackageCheck)
forall a b. (a -> b) -> a -> b
$ Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not Bool
exists) (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageBuildWarning (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The 'build-type' is 'Configure' but there is no 'configure' script. "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "You probably need to run 'autoreconf -i' to generate it."
| Bool
otherwise = Maybe PackageCheck -> m (Maybe PackageCheck)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe PackageCheck
forall a. Maybe a
Nothing
checkLocalPathsExist :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m [PackageCheck]
checkLocalPathsExist :: CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkLocalPathsExist ops :: CheckPackageContentOps m
ops pkg :: PackageDescription
pkg = do
let dirs :: [(String, String)]
dirs = [ (String
dir, String
kind)
| BuildInfo
bi <- PackageDescription -> [BuildInfo]
allBuildInfo PackageDescription
pkg
, (dir :: String
dir, kind :: String
kind) <-
[ (String
dir, "extra-lib-dirs") | String
dir <- BuildInfo -> [String]
extraLibDirs BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
dir, "extra-framework-dirs")
| String
dir <- BuildInfo -> [String]
extraFrameworkDirs BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
dir, "include-dirs") | String
dir <- BuildInfo -> [String]
includeDirs BuildInfo
bi ]
[(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [ (String
dir, "hs-source-dirs") | String
dir <- BuildInfo -> [String]
hsSourceDirs BuildInfo
bi ]
, String -> Bool
isRelativeOnAnyPlatform String
dir ]
[(String, String)]
missing <- ((String, String) -> m Bool)
-> [(String, String)] -> m [(String, String)]
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM ((Bool -> Bool) -> m Bool -> m Bool
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Bool -> Bool
not (m Bool -> m Bool)
-> ((String, String) -> m Bool) -> (String, String) -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesDirectoryExist CheckPackageContentOps m
ops (String -> m Bool)
-> ((String, String) -> String) -> (String, String) -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, String) -> String
forall a b. (a, b) -> a
fst) [(String, String)]
dirs
[PackageCheck] -> m [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return [ PackageBuildWarning :: String -> PackageCheck
PackageBuildWarning {
explanation :: String
explanation = ShowS
quote (String
kind String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
dir)
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " directory does not exist."
}
| (dir :: String
dir, kind :: String
kind) <- [(String, String)]
missing ]
checkMissingVcsInfo :: Monad m => CheckPackageContentOps m
-> PackageDescription
-> m [PackageCheck]
checkMissingVcsInfo :: CheckPackageContentOps m -> PackageDescription -> m [PackageCheck]
checkMissingVcsInfo ops :: CheckPackageContentOps m
ops pkg :: PackageDescription
pkg | [SourceRepo] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> [SourceRepo]
sourceRepos PackageDescription
pkg) = do
Bool
vcsInUse <- ([Bool] -> Bool) -> m [Bool] -> m Bool
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or (m [Bool] -> m Bool) -> m [Bool] -> m Bool
forall a b. (a -> b) -> a -> b
$ (String -> m Bool) -> [String] -> m [Bool]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (CheckPackageContentOps m -> String -> m Bool
forall (m :: * -> *). CheckPackageContentOps m -> String -> m Bool
doesDirectoryExist CheckPackageContentOps m
ops) [String]
repoDirnames
if Bool
vcsInUse
then [PackageCheck] -> m [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return [ String -> PackageCheck
PackageDistSuspicious String
message ]
else [PackageCheck] -> m [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return []
where
repoDirnames :: [String]
repoDirnames = [ String
dirname | RepoType
repo <- [RepoType]
knownRepoTypes
, String
dirname <- RepoType -> [String]
repoTypeDirname RepoType
repo ]
message :: String
message = "When distributing packages it is encouraged to specify source "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "control information in the .cabal file using one or more "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'source-repository' sections. See the Cabal user guide for "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "details."
checkMissingVcsInfo _ _ = [PackageCheck] -> m [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return []
repoTypeDirname :: RepoType -> [FilePath]
repoTypeDirname :: RepoType -> [String]
repoTypeDirname Darcs = ["_darcs"]
repoTypeDirname Git = [".git"]
repoTypeDirname SVN = [".svn"]
repoTypeDirname CVS = ["CVS"]
repoTypeDirname Mercurial = [".hg"]
repoTypeDirname GnuArch = [".arch-params"]
repoTypeDirname Bazaar = [".bzr"]
repoTypeDirname Monotone = ["_MTN"]
repoTypeDirname _ = []
checkPackageFileNames :: [FilePath] -> [PackageCheck]
checkPackageFileNames :: [String] -> [PackageCheck]
checkPackageFileNames files :: [String]
files =
(Int -> [PackageCheck] -> [PackageCheck]
forall a. Int -> [a] -> [a]
take 1 ([PackageCheck] -> [PackageCheck])
-> ([String] -> [PackageCheck]) -> [String] -> [PackageCheck]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe PackageCheck) -> [String] -> [PackageCheck]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe String -> Maybe PackageCheck
checkWindowsPath ([String] -> [PackageCheck]) -> [String] -> [PackageCheck]
forall a b. (a -> b) -> a -> b
$ [String]
files)
[PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ (Int -> [PackageCheck] -> [PackageCheck]
forall a. Int -> [a] -> [a]
take 1 ([PackageCheck] -> [PackageCheck])
-> ([String] -> [PackageCheck]) -> [String] -> [PackageCheck]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe PackageCheck) -> [String] -> [PackageCheck]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe String -> Maybe PackageCheck
checkTarPath ([String] -> [PackageCheck]) -> [String] -> [PackageCheck]
forall a b. (a -> b) -> a -> b
$ [String]
files)
checkWindowsPath :: FilePath -> Maybe PackageCheck
checkWindowsPath :: String -> Maybe PackageCheck
checkWindowsPath path :: String
path =
Bool -> PackageCheck -> Maybe PackageCheck
check (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
FilePath.Windows.isValid String
path') (PackageCheck -> Maybe PackageCheck)
-> PackageCheck -> Maybe PackageCheck
forall a b. (a -> b) -> a -> b
$
String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Unfortunately, the file " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
quote String
path String -> ShowS
forall a. [a] -> [a] -> [a]
++ " is not a valid file "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "name on Windows which would cause portability problems for this "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "package. Windows file names cannot contain any of the characters "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "\":*?<>|\" and there are a few reserved names including \"aux\", "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "\"nul\", \"con\", \"prn\", \"com1-9\", \"lpt1-9\" and \"clock$\"."
where
path' :: String
path' = ".\\" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path
checkTarPath :: FilePath -> Maybe PackageCheck
checkTarPath :: String -> Maybe PackageCheck
checkTarPath path :: String
path
| String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
path Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 255 = PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just PackageCheck
longPath
| Bool
otherwise = case Int -> [String] -> Either PackageCheck [String]
forall (t :: * -> *) a.
Foldable t =>
Int -> [t a] -> Either PackageCheck [t a]
pack Int
nameMax ([String] -> [String]
forall a. [a] -> [a]
reverse (String -> [String]
splitPath String
path)) of
Left err :: PackageCheck
err -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just PackageCheck
err
Right [] -> Maybe PackageCheck
forall a. Maybe a
Nothing
Right (h :: String
h:rest :: [String]
rest) -> case Int -> [String] -> Either PackageCheck [String]
forall (t :: * -> *) a.
Foldable t =>
Int -> [t a] -> Either PackageCheck [t a]
pack Int
prefixMax [String]
remainder of
Left err :: PackageCheck
err -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just PackageCheck
err
Right [] -> Maybe PackageCheck
forall a. Maybe a
Nothing
Right (_:_) -> PackageCheck -> Maybe PackageCheck
forall a. a -> Maybe a
Just PackageCheck
noSplit
where
remainder :: [String]
remainder = ShowS
forall a. [a] -> [a]
init String
h String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
rest
where
nameMax, prefixMax :: Int
nameMax :: Int
nameMax = 100
prefixMax :: Int
prefixMax = 155
pack :: Int -> [t a] -> Either PackageCheck [t a]
pack _ [] = PackageCheck -> Either PackageCheck [t a]
forall a b. a -> Either a b
Left PackageCheck
emptyName
pack maxLen :: Int
maxLen (c :: t a
c:cs :: [t a]
cs)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
maxLen = PackageCheck -> Either PackageCheck [t a]
forall a b. a -> Either a b
Left PackageCheck
longName
| Bool
otherwise = [t a] -> Either PackageCheck [t a]
forall a b. b -> Either a b
Right (Int -> Int -> [t a] -> [t a]
forall (t :: * -> *) a. Foldable t => Int -> Int -> [t a] -> [t a]
pack' Int
maxLen Int
n [t a]
cs)
where n :: Int
n = t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
c
pack' :: Int -> Int -> [t a] -> [t a]
pack' maxLen :: Int
maxLen n :: Int
n (c :: t a
c:cs :: [t a]
cs)
| Int
n' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxLen = Int -> Int -> [t a] -> [t a]
pack' Int
maxLen Int
n' [t a]
cs
where n' :: Int
n' = Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
c
pack' _ _ cs :: [t a]
cs = [t a]
cs
longPath :: PackageCheck
longPath = String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The following file name is too long to store in a portable POSIX "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "format tar archive. The maximum length is 255 ASCII characters.\n"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The file in question is:\n " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path
longName :: PackageCheck
longName = String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The following file name is too long to store in a portable POSIX "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "format tar archive. The maximum length for the name part (including "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "extension) is 100 ASCII characters. The maximum length for any "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "individual directory component is 155.\n"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "The file in question is:\n " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path
noSplit :: PackageCheck
noSplit = String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"The following file name is too long to store in a portable POSIX "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "format tar archive. While the total length is less than 255 ASCII "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "characters, there are unfortunately further restrictions. It has to "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "be possible to split the file path on a directory separator into "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "two parts such that the first part fits in 155 characters or less "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "and the second part fits in 100 characters or less. Basically you "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "have to make the file name or directory names shorter, or you could "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "split a long directory name into nested subdirectories with shorter "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "names.\nThe file in question is:\n " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
path
emptyName :: PackageCheck
emptyName = String -> PackageCheck
PackageDistInexcusable (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"Encountered a file with an empty name, something is very wrong! "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "Files with an empty name cannot be stored in a tar archive or in "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ "standard file systems."
checkPackageFilesPreDistribution :: Verbosity -> PackageDescription -> FilePath -> NoCallStackIO [PackageCheck]
checkPackageFilesPreDistribution :: Verbosity
-> PackageDescription -> String -> NoCallStackIO [PackageCheck]
checkPackageFilesPreDistribution = Verbosity
-> PackageDescription -> String -> NoCallStackIO [PackageCheck]
checkGlobFiles
checkGlobFiles :: Verbosity
-> PackageDescription
-> FilePath
-> NoCallStackIO [PackageCheck]
checkGlobFiles :: Verbosity
-> PackageDescription -> String -> NoCallStackIO [PackageCheck]
checkGlobFiles verbosity :: Verbosity
verbosity pkg :: PackageDescription
pkg root :: String
root =
([[PackageCheck]] -> [PackageCheck])
-> IO [[PackageCheck]] -> NoCallStackIO [PackageCheck]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [[PackageCheck]] -> [PackageCheck]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (IO [[PackageCheck]] -> NoCallStackIO [PackageCheck])
-> IO [[PackageCheck]] -> NoCallStackIO [PackageCheck]
forall a b. (a -> b) -> a -> b
$ [(String, String, String)]
-> ((String, String, String) -> NoCallStackIO [PackageCheck])
-> IO [[PackageCheck]]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for [(String, String, String)]
allGlobs (((String, String, String) -> NoCallStackIO [PackageCheck])
-> IO [[PackageCheck]])
-> ((String, String, String) -> NoCallStackIO [PackageCheck])
-> IO [[PackageCheck]]
forall a b. (a -> b) -> a -> b
$ \(field :: String
field, dir :: String
dir, glob :: String
glob) ->
case Version -> String -> Either GlobSyntaxError Glob
parseFileGlob (PackageDescription -> Version
specVersion PackageDescription
pkg) String
glob of
Left _ -> [PackageCheck] -> NoCallStackIO [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return []
Right parsedGlob :: Glob
parsedGlob -> do
[GlobResult String]
results <- Verbosity -> String -> Glob -> IO [GlobResult String]
runDirFileGlob Verbosity
verbosity (String
root String -> ShowS
</> String
dir) Glob
parsedGlob
let individualWarnings :: [PackageCheck]
individualWarnings = [GlobResult String]
results [GlobResult String]
-> (GlobResult String -> [PackageCheck]) -> [PackageCheck]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> String -> GlobResult String -> [PackageCheck]
getWarning String
field String
glob
noMatchesWarning :: [PackageCheck]
noMatchesWarning =
[ String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"In '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
field String -> ShowS
forall a. [a] -> [a] -> [a]
++ "': the pattern '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
glob String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' does not"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " match any files."
| (GlobResult String -> Bool) -> [GlobResult String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Bool -> Bool
not (Bool -> Bool)
-> (GlobResult String -> Bool) -> GlobResult String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GlobResult String -> Bool
forall a. GlobResult a -> Bool
suppressesNoMatchesWarning) [GlobResult String]
results
]
[PackageCheck] -> NoCallStackIO [PackageCheck]
forall (m :: * -> *) a. Monad m => a -> m a
return ([PackageCheck]
noMatchesWarning [PackageCheck] -> [PackageCheck] -> [PackageCheck]
forall a. [a] -> [a] -> [a]
++ [PackageCheck]
individualWarnings)
where
adjustedDataDir :: String
adjustedDataDir = if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PackageDescription -> String
dataDir PackageDescription
pkg) then "." else PackageDescription -> String
dataDir PackageDescription
pkg
allGlobs :: [(String, String, String)]
allGlobs = [[(String, String, String)]] -> [(String, String, String)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ (,,) "extra-source-files" "." (String -> (String, String, String))
-> [String] -> [(String, String, String)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageDescription -> [String]
extraSrcFiles PackageDescription
pkg
, (,,) "extra-doc-files" "." (String -> (String, String, String))
-> [String] -> [(String, String, String)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageDescription -> [String]
extraDocFiles PackageDescription
pkg
, (,,) "data-files" String
adjustedDataDir (String -> (String, String, String))
-> [String] -> [(String, String, String)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageDescription -> [String]
dataFiles PackageDescription
pkg
]
suppressesNoMatchesWarning :: GlobResult a -> Bool
suppressesNoMatchesWarning (GlobMatch _) = Bool
True
suppressesNoMatchesWarning (GlobWarnMultiDot _) = Bool
False
suppressesNoMatchesWarning (GlobMissingDirectory _) = Bool
True
getWarning :: String -> FilePath -> GlobResult FilePath -> [PackageCheck]
getWarning :: String -> String -> GlobResult String -> [PackageCheck]
getWarning _ _ (GlobMatch _) =
[]
getWarning field :: String
field glob :: String
glob (GlobWarnMultiDot file :: String
file) =
[ String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"In '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
field String -> ShowS
forall a. [a] -> [a] -> [a]
++ "': the pattern '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
glob String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' does not"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " match the file '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' because the extensions do not"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " exactly match (e.g., foo.en.html does not exactly match *.html)."
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " To enable looser suffix-only matching, set 'cabal-version: 2.4' or higher."
]
getWarning field :: String
field glob :: String
glob (GlobMissingDirectory dir :: String
dir) =
[ String -> PackageCheck
PackageDistSuspiciousWarn (String -> PackageCheck) -> String -> PackageCheck
forall a b. (a -> b) -> a -> b
$
"In '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
field String -> ShowS
forall a. [a] -> [a] -> [a]
++ "': the pattern '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
glob String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' attempts to"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " match files in the directory '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
dir String -> ShowS
forall a. [a] -> [a] -> [a]
++ "', but there is no"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ " directory by that name."
]
quote :: String -> String
quote :: ShowS
quote s :: String
s = "'" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'"
commaSep :: [String] -> String
commaSep :: [String] -> String
commaSep = String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate ", "
dups :: Ord a => [a] -> [a]
dups :: [a] -> [a]
dups xs :: [a]
xs = [ a
x | (x :: a
x:_:_) <- [a] -> [[a]]
forall a. Eq a => [a] -> [[a]]
group ([a] -> [a]
forall a. Ord a => [a] -> [a]
sort [a]
xs) ]
fileExtensionSupportedLanguage :: FilePath -> Bool
fileExtensionSupportedLanguage :: String -> Bool
fileExtensionSupportedLanguage path :: String
path =
Bool
isHaskell Bool -> Bool -> Bool
|| Bool
isC
where
extension :: String
extension = ShowS
takeExtension String
path
isHaskell :: Bool
isHaskell = String
extension String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [".hs", ".lhs"]
isC :: Bool
isC = Maybe (CDialect, Bool) -> Bool
forall a. Maybe a -> Bool
isJust (String -> Maybe (CDialect, Bool)
filenameCDialect String
extension)