(root)/
gcc-13.2.0/
contrib/
check-params-in-docs.py
       1  #!/usr/bin/env python3
       2  
       3  # Copyright (C) 2018-2023 Free Software Foundation, Inc.
       4  #
       5  # Find missing and extra parameters in documentation compared to
       6  # output of: gcc --help=params.
       7  #
       8  # This file is part of GCC.
       9  #
      10  # GCC is free software; you can redistribute it and/or modify it under
      11  # the terms of the GNU General Public License as published by the Free
      12  # Software Foundation; either version 3, or (at your option) any later
      13  # version.
      14  #
      15  # GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      16  # WARRANTY; without even the implied warranty of MERCHANTABILITY or
      17  # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      18  # for more details.
      19  #
      20  # You should have received a copy of the GNU General Public License
      21  # along with GCC; see the file COPYING3.  If not see
      22  # <http://www.gnu.org/licenses/>.  */
      23  #
      24  #
      25  #
      26  
      27  import argparse
      28  import sys
      29  from itertools import dropwhile, takewhile
      30  
      31  
      32  def get_param_tuple(line):
      33      line = line.strip().replace('--param=', '')
      34      i = line.find(' ')
      35      name = line[:i]
      36      if '=' in name:
      37          name = name[:name.find('=')]
      38      description = line[i:].strip()
      39      return (name, description)
      40  
      41  
      42  parser = argparse.ArgumentParser()
      43  parser.add_argument('texi_file')
      44  parser.add_argument('params_output')
      45  
      46  args = parser.parse_args()
      47  
      48  ignored = {'logical-op-non-short-circuit'}
      49  params = {}
      50  
      51  for line in open(args.params_output).readlines():
      52      if line.startswith(' ' * 2) and not line.startswith(' ' * 8):
      53          r = get_param_tuple(line)
      54          params[r[0]] = r[1]
      55  
      56  # Find section in .texi manual with parameters
      57  texi = ([x.strip() for x in open(args.texi_file).readlines()])
      58  texi = dropwhile(lambda x: 'item --param' not in x, texi)
      59  texi = takewhile(lambda x: '@node Instrumentation Options' not in x, texi)
      60  texi = list(texi)[1:]
      61  
      62  texi_params = []
      63  for line in texi:
      64      for token in ('@item ', '@itemx '):
      65          if line.startswith(token):
      66              texi_params.append(line[len(token):])
      67              break
      68  
      69  # skip digits
      70  texi_params = [x for x in texi_params if not x[0].isdigit()]
      71  # skip aarch64 params
      72  texi_params = [x for x in texi_params if not x.startswith('aarch64')]
      73  sorted_params = sorted(texi_params)
      74  
      75  texi_set = set(texi_params) - ignored
      76  params_set = set(params.keys()) - ignored
      77  
      78  success = True
      79  extra = texi_set - params_set
      80  if len(extra):
      81      print('Extra:')
      82      print(extra)
      83      success = False
      84  
      85  missing = params_set - texi_set
      86  if len(missing):
      87      print('Missing:')
      88      for m in missing:
      89          print('@item ' + m)
      90          print(params[m])
      91          print()
      92      success = False
      93  
      94  sys.exit(0 if success else 1)