summaryrefslogtreecommitdiff
path: root/hadrian/src
diff options
context:
space:
mode:
authorHécate <hecate+gitlab@glitchbra.in>2020-07-06 01:32:15 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-07-18 07:26:43 -0400
commite6cf27dfded59fe42bd6be323573c0d576e6204a (patch)
treecac89a332670a602871071e1983d3275320e4ce2 /hadrian/src
parent6ba6a881c58459008f02fb4816f8dec2800c2b73 (diff)
downloadhaskell-e6cf27dfded59fe42bd6be323573c0d576e6204a.tar.gz
Add a Lint hadrian rule and an .hlint.yaml file in base/
Diffstat (limited to 'hadrian/src')
-rw-r--r--hadrian/src/Hadrian/Utilities.hs18
-rw-r--r--hadrian/src/Main.hs2
-rw-r--r--hadrian/src/Rules/Lint.hs45
3 files changed, 65 insertions, 0 deletions
diff --git a/hadrian/src/Hadrian/Utilities.hs b/hadrian/src/Hadrian/Utilities.hs
index 4768780d37..8bcfa6f974 100644
--- a/hadrian/src/Hadrian/Utilities.hs
+++ b/hadrian/src/Hadrian/Utilities.hs
@@ -24,6 +24,7 @@ module Hadrian.Utilities (
Colour (..), ANSIColour (..), putColoured, shouldUseColor,
BuildProgressColour, mkBuildProgressColour, putBuild,
SuccessColour, mkSuccessColour, putSuccess,
+ FailureColour, mkFailureColour, putFailure,
ProgressInfo (..), putProgressInfo,
renderAction, renderActionNoOutput, renderProgram, renderLibrary, renderBox, renderUnicorn,
@@ -470,6 +471,23 @@ putSuccess msg = do
SuccessColour code <- userSetting green
putColoured code msg
+newtype FailureColour = FailureColour String
+ deriving Typeable
+
+-- | Generate an encoded colour for failure output messages
+mkFailureColour :: Colour -> FailureColour
+mkFailureColour c = FailureColour $ mkColour c
+
+-- | Default 'FailureColour'.
+red :: FailureColour
+red = mkFailureColour (Dull Red)
+
+-- | Print a failure message (e.g. a precondition was not met).
+putFailure :: String -> Action ()
+putFailure msg = do
+ FailureColour code <- userSetting red
+ putColoured code msg
+
data ProgressInfo = None | Brief | Normal | Unicorn deriving (Eq, Show, Typeable)
-- | Version of 'putBuild' controlled by @--progress-info@ command line argument.
diff --git a/hadrian/src/Main.hs b/hadrian/src/Main.hs
index bc04c707d8..e6bf015c0a 100644
--- a/hadrian/src/Main.hs
+++ b/hadrian/src/Main.hs
@@ -11,6 +11,7 @@ import qualified CommandLine
import qualified Environment
import qualified Rules
import qualified Rules.Clean
+import qualified Rules.Lint
import qualified Rules.Documentation
import qualified Rules.Nofib
import qualified Rules.SourceDist
@@ -84,6 +85,7 @@ main = do
Rules.buildRules
Rules.Documentation.documentationRules
Rules.Clean.cleanRules
+ Rules.Lint.lintRules
Rules.Nofib.nofibRules
Rules.oracleRules
Rules.Selftest.selftestRules
diff --git a/hadrian/src/Rules/Lint.hs b/hadrian/src/Rules/Lint.hs
new file mode 100644
index 0000000000..bbecc08c31
--- /dev/null
+++ b/hadrian/src/Rules/Lint.hs
@@ -0,0 +1,45 @@
+module Rules.Lint
+ ( lintRules
+ ) where
+
+import Base
+import Settings.Builders.Common
+import System.Directory (findExecutable)
+
+lintRules :: Rules ()
+lintRules = "lint" ~> lint
+
+lint :: Action ()
+lint = do
+ isHlintPresent <- isJust <$> (liftIO $ findExecutable "hlint")
+ if isHlintPresent
+ then do
+ putBuild "| Running the linter…"
+ lintBase
+ putSuccess "| Done."
+ else
+ putFailure "| Please make sure you have the `hlint` executable in your $PATH"
+
+lintBase :: Action ()
+lintBase = do
+ topDir <- topDirectory
+ buildDir <- buildRoot
+ let stage1Lib = topDir </> buildDir </> "stage1/lib"
+ let machDeps = topDir </> "includes/MachDeps.h"
+ let hsBaseConfig = topDir </> buildDir </> "stage1/libraries/base/build/include/HsBaseConfig.h"
+ let ghcautoconf = stage1Lib </> "ghcautoconf.h"
+ let ghcplatform = stage1Lib </> "ghcplatform.h"
+ need [ghcautoconf, ghcplatform, machDeps, hsBaseConfig]
+ let include0 = topDir </> "includes"
+ let include1 = topDir </> "libraries/base/include"
+ let include2 = stage1Lib
+ let include3 = topDir </> buildDir </> "stage1/libraries/base/build/include"
+ let hlintYaml = topDir </> "libraries/base/.hlint.yaml"
+ hostArch <- (<> "_HOST_ARCH") <$> setting HostArch
+ let cmdLine = "hlint -j --cpp-define " <> hostArch <> " --cpp-include=" <> include0 <>
+ " --cpp-include=" <> include1 <>
+ " --cpp-include=" <> include2 <>
+ " --cpp-include=" <> include3 <>
+ " -h " <> hlintYaml <> " libraries/base"
+ putBuild $ "| " <> cmdLine
+ cmd_ cmdLine