Skip to content
Snippets Groups Projects
Commit cd4990ca authored by Ben Gamari's avatar Ben Gamari
Browse files

Drop compare-flags

parent 0fd7e009
No related branches found
No related tags found
2 merge requests!4786Draft: backtrace dump for all capability armed threads on SIGQUIT (superseded by !4787),!2917Backport CI rework
Pipeline #16884 failed
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Linter to verify that all flags reported by GHC's --show-options mode
are documented in the user's guide.
"""
import sys
import subprocess
from typing import Set
from pathlib import Path
# A list of known-undocumented flags. This should be considered to be a to-do
# list of flags that need to be documented.
EXPECTED_UNDOCUMENTED_PATH = \
Path(__file__).parent / 'expected-undocumented-flags.txt'
EXPECTED_UNDOCUMENTED = \
{line for line in open(EXPECTED_UNDOCUMENTED_PATH).read().split()}
def expected_undocumented(flag: str) -> bool:
if flag in EXPECTED_UNDOCUMENTED:
return True
if flag.startswith('-Werror'):
return True
if flag.startswith('-Wno-') \
or flag.startswith('-dno') \
or flag.startswith('-fno') \
or flag.startswith('-XNo'):
return True
if flag.startswith('-Wwarn=') \
or flag.startswith('-Wno-warn='):
return True
return False
def read_documented_flags(doc_flags) -> Set[str]:
# Map characters that mark the end of a flag
# to whitespace.
trans = str.maketrans({
'=': ' ',
'[': ' ',
'': ' ',
})
return {line.translate(trans).split()[0]
for line in doc_flags.read().split('\n')
if line != ''}
def read_ghc_flags(ghc_path: str) -> Set[str]:
ghc_output = subprocess.check_output([ghc_path, '--show-options'])
return {flag
for flag in ghc_output.decode('UTF-8').split('\n')
if not expected_undocumented(flag)
if flag != ''}
def error(s: str):
print(s, file=sys.stderr)
def main() -> None:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--ghc', type=argparse.FileType('r'),
help='path of GHC executable')
parser.add_argument('--doc-flags', type=argparse.FileType('r'),
help='path of ghc-flags.txt output from Sphinx')
args = parser.parse_args()
doc_flags = read_documented_flags(args.doc_flags)
ghc_flags = read_ghc_flags(args.ghc.name)
failed = False
undocumented = ghc_flags - doc_flags
if len(undocumented) > 0:
error('Found {len_undoc} flags not documented in the users guide:'.format(len_undoc=len(undocumented)), )
error('\n'.join(' {}'.format(flag) for flag in sorted(undocumented)))
error('')
failed = True
now_documented = EXPECTED_UNDOCUMENTED.intersection(doc_flags)
if len(now_documented) > 0:
error('Found flags that are documented yet listed in {}:'.format(EXPECTED_UNDOCUMENTED_PATH))
error('\n'.join(' {}'.format(flag) for flag in sorted(now_documented)))
error('')
failed = True
if failed:
sys.exit(1)
if __name__ == '__main__':
main()
...@@ -16,7 +16,6 @@ import Context ...@@ -16,7 +16,6 @@ import Context
import Expression (getContextData, interpretInContext, (?), package) import Expression (getContextData, interpretInContext, (?), package)
import Flavour import Flavour
import Oracles.ModuleFiles import Oracles.ModuleFiles
import Oracles.Setting (topDirectory)
import Packages import Packages
import Settings import Settings
import Target import Target
...@@ -111,11 +110,6 @@ documentationRules = do ...@@ -111,11 +110,6 @@ documentationRules = do
need $ map (root -/-) targets need $ map (root -/-) targets
when (SphinxPDFs `Set.member` doctargets)
$ checkUserGuideFlags $ pdfRoot -/- "users_guide" -/- "ghc-flags.txt"
when (SphinxHTML `Set.member` doctargets)
$ checkUserGuideFlags $ root -/- htmlRoot -/- "users_guide" -/- "ghc-flags.txt"
where archiveTarget "libraries" = Haddocks where archiveTarget "libraries" = Haddocks
archiveTarget _ = SphinxHTML archiveTarget _ = SphinxHTML
...@@ -129,17 +123,6 @@ checkSphinxWarnings out = do ...@@ -129,17 +123,6 @@ checkSphinxWarnings out = do
when ("reference target not found" `isInfixOf` log) when ("reference target not found" `isInfixOf` log)
$ fail "Undefined reference targets found in Sphinx log." $ fail "Undefined reference targets found in Sphinx log."
-- | Check that all GHC flags are documented in the users guide.
checkUserGuideFlags :: FilePath -> Action ()
checkUserGuideFlags documentedFlagList = do
scriptPath <- (</> "docs/users_guide/compare-flags.py") <$> topDirectory
ghcPath <- (</>) <$> topDirectory <*> programPath (vanillaContext Stage1 ghc)
runBuilder Python
[ scriptPath
, "--doc-flags", documentedFlagList
, "--ghc", ghcPath
] [documentedFlagList] []
------------------------------------- HTML ------------------------------------- ------------------------------------- HTML -------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment