mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-01-09 22:15:31 +00:00
Improve documentation in generate_test_code.py
This commit is contained in:
parent
b98e6eec58
commit
e3b26af7c0
|
@ -194,7 +194,7 @@ $(C_FILES): %.c: suites/$$(func.$$*).function suites/%.data scripts/generate_tes
|
||||||
-t suites/main_test.function \
|
-t suites/main_test.function \
|
||||||
-p suites/host_test.function \
|
-p suites/host_test.function \
|
||||||
-s suites \
|
-s suites \
|
||||||
--help-file suites/helpers.function \
|
--helpers-file suites/helpers.function \
|
||||||
-o .
|
-o .
|
||||||
|
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ $(EMBEDDED_TESTS): embedded_%: suites/$$(func.$$*).function suites/%.data script
|
||||||
-t suites/main_test.function \
|
-t suites/main_test.function \
|
||||||
-p suites/target_test.function \
|
-p suites/target_test.function \
|
||||||
-s suites \
|
-s suites \
|
||||||
--help-file suites/helpers.function \
|
--helpers-file suites/helpers.function \
|
||||||
-o ./TESTS/mbedtls/$*
|
-o ./TESTS/mbedtls/$*
|
||||||
|
|
||||||
generate-target-tests: $(EMBEDDED_TESTS)
|
generate-target-tests: $(EMBEDDED_TESTS)
|
||||||
|
|
|
@ -19,22 +19,18 @@
|
||||||
# This file is part of mbed TLS (https://tls.mbed.org)
|
# This file is part of mbed TLS (https://tls.mbed.org)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Test Suite code generator.
|
This script dynamically generates test suite code for Mbed TLS, by
|
||||||
|
taking following input files.
|
||||||
|
|
||||||
Generates a test source file using following input files:
|
test_suite_xyz.function - Test suite functions file contains test
|
||||||
|
functions.
|
||||||
test_suite_xyz.function - Read test functions from test suite
|
test_suite_xyz.data - Contains test case vectors.
|
||||||
functions file.
|
|
||||||
test_suite_xyz.data - Read test functions and their
|
|
||||||
dependencies to generate dispatch and
|
|
||||||
dependency check code.
|
|
||||||
main_test.function - Template to substitute generated test
|
main_test.function - Template to substitute generated test
|
||||||
function dispatch code, dependency
|
functions, dispatch code, dependency
|
||||||
checking code.
|
checking code etc.
|
||||||
platform .function - Read host or target platform
|
platform .function - Platform specific initialization and
|
||||||
implementation for dispatching test
|
platform code.
|
||||||
cases from .data file.
|
helpers.function - Common/reusable data and functions.
|
||||||
helpers.function - Read common reusable functions.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,7 +39,6 @@ import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import argparse
|
import argparse
|
||||||
import shutil
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN_HEADER_REGEX = '/\*\s*BEGIN_HEADER\s*\*/'
|
BEGIN_HEADER_REGEX = '/\*\s*BEGIN_HEADER\s*\*/'
|
||||||
|
@ -59,39 +54,39 @@ BEGIN_CASE_REGEX = '/\*\s*BEGIN_CASE\s*(.*?)\s*\*/'
|
||||||
END_CASE_REGEX = '/\*\s*END_CASE\s*\*/'
|
END_CASE_REGEX = '/\*\s*END_CASE\s*\*/'
|
||||||
|
|
||||||
|
|
||||||
class InvalidFileFormat(Exception):
|
|
||||||
"""
|
|
||||||
Exception to indicate invalid file format.
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class GeneratorInputError(Exception):
|
class GeneratorInputError(Exception):
|
||||||
"""
|
"""
|
||||||
Exception to indicate error in the input to the generator.
|
Exception to indicate error in the input files to this script.
|
||||||
|
This includes missing patterns, test function names and other
|
||||||
|
parsing errors.
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class FileWrapper(io.FileIO):
|
class FileWrapper(io.FileIO):
|
||||||
"""
|
"""
|
||||||
File wrapper class. Provides reading with line no. tracking.
|
This class extends built-in io.FileIO class with attribute line_no,
|
||||||
|
that indicates line number for the line that is read.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, file_name):
|
def __init__(self, file_name):
|
||||||
"""
|
"""
|
||||||
Init file handle.
|
Instantiate the base class and initialize the line number to 0.
|
||||||
|
|
||||||
:param file_name: File path to open.
|
:param file_name: File path to open.
|
||||||
"""
|
"""
|
||||||
super(FileWrapper, self).__init__(file_name, 'r')
|
super(FileWrapper, self).__init__(file_name, 'r')
|
||||||
self.line_no = 0
|
self.line_no = 0
|
||||||
|
|
||||||
# Override the generator function in a way that works in both
|
|
||||||
# Python 2 and Python 3.
|
|
||||||
def __next__(self):
|
def __next__(self):
|
||||||
"""
|
"""
|
||||||
Iterator return impl.
|
Python 2 iterator method. This method overrides base class's
|
||||||
|
next method and extends the next method to count the line
|
||||||
|
numbers as each line is read.
|
||||||
|
|
||||||
|
It works for both Python 2 and Python 3 by checking iterator
|
||||||
|
method name in the base iterator object.
|
||||||
|
|
||||||
:return: Line read from file.
|
:return: Line read from file.
|
||||||
"""
|
"""
|
||||||
parent = super(FileWrapper, self)
|
parent = super(FileWrapper, self)
|
||||||
|
@ -105,6 +100,8 @@ class FileWrapper(io.FileIO):
|
||||||
# strip any whitespaces added in the decoding process.
|
# strip any whitespaces added in the decoding process.
|
||||||
return line.decode(sys.getdefaultencoding()).strip() + "\n"
|
return line.decode(sys.getdefaultencoding()).strip() + "\n"
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# Python 3 iterator method
|
||||||
next = __next__
|
next = __next__
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,15 +110,22 @@ def split_dep(dep):
|
||||||
Split NOT character '!' from dependency. Used by gen_deps()
|
Split NOT character '!' from dependency. Used by gen_deps()
|
||||||
|
|
||||||
:param dep: Dependency list
|
:param dep: Dependency list
|
||||||
:return: list of tuples where index 0 has '!' if there was a '!'
|
:return: string tuple. Ex: ('!', MACRO) for !MACRO and ('', MACRO) for
|
||||||
before the dependency string
|
MACRO.
|
||||||
"""
|
"""
|
||||||
return ('!', dep[1:]) if dep[0] == '!' else ('', dep)
|
return ('!', dep[1:]) if dep[0] == '!' else ('', dep)
|
||||||
|
|
||||||
|
|
||||||
def gen_deps(deps):
|
def gen_deps(deps):
|
||||||
"""
|
"""
|
||||||
Generates dependency i.e. if def and endif code
|
Test suite data and functions specifies compile time dependencies.
|
||||||
|
This function generates C preprocessor code from the input
|
||||||
|
dependency list. Caller uses the generated preprocessor code to
|
||||||
|
wrap dependent code.
|
||||||
|
A dependency in the input list can have a leading '!' character
|
||||||
|
to negate a condition. '!' is separated from the dependency using
|
||||||
|
function split_dep() and proper preprocessor check is generated
|
||||||
|
accordingly.
|
||||||
|
|
||||||
:param deps: List of dependencies.
|
:param deps: List of dependencies.
|
||||||
:return: if defined and endif code with macro annotations for
|
:return: if defined and endif code with macro annotations for
|
||||||
|
@ -135,8 +139,8 @@ def gen_deps(deps):
|
||||||
|
|
||||||
def gen_deps_one_line(deps):
|
def gen_deps_one_line(deps):
|
||||||
"""
|
"""
|
||||||
Generates dependency checks in one line. Useful for writing code
|
Similar to gen_deps() but generates dependency checks in one line.
|
||||||
in #else case.
|
Useful for generating code with #else block.
|
||||||
|
|
||||||
:param deps: List of dependencies.
|
:param deps: List of dependencies.
|
||||||
:return: ifdef code
|
:return: ifdef code
|
||||||
|
@ -173,7 +177,12 @@ void {name}_wrapper( void ** params )
|
||||||
|
|
||||||
def gen_dispatch(name, deps):
|
def gen_dispatch(name, deps):
|
||||||
"""
|
"""
|
||||||
Generates dispatch code for the test function table.
|
Test suite code template main_test.function defines a C function
|
||||||
|
array to contain test case functions. This function generates an
|
||||||
|
initializer entry for a function in that array. The entry is
|
||||||
|
composed of a compile time check for the test function
|
||||||
|
dependencies. At compile time the test function is assigned when
|
||||||
|
dependencies are met, else NULL is assigned.
|
||||||
|
|
||||||
:param name: Test function name
|
:param name: Test function name
|
||||||
:param deps: List of dependencies
|
:param deps: List of dependencies
|
||||||
|
@ -198,11 +207,12 @@ def gen_dispatch(name, deps):
|
||||||
|
|
||||||
def parse_until_pattern(funcs_f, end_regex):
|
def parse_until_pattern(funcs_f, end_regex):
|
||||||
"""
|
"""
|
||||||
Parses function headers or helper code until end pattern.
|
Matches pattern end_regex to the lines read from the file object.
|
||||||
|
Returns the lines read until end pattern is matched.
|
||||||
|
|
||||||
:param funcs_f: file object for .functions file
|
:param funcs_f: file object for .functions file
|
||||||
:param end_regex: Pattern to stop parsing
|
:param end_regex: Pattern to stop parsing
|
||||||
:return: Test suite headers code
|
:return: Lines read before the end pattern
|
||||||
"""
|
"""
|
||||||
headers = '#line %d "%s"\n' % (funcs_f.line_no + 1, funcs_f.name)
|
headers = '#line %d "%s"\n' % (funcs_f.line_no + 1, funcs_f.name)
|
||||||
for line in funcs_f:
|
for line in funcs_f:
|
||||||
|
@ -210,7 +220,7 @@ def parse_until_pattern(funcs_f, end_regex):
|
||||||
break
|
break
|
||||||
headers += line
|
headers += line
|
||||||
else:
|
else:
|
||||||
raise InvalidFileFormat("file: %s - end pattern [%s] not found!" %
|
raise GeneratorInputError("file: %s - end pattern [%s] not found!" %
|
||||||
(funcs_f.name, end_regex))
|
(funcs_f.name, end_regex))
|
||||||
|
|
||||||
return headers
|
return headers
|
||||||
|
@ -218,7 +228,10 @@ def parse_until_pattern(funcs_f, end_regex):
|
||||||
|
|
||||||
def parse_suite_deps(funcs_f):
|
def parse_suite_deps(funcs_f):
|
||||||
"""
|
"""
|
||||||
Parses test suite dependencies.
|
Parses test suite dependencies specified at the top of a
|
||||||
|
.function file, that starts with pattern BEGIN_DEPENDENCIES
|
||||||
|
and end with END_DEPENDENCIES. Dependencies are specified
|
||||||
|
after pattern 'depends_on:' and are delimited by ':'.
|
||||||
|
|
||||||
:param funcs_f: file object for .functions file
|
:param funcs_f: file object for .functions file
|
||||||
:return: List of test suite dependencies.
|
:return: List of test suite dependencies.
|
||||||
|
@ -231,7 +244,7 @@ def parse_suite_deps(funcs_f):
|
||||||
if re.search(END_DEP_REGEX, line):
|
if re.search(END_DEP_REGEX, line):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise InvalidFileFormat("file: %s - end dependency pattern [%s]"
|
raise GeneratorInputError("file: %s - end dependency pattern [%s]"
|
||||||
" not found!" % (funcs_f.name, END_DEP_REGEX))
|
" not found!" % (funcs_f.name, END_DEP_REGEX))
|
||||||
|
|
||||||
return deps
|
return deps
|
||||||
|
@ -239,7 +252,9 @@ def parse_suite_deps(funcs_f):
|
||||||
|
|
||||||
def parse_function_deps(line):
|
def parse_function_deps(line):
|
||||||
"""
|
"""
|
||||||
Parses function dependencies.
|
Parses function dependencies, that are in the same line as
|
||||||
|
comment BEGIN_CASE. Dependencies are specified after pattern
|
||||||
|
'depends_on:' and are delimited by ':'.
|
||||||
|
|
||||||
:param line: Line from .functions file that has dependencies.
|
:param line: Line from .functions file that has dependencies.
|
||||||
:return: List of dependencies.
|
:return: List of dependencies.
|
||||||
|
@ -256,7 +271,9 @@ def parse_function_deps(line):
|
||||||
|
|
||||||
def parse_function_signature(line):
|
def parse_function_signature(line):
|
||||||
"""
|
"""
|
||||||
Parsing function signature
|
Parses test function signature for validation and generates
|
||||||
|
a dispatch wrapper function that translates input test vectors
|
||||||
|
read from the data file into test function arguments.
|
||||||
|
|
||||||
:param line: Line from .functions file that has a function
|
:param line: Line from .functions file that has a function
|
||||||
signature.
|
signature.
|
||||||
|
@ -266,6 +283,7 @@ def parse_function_signature(line):
|
||||||
args = []
|
args = []
|
||||||
locals = ''
|
locals = ''
|
||||||
args_dispatch = []
|
args_dispatch = []
|
||||||
|
# Check if the test function returns void.
|
||||||
m = re.search('\s*void\s+(\w+)\s*\(', line, re.I)
|
m = re.search('\s*void\s+(\w+)\s*\(', line, re.I)
|
||||||
if not m:
|
if not m:
|
||||||
raise ValueError("Test function should return 'void'\n%s" % line)
|
raise ValueError("Test function should return 'void'\n%s" % line)
|
||||||
|
@ -326,7 +344,7 @@ def parse_function_code(funcs_f, deps, suite_deps):
|
||||||
name = 'test_' + name
|
name = 'test_' + name
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise InvalidFileFormat("file: %s - Test functions not found!" %
|
raise GeneratorInputError("file: %s - Test functions not found!" %
|
||||||
funcs_f.name)
|
funcs_f.name)
|
||||||
|
|
||||||
for line in funcs_f:
|
for line in funcs_f:
|
||||||
|
@ -334,7 +352,7 @@ def parse_function_code(funcs_f, deps, suite_deps):
|
||||||
break
|
break
|
||||||
code += line
|
code += line
|
||||||
else:
|
else:
|
||||||
raise InvalidFileFormat("file: %s - end case pattern [%s] not "
|
raise GeneratorInputError("file: %s - end case pattern [%s] not "
|
||||||
"found!" % (funcs_f.name, END_CASE_REGEX))
|
"found!" % (funcs_f.name, END_CASE_REGEX))
|
||||||
|
|
||||||
# Add exit label if not present
|
# Add exit label if not present
|
||||||
|
@ -353,7 +371,8 @@ def parse_function_code(funcs_f, deps, suite_deps):
|
||||||
|
|
||||||
def parse_functions(funcs_f):
|
def parse_functions(funcs_f):
|
||||||
"""
|
"""
|
||||||
Returns functions code pieces
|
Parses a test_suite_xxx.function file and returns information
|
||||||
|
for generating a C source file for the test suite.
|
||||||
|
|
||||||
:param funcs_f: file object of the functions file.
|
:param funcs_f: file object of the functions file.
|
||||||
:return: List of test suite dependencies, test function dispatch
|
:return: List of test suite dependencies, test function dispatch
|
||||||
|
@ -427,7 +446,13 @@ def escaped_split(str, ch):
|
||||||
|
|
||||||
def parse_test_data(data_f, debug=False):
|
def parse_test_data(data_f, debug=False):
|
||||||
"""
|
"""
|
||||||
Parses .data file
|
Parses .data file for each test case name, test function name,
|
||||||
|
test dependencies and test arguments. This information is
|
||||||
|
correlated with the test functions file for generating an
|
||||||
|
intermediate data file replacing the strings for test function
|
||||||
|
names, dependencies and integer constant expressions with
|
||||||
|
identifiers. Mainly for optimising space for on-target
|
||||||
|
execution.
|
||||||
|
|
||||||
:param data_f: file object of the data file.
|
:param data_f: file object of the data file.
|
||||||
:return: Generator that yields test name, function name,
|
:return: Generator that yields test name, function name,
|
||||||
|
@ -478,7 +503,8 @@ def parse_test_data(data_f, debug=False):
|
||||||
|
|
||||||
def gen_dep_check(dep_id, dep):
|
def gen_dep_check(dep_id, dep):
|
||||||
"""
|
"""
|
||||||
Generate code for the dependency.
|
Generate code for checking dependency with the associated
|
||||||
|
identifier.
|
||||||
|
|
||||||
:param dep_id: Dependency identifier
|
:param dep_id: Dependency identifier
|
||||||
:param dep: Dependency macro
|
:param dep: Dependency macro
|
||||||
|
@ -505,7 +531,8 @@ def gen_dep_check(dep_id, dep):
|
||||||
|
|
||||||
def gen_expression_check(exp_id, exp):
|
def gen_expression_check(exp_id, exp):
|
||||||
"""
|
"""
|
||||||
Generates code for expression check
|
Generates code for evaluating an integer expression using
|
||||||
|
associated expression Id.
|
||||||
|
|
||||||
:param exp_id: Expression Identifier
|
:param exp_id: Expression Identifier
|
||||||
:param exp: Expression/Macro
|
:param exp: Expression/Macro
|
||||||
|
@ -527,8 +554,9 @@ def gen_expression_check(exp_id, exp):
|
||||||
|
|
||||||
def write_deps(out_data_f, test_deps, unique_deps):
|
def write_deps(out_data_f, test_deps, unique_deps):
|
||||||
"""
|
"""
|
||||||
Write dependencies to intermediate test data file.
|
Write dependencies to intermediate test data file, replacing
|
||||||
It also returns dependency check code.
|
the string form with identifiers. Also, generates dependency
|
||||||
|
check code.
|
||||||
|
|
||||||
:param out_data_f: Output intermediate data file
|
:param out_data_f: Output intermediate data file
|
||||||
:param test_deps: Dependencies
|
:param test_deps: Dependencies
|
||||||
|
@ -553,8 +581,9 @@ def write_deps(out_data_f, test_deps, unique_deps):
|
||||||
|
|
||||||
def write_parameters(out_data_f, test_args, func_args, unique_expressions):
|
def write_parameters(out_data_f, test_args, func_args, unique_expressions):
|
||||||
"""
|
"""
|
||||||
Writes test parameters to the intermediate data file.
|
Writes test parameters to the intermediate data file, replacing
|
||||||
Also generates expression code.
|
the string form with identifiers. Also, generates expression
|
||||||
|
check code.
|
||||||
|
|
||||||
:param out_data_f: Output intermediate data file
|
:param out_data_f: Output intermediate data file
|
||||||
:param test_args: Test parameters
|
:param test_args: Test parameters
|
||||||
|
@ -588,7 +617,7 @@ def write_parameters(out_data_f, test_args, func_args, unique_expressions):
|
||||||
|
|
||||||
def gen_suite_deps_checks(suite_deps, dep_check_code, expression_code):
|
def gen_suite_deps_checks(suite_deps, dep_check_code, expression_code):
|
||||||
"""
|
"""
|
||||||
Adds preprocessor checks for test suite dependencies.
|
Generates preprocessor checks for test suite dependencies.
|
||||||
|
|
||||||
:param suite_deps: Test suite dependencies read from the
|
:param suite_deps: Test suite dependencies read from the
|
||||||
.functions file.
|
.functions file.
|
||||||
|
@ -614,8 +643,14 @@ def gen_suite_deps_checks(suite_deps, dep_check_code, expression_code):
|
||||||
|
|
||||||
def gen_from_test_data(data_f, out_data_f, func_info, suite_deps):
|
def gen_from_test_data(data_f, out_data_f, func_info, suite_deps):
|
||||||
"""
|
"""
|
||||||
Generates dependency checks, expression code and intermediate
|
This function reads test case name, dependencies and test vectors
|
||||||
data file from test data file.
|
from the .data file. This information is correlated with the test
|
||||||
|
functions file for generating an intermediate data file replacing
|
||||||
|
the strings for test function names, dependencies and integer
|
||||||
|
constant expressions with identifiers. Mainly for optimising
|
||||||
|
space for on-target execution.
|
||||||
|
It also generates test case dependency check code and expression
|
||||||
|
evaluation code.
|
||||||
|
|
||||||
:param data_f: Data file object
|
:param data_f: Data file object
|
||||||
:param out_data_f:Output intermediate data file
|
:param out_data_f:Output intermediate data file
|
||||||
|
@ -660,15 +695,16 @@ def gen_from_test_data(data_f, out_data_f, func_info, suite_deps):
|
||||||
|
|
||||||
|
|
||||||
def generate_code(funcs_file, data_file, template_file, platform_file,
|
def generate_code(funcs_file, data_file, template_file, platform_file,
|
||||||
help_file, suites_dir, c_file, out_data_file):
|
helpers_file, suites_dir, c_file, out_data_file):
|
||||||
"""
|
"""
|
||||||
Generate mbed-os test code.
|
Generates C source code from test suite file, data file, common
|
||||||
|
helpers file and platform file.
|
||||||
|
|
||||||
:param funcs_file: Functions file object
|
:param funcs_file: Functions file object
|
||||||
:param data_file: Data file object
|
:param data_file: Data file object
|
||||||
:param template_file: Template file object
|
:param template_file: Template file object
|
||||||
:param platform_file: Platform file object
|
:param platform_file: Platform file object
|
||||||
:param help_file: Helper functions file object
|
:param helpers_file: Helper functions file object
|
||||||
:param suites_dir: Test suites dir
|
:param suites_dir: Test suites dir
|
||||||
:param c_file: Output C file object
|
:param c_file: Output C file object
|
||||||
:param out_data_file: Output intermediate data file object
|
:param out_data_file: Output intermediate data file object
|
||||||
|
@ -678,7 +714,7 @@ def generate_code(funcs_file, data_file, template_file, platform_file,
|
||||||
('Data file', data_file),
|
('Data file', data_file),
|
||||||
('Template file', template_file),
|
('Template file', template_file),
|
||||||
('Platform file', platform_file),
|
('Platform file', platform_file),
|
||||||
('Help code file', help_file),
|
('Helpers code file', helpers_file),
|
||||||
('Suites dir', suites_dir)]:
|
('Suites dir', suites_dir)]:
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
raise IOError("ERROR: %s [%s] not found!" % (name, path))
|
raise IOError("ERROR: %s [%s] not found!" % (name, path))
|
||||||
|
@ -686,9 +722,9 @@ def generate_code(funcs_file, data_file, template_file, platform_file,
|
||||||
snippets = {'generator_script' : os.path.basename(__file__)}
|
snippets = {'generator_script' : os.path.basename(__file__)}
|
||||||
|
|
||||||
# Read helpers
|
# Read helpers
|
||||||
with open(help_file, 'r') as help_f, open(platform_file, 'r') as \
|
with open(helpers_file, 'r') as help_f, open(platform_file, 'r') as \
|
||||||
platform_f:
|
platform_f:
|
||||||
snippets['test_common_helper_file'] = help_file
|
snippets['test_common_helper_file'] = helpers_file
|
||||||
snippets['test_common_helpers'] = help_f.read()
|
snippets['test_common_helpers'] = help_f.read()
|
||||||
snippets['test_platform_file'] = platform_file
|
snippets['test_platform_file'] = platform_file
|
||||||
snippets['platform_code'] = platform_f.read().replace(
|
snippets['platform_code'] = platform_f.read().replace(
|
||||||
|
@ -730,36 +766,36 @@ def check_cmd():
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Generate code for mbed-os tests.')
|
description='Dynamically generate test suite code.')
|
||||||
|
|
||||||
parser.add_argument("-f", "--functions-file",
|
parser.add_argument("-f", "--functions-file",
|
||||||
dest="funcs_file",
|
dest="funcs_file",
|
||||||
help="Functions file",
|
help="Functions file",
|
||||||
metavar="FUNCTIONS",
|
metavar="FUNCTIONS_FILE",
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
parser.add_argument("-d", "--data-file",
|
parser.add_argument("-d", "--data-file",
|
||||||
dest="data_file",
|
dest="data_file",
|
||||||
help="Data file",
|
help="Data file",
|
||||||
metavar="DATA",
|
metavar="DATA_FILE",
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
parser.add_argument("-t", "--template-file",
|
parser.add_argument("-t", "--template-file",
|
||||||
dest="template_file",
|
dest="template_file",
|
||||||
help="Template file",
|
help="Template file",
|
||||||
metavar="TEMPLATE",
|
metavar="TEMPLATE_FILE",
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
parser.add_argument("-s", "--suites-dir",
|
parser.add_argument("-s", "--suites-dir",
|
||||||
dest="suites_dir",
|
dest="suites_dir",
|
||||||
help="Suites dir",
|
help="Suites dir",
|
||||||
metavar="SUITES",
|
metavar="SUITES_DIR",
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
parser.add_argument("--help-file",
|
parser.add_argument("--helpers-file",
|
||||||
dest="help_file",
|
dest="helpers_file",
|
||||||
help="Help file",
|
help="Helpers file",
|
||||||
metavar="HELPER",
|
metavar="HELPERS_FILE",
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
parser.add_argument("-p", "--platform-file",
|
parser.add_argument("-p", "--platform-file",
|
||||||
|
@ -789,7 +825,7 @@ def check_cmd():
|
||||||
os.makedirs(d)
|
os.makedirs(d)
|
||||||
|
|
||||||
generate_code(args.funcs_file, args.data_file, args.template_file,
|
generate_code(args.funcs_file, args.data_file, args.template_file,
|
||||||
args.platform_file, args.help_file, args.suites_dir,
|
args.platform_file, args.helpers_file, args.suites_dir,
|
||||||
out_c_file, out_data_file)
|
out_c_file, out_data_file)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue