1from __future__ import absolute_import 2 3# System modules 4import argparse 5import sys 6import os 7import textwrap 8 9# LLDB modules 10from . import configuration 11 12 13def create_parser(): 14 parser = argparse.ArgumentParser( 15 description='description', 16 prefix_chars='+-', 17 add_help=False) 18 group = None 19 20 # Helper function for boolean options (group will point to the current 21 # group when executing X) 22 X = lambda optstr, helpstr, **kwargs: group.add_argument( 23 optstr, help=helpstr, action='store_true', **kwargs) 24 25 group = parser.add_argument_group('Help') 26 group.add_argument( 27 '-h', 28 '--help', 29 dest='h', 30 action='store_true', 31 help="Print this help message and exit. Add '-v' for more detailed help.") 32 33 # C and Python toolchain options 34 group = parser.add_argument_group('Toolchain options') 35 group.add_argument( 36 '-A', 37 '--arch', 38 metavar='arch', 39 dest='arch', 40 help=textwrap.dedent('''Specify the architecture(s) to test. This option can be specified more than once''')) 41 group.add_argument('-C', '--compiler', metavar='compiler', dest='compiler', help=textwrap.dedent( 42 '''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.''')) 43 if sys.platform == 'darwin': 44 group.add_argument('--apple-sdk', metavar='apple_sdk', dest='apple_sdk', default="", help=textwrap.dedent( 45 '''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.''')) 46 # FIXME? This won't work for different extra flags according to each arch. 47 group.add_argument( 48 '-E', 49 metavar='extra-flags', 50 help=textwrap.dedent('''Specify the extra flags to be passed to the toolchain when building the inferior programs to be debugged 51 suggestions: do not lump the "-A arch1 -A arch2" together such that the -E option applies to only one of the architectures''')) 52 53 group.add_argument('--dsymutil', metavar='dsymutil', dest='dsymutil', help=textwrap.dedent('Specify which dsymutil to use.')) 54 group.add_argument('--llvm-tools-dir', metavar='dir', dest='llvm_tools_dir', 55 help=textwrap.dedent('The location of llvm tools used for testing (yaml2obj, FileCheck, etc.).')) 56 57 # Test filtering options 58 group = parser.add_argument_group('Test filtering options') 59 group.add_argument( 60 '-f', 61 metavar='filterspec', 62 action='append', 63 help=('Specify a filter, which looks like "TestModule.TestClass.test_name". '+ 64 'You may also use shortened filters, such as '+ 65 '"TestModule.TestClass", "TestClass.test_name", or just "test_name".')) 66 group.add_argument( 67 '-p', 68 metavar='pattern', 69 help='Specify a regexp filename pattern for inclusion in the test suite') 70 group.add_argument('--excluded', metavar='exclusion-file', action='append', help=textwrap.dedent( 71 '''Specify a file for tests to exclude. File should contain lists of regular expressions for test files or methods, 72 with each list under a matching header (xfail files, xfail methods, skip files, skip methods)''')) 73 group.add_argument( 74 '-G', 75 '--category', 76 metavar='category', 77 action='append', 78 dest='categories_list', 79 help=textwrap.dedent('''Specify categories of test cases of interest. Can be specified more than once.''')) 80 group.add_argument( 81 '--skip-category', 82 metavar='category', 83 action='append', 84 dest='skip_categories', 85 help=textwrap.dedent('''Specify categories of test cases to skip. Takes precedence over -G. Can be specified more than once.''')) 86 group.add_argument( 87 '--xfail-category', 88 metavar='category', 89 action='append', 90 dest='xfail_categories', 91 help=textwrap.dedent('''Specify categories of test cases that are expected to fail. Can be specified more than once.''')) 92 93 # Configuration options 94 group = parser.add_argument_group('Configuration options') 95 group.add_argument( 96 '--framework', 97 metavar='framework-path', 98 help='The path to LLDB.framework') 99 group.add_argument( 100 '--executable', 101 metavar='executable-path', 102 help='The path to the lldb executable') 103 group.add_argument( 104 '--out-of-tree-debugserver', 105 dest='out_of_tree_debugserver', 106 action='store_true', 107 help='A flag to indicate an out-of-tree debug server is being used') 108 group.add_argument( 109 '--dwarf-version', 110 metavar='dwarf_version', 111 dest='dwarf_version', 112 type=int, 113 help='Override the DWARF version.') 114 group.add_argument( 115 '--setting', 116 metavar='SETTING=VALUE', 117 dest='settings', 118 type=str, 119 nargs=1, 120 action='append', 121 help='Run "setting set SETTING VALUE" before executing any test.') 122 group.add_argument( 123 '-y', 124 type=int, 125 metavar='count', 126 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.") 127 group.add_argument( 128 '-#', 129 type=int, 130 metavar='sharp', 131 dest='sharp', 132 help='Repeat the test suite for a specified number of times') 133 group.add_argument('--channel', metavar='channel', dest='channels', action='append', help=textwrap.dedent( 134 "Specify the log channels (and optional categories) e.g. 'lldb all' or 'gdb-remote packets' if no categories are specified, 'default' is used")) 135 group.add_argument( 136 '--log-success', 137 dest='log_success', 138 action='store_true', 139 help="Leave logs/traces even for successful test runs (useful for creating reference log files during debugging.)") 140 group.add_argument( 141 '--codesign-identity', 142 metavar='Codesigning identity', 143 default='lldb_codesign', 144 help='The codesigning identity to use') 145 group.add_argument( 146 '--build-dir', 147 dest='test_build_dir', 148 metavar='Test build directory', 149 default='lldb-test-build.noindex', 150 help='The root build directory for the tests. It will be removed before running.') 151 group.add_argument( 152 '--lldb-module-cache-dir', 153 dest='lldb_module_cache_dir', 154 metavar='The clang module cache directory used by LLDB', 155 help='The clang module cache directory used by LLDB. Defaults to <test build directory>/module-cache-lldb.') 156 group.add_argument( 157 '--clang-module-cache-dir', 158 dest='clang_module_cache_dir', 159 metavar='The clang module cache directory used by Clang', 160 help='The clang module cache directory used in the Make files by Clang while building tests. Defaults to <test build directory>/module-cache-clang.') 161 group.add_argument( 162 '--lldb-libs-dir', 163 dest='lldb_libs_dir', 164 metavar='path', 165 help='The path to LLDB library directory (containing liblldb)') 166 group.add_argument( 167 '--enable-plugin', 168 dest='enabled_plugins', 169 action='append', 170 type=str, 171 metavar='A plugin whose tests will be enabled', 172 help='A plugin whose tests will be enabled. The only currently supported plugin is intel-pt.') 173 174 # Configuration options 175 group = parser.add_argument_group('Remote platform options') 176 group.add_argument( 177 '--platform-name', 178 dest='lldb_platform_name', 179 metavar='platform-name', 180 help='The name of a remote platform to use') 181 group.add_argument( 182 '--platform-url', 183 dest='lldb_platform_url', 184 metavar='platform-url', 185 help='A LLDB platform URL to use when connecting to a remote platform to run the test suite') 186 group.add_argument( 187 '--platform-working-dir', 188 dest='lldb_platform_working_dir', 189 metavar='platform-working-dir', 190 help='The directory to use on the remote platform.') 191 192 # Reproducer options 193 group = parser.add_argument_group('Reproducer options') 194 group.add_argument( 195 '--capture-path', 196 metavar='reproducer path', 197 help='The reproducer capture path') 198 group.add_argument( 199 '--replay-path', 200 metavar='reproducer path', 201 help='The reproducer replay path') 202 203 # Test-suite behaviour 204 group = parser.add_argument_group('Runtime behaviour options') 205 X('-d', 'Suspend the process after launch to wait indefinitely for a debugger to attach') 206 X('-t', 'Turn on tracing of lldb command and other detailed test executions') 207 group.add_argument( 208 '-u', 209 dest='unset_env_varnames', 210 metavar='variable', 211 action='append', 212 help='Specify an environment variable to unset before running the test cases. e.g., -u DYLD_INSERT_LIBRARIES -u MallocScribble') 213 group.add_argument( 214 '--env', 215 dest='set_env_vars', 216 metavar='variable', 217 action='append', 218 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') 219 group.add_argument( 220 '--inferior-env', 221 dest='set_inferior_env_vars', 222 metavar='variable', 223 action='append', 224 help='Specify an environment variable to set to the given value for the inferior.') 225 X('-v', 'Do verbose mode of unittest framework (print out each test case invocation)') 226 group.add_argument( 227 '--enable-crash-dialog', 228 dest='disable_crash_dialog', 229 action='store_false', 230 help='(Windows only) When LLDB crashes, display the Windows crash dialog.') 231 group.set_defaults(disable_crash_dialog=True) 232 233 # Remove the reference to our helper function 234 del X 235 236 group = parser.add_argument_group('Test directories') 237 group.add_argument( 238 'args', 239 metavar='test-dir', 240 nargs='*', 241 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.') 242 243 return parser 244