| from __future__ import absolute_import |
| |
| # System modules |
| import argparse |
| import sys |
| import os |
| import textwrap |
| |
| # LLDB modules |
| from . import configuration |
| |
| |
| def create_parser(): |
| parser = argparse.ArgumentParser( |
| description='description', |
| prefix_chars='+-', |
| add_help=False) |
| group = None |
| |
| # Helper function for boolean options (group will point to the current |
| # group when executing X) |
| X = lambda optstr, helpstr, **kwargs: group.add_argument( |
| optstr, help=helpstr, action='store_true', **kwargs) |
| |
| group = parser.add_argument_group('Help') |
| group.add_argument( |
| '-h', |
| '--help', |
| dest='h', |
| action='store_true', |
| help="Print this help message and exit. Add '-v' for more detailed help.") |
| |
| # C and Python toolchain options |
| group = parser.add_argument_group('Toolchain options') |
| group.add_argument( |
| '-A', |
| '--arch', |
| metavar='arch', |
| dest='arch', |
| help=textwrap.dedent('''Specify the architecture(s) to test. This option can be specified more than once''')) |
| group.add_argument('-C', '--compiler', metavar='compiler', dest='compiler', help=textwrap.dedent( |
| '''Specify the compiler(s) used to build the inferior executables. The compiler path can be an executable basename or a full path to a compiler executable. This option can be specified multiple times.''')) |
| if sys.platform == 'darwin': |
| group.add_argument('--apple-sdk', metavar='apple_sdk', dest='apple_sdk', default="", help=textwrap.dedent( |
| '''Specify the name of the Apple SDK (macosx, macosx.internal, iphoneos, iphoneos.internal, or path to SDK) and use the appropriate tools from that SDK's toolchain.''')) |
| group.add_argument('--hermetic-libcxx', action='store_true', help=textwrap.dedent( |
| '''Force the just-built libcxx to be used for the libc++ formatter tests.''')) |
| # FIXME? This won't work for different extra flags according to each arch. |
| group.add_argument( |
| '-E', |
| metavar='extra-flags', |
| help=textwrap.dedent('''Specify the extra flags to be passed to the toolchain when building the inferior programs to be debugged |
| suggestions: do not lump the "-A arch1 -A arch2" together such that the -E option applies to only one of the architectures''')) |
| |
| group.add_argument('--dsymutil', metavar='dsymutil', dest='dsymutil', help=textwrap.dedent('Specify which dsymutil to use.')) |
| group.add_argument('--llvm-tools-dir', metavar='dir', dest='llvm_tools_dir', |
| help=textwrap.dedent('The location of llvm tools used for testing (yaml2obj, FileCheck, etc.).')) |
| |
| # Test filtering options |
| group = parser.add_argument_group('Test filtering options') |
| group.add_argument( |
| '-f', |
| metavar='filterspec', |
| action='append', |
| help=('Specify a filter, which looks like "TestModule.TestClass.test_name". '+ |
| 'You may also use shortened filters, such as '+ |
| '"TestModule.TestClass", "TestClass.test_name", or just "test_name".')) |
| group.add_argument( |
| '-p', |
| metavar='pattern', |
| help='Specify a regexp filename pattern for inclusion in the test suite') |
| group.add_argument('--excluded', metavar='exclusion-file', action='append', help=textwrap.dedent( |
| '''Specify a file for tests to exclude. File should contain lists of regular expressions for test files or methods, |
| with each list under a matching header (xfail files, xfail methods, skip files, skip methods)''')) |
| group.add_argument( |
| '-G', |
| '--category', |
| metavar='category', |
| action='append', |
| dest='categories_list', |
| help=textwrap.dedent('''Specify categories of test cases of interest. Can be specified more than once.''')) |
| group.add_argument( |
| '--skip-category', |
| metavar='category', |
| action='append', |
| dest='skip_categories', |
| help=textwrap.dedent('''Specify categories of test cases to skip. Takes precedence over -G. Can be specified more than once.''')) |
| group.add_argument( |
| '--xfail-category', |
| metavar='category', |
| action='append', |
| dest='xfail_categories', |
| help=textwrap.dedent('''Specify categories of test cases that are expected to fail. Can be specified more than once.''')) |
| |
| # Configuration options |
| group = parser.add_argument_group('Configuration options') |
| group.add_argument( |
| '--framework', |
| metavar='framework-path', |
| help='The path to LLDB.framework') |
| group.add_argument( |
| '--executable', |
| metavar='executable-path', |
| help='The path to the lldb executable') |
| group.add_argument( |
| '--out-of-tree-debugserver', |
| dest='out_of_tree_debugserver', |
| action='store_true', |
| help='A flag to indicate an out-of-tree debug server is being used') |
| group.add_argument( |
| '--dwarf-version', |
| metavar='dwarf_version', |
| dest='dwarf_version', |
| type=int, |
| help='Override the DWARF version.') |
| group.add_argument( |
| '--setting', |
| metavar='SETTING=VALUE', |
| dest='settings', |
| type=str, |
| nargs=1, |
| action='append', |
| help='Run "setting set SETTING VALUE" before executing any test.') |
| group.add_argument( |
| '-y', |
| type=int, |
| metavar='count', |
| help="Specify the iteration count used to collect our benchmarks. An example is the number of times to do 'thread step-over' to measure stepping speed.") |
| group.add_argument( |
| '-#', |
| type=int, |
| metavar='sharp', |
| dest='sharp', |
| help='Repeat the test suite for a specified number of times') |
| group.add_argument('--channel', metavar='channel', dest='channels', action='append', help=textwrap.dedent( |
| "Specify the log channels (and optional categories) e.g. 'lldb all' or 'gdb-remote packets' if no categories are specified, 'default' is used")) |
| group.add_argument( |
| '--log-success', |
| dest='log_success', |
| action='store_true', |
| help="Leave logs/traces even for successful test runs (useful for creating reference log files during debugging.)") |
| group.add_argument( |
| '--codesign-identity', |
| metavar='Codesigning identity', |
| default='lldb_codesign', |
| help='The codesigning identity to use') |
| group.add_argument( |
| '--build-dir', |
| dest='test_build_dir', |
| metavar='Test build directory', |
| default='lldb-test-build.noindex', |
| help='The root build directory for the tests. It will be removed before running.') |
| group.add_argument( |
| '--lldb-module-cache-dir', |
| dest='lldb_module_cache_dir', |
| metavar='The clang module cache directory used by LLDB', |
| help='The clang module cache directory used by LLDB. Defaults to <test build directory>/module-cache-lldb.') |
| group.add_argument( |
| '--clang-module-cache-dir', |
| dest='clang_module_cache_dir', |
| metavar='The clang module cache directory used by Clang', |
| help='The clang module cache directory used in the Make files by Clang while building tests. Defaults to <test build directory>/module-cache-clang.') |
| group.add_argument( |
| '--lldb-libs-dir', |
| dest='lldb_libs_dir', |
| metavar='path', |
| help='The path to LLDB library directory (containing liblldb)') |
| group.add_argument( |
| '--enable-plugin', |
| dest='enabled_plugins', |
| action='append', |
| type=str, |
| metavar='A plugin whose tests will be enabled', |
| help='A plugin whose tests will be enabled. The only currently supported plugin is intel-pt.') |
| |
| # Configuration options |
| group = parser.add_argument_group('Remote platform options') |
| group.add_argument( |
| '--platform-name', |
| dest='lldb_platform_name', |
| metavar='platform-name', |
| help='The name of a remote platform to use') |
| group.add_argument( |
| '--platform-url', |
| dest='lldb_platform_url', |
| metavar='platform-url', |
| help='A LLDB platform URL to use when connecting to a remote platform to run the test suite') |
| group.add_argument( |
| '--platform-working-dir', |
| dest='lldb_platform_working_dir', |
| metavar='platform-working-dir', |
| help='The directory to use on the remote platform.') |
| |
| # Test-suite behaviour |
| group = parser.add_argument_group('Runtime behaviour options') |
| X('-d', 'Suspend the process after launch to wait indefinitely for a debugger to attach') |
| X('-t', 'Turn on tracing of lldb command and other detailed test executions') |
| group.add_argument( |
| '-u', |
| dest='unset_env_varnames', |
| metavar='variable', |
| action='append', |
| help='Specify an environment variable to unset before running the test cases. e.g., -u DYLD_INSERT_LIBRARIES -u MallocScribble') |
| group.add_argument( |
| '--env', |
| dest='set_env_vars', |
| metavar='variable', |
| action='append', |
| help='Specify an environment variable to set to the given value before running the test cases e.g.: --env CXXFLAGS=-O3 --env DYLD_INSERT_LIBRARIES') |
| group.add_argument( |
| '--inferior-env', |
| dest='set_inferior_env_vars', |
| metavar='variable', |
| action='append', |
| help='Specify an environment variable to set to the given value for the inferior.') |
| X('-v', 'Do verbose mode of unittest framework (print out each test case invocation)') |
| group.add_argument( |
| '--enable-crash-dialog', |
| dest='disable_crash_dialog', |
| action='store_false', |
| help='(Windows only) When LLDB crashes, display the Windows crash dialog.') |
| group.set_defaults(disable_crash_dialog=True) |
| |
| # Remove the reference to our helper function |
| del X |
| |
| group = parser.add_argument_group('Test directories') |
| group.add_argument( |
| 'args', |
| metavar='test-dir', |
| nargs='*', |
| help='Specify a list of directory names to search for test modules named after Test*.py (test discovery). If empty, search from the current working directory instead.') |
| |
| return parser |