diff options
author | Hécate <hecate+gitlab@glitchbra.in> | 2020-07-06 01:32:15 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-07-18 07:26:43 -0400 |
commit | e6cf27dfded59fe42bd6be323573c0d576e6204a (patch) | |
tree | cac89a332670a602871071e1983d3275320e4ce2 /hadrian/src | |
parent | 6ba6a881c58459008f02fb4816f8dec2800c2b73 (diff) | |
download | haskell-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.hs | 18 | ||||
-rw-r--r-- | hadrian/src/Main.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Rules/Lint.hs | 45 |
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 |