blob: f0087f300436641a0aff6834094e93c64e6c8fa2 [file] [log] [blame]
Paul Vinciguerra464e5e02019-11-01 15:07:32 -04001#!/usr/bin/env python3
Chris Luke90f52bf2016-09-12 08:55:13 -04002# Copyright (c) 2016 Comcast Cable Communications Management, LLC.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at:
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16# Looks for preprocessor macros with struct initializers and siphons them
17# off into another file for later parsing; ostensibly to generate
18# documentation from struct initializer data.
19
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040020import argparse
21import logging
22import os
23
Chris Luke90f52bf2016-09-12 08:55:13 -040024import siphon
25
26DEFAULT_LOGFILE = None
Nathan Skrzypczak1e167a42022-03-25 12:06:51 +010027DEFAULT_LOGLEVEL = "warning"
Chris Luke90f52bf2016-09-12 08:55:13 -040028DEFAULT_OUTPUT = "build-root/docs/siphons"
29DEFAULT_PREFIX = os.getcwd()
30
31ap = argparse.ArgumentParser()
32ap.add_argument("--log-file", default=DEFAULT_LOGFILE,
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040033 help="Log file [%s]" % DEFAULT_LOGFILE)
Chris Luke90f52bf2016-09-12 08:55:13 -040034ap.add_argument("--log-level", default=DEFAULT_LOGLEVEL,
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040035 choices=["debug", "info", "warning", "error", "critical"],
36 help="Logging level [%s]" % DEFAULT_LOGLEVEL)
Chris Luke90f52bf2016-09-12 08:55:13 -040037
38ap.add_argument("--output", '-o', metavar="directory", default=DEFAULT_OUTPUT,
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040039 help="Output directory for .siphon files [%s]" %
40 DEFAULT_OUTPUT)
Chris Luke90f52bf2016-09-12 08:55:13 -040041ap.add_argument("--input-prefix", metavar="path", default=DEFAULT_PREFIX,
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040042 help="Prefix to strip from input pathnames [%s]" %
43 DEFAULT_PREFIX)
Chris Luke90f52bf2016-09-12 08:55:13 -040044ap.add_argument("input", nargs='+', metavar="input_file",
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040045 help="Input C source files")
Chris Luke90f52bf2016-09-12 08:55:13 -040046args = ap.parse_args()
47
48logging.basicConfig(filename=args.log_file,
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040049 level=getattr(logging, args.log_level.upper(), None))
Chris Luke90f52bf2016-09-12 08:55:13 -040050log = logging.getLogger("siphon_generate")
51
52
53generate = siphon.generate.Generate(output_directory=args.output,
Paul Vinciguerra464e5e02019-11-01 15:07:32 -040054 input_prefix=args.input_prefix)
Chris Luke90f52bf2016-09-12 08:55:13 -040055
56# Pre-process file names in case they indicate a file with
57# a list of files
58files = []
59for filename in args.input:
60 if filename.startswith('@'):
61 with open(filename[1:], 'r') as fp:
62 lines = fp.readlines()
63 for line in lines:
64 file = line.strip()
65 if file not in files:
66 files.append(file)
67 lines = None
68 else:
69 if filename not in files:
70 files.append(filename)
71
72# Iterate all the input files we've been given
73for filename in files:
74 generate.parse(filename)
75
76# Write the extracted data
77generate.deliver()
78
79# All done