ext: testlib loading tests from multiple directories
[gem5.git] / ext / testlib / configuration.py
index 1267c25b8a2e81da397affff0b16ba116950a9b5..1fffab46ffe87bd90e0e4cf7bd1c1f42f8c44e72 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 ARM Limited
+# Copyright (c) 2020-2021 ARM Limited
 # All rights reserved
 #
 # The license below extends only to copyright in the software and shall
@@ -83,7 +83,6 @@ import copy
 import os
 import re
 
-from six import add_metaclass
 from pickle import HIGHEST_PROTOCOL as highest_pickle_protocol
 
 from testlib.helper import absdirpath, AttrDict, FrozenAttrDict
@@ -233,6 +232,7 @@ def define_constants(constants):
 
     constants.isa_tag_type = 'isa'
     constants.x86_tag = 'X86'
+    constants.gcn3_x86_tag = 'GCN3_X86'
     constants.sparc_tag = 'SPARC'
     constants.riscv_tag = 'RISCV'
     constants.arm_tag = 'ARM'
@@ -256,6 +256,7 @@ def define_constants(constants):
     constants.supported_tags = {
         constants.isa_tag_type : (
             constants.x86_tag,
+            constants.gcn3_x86_tag,
             constants.sparc_tag,
             constants.riscv_tag,
             constants.arm_tag,
@@ -283,6 +284,7 @@ def define_constants(constants):
     constants.target_host = {
         constants.arm_tag   : (constants.host_arm_tag,),
         constants.x86_tag   : (constants.host_x86_64_tag,),
+        constants.gcn3_x86_tag : (constants.host_x86_64_tag,),
         constants.sparc_tag : (constants.host_x86_64_tag,),
         constants.riscv_tag : (constants.host_x86_64_tag,),
         constants.mips_tag  : (constants.host_x86_64_tag,),
@@ -486,13 +488,16 @@ def define_common_args(config):
     '''
     global common_args
 
+    parse_comma_separated_string = lambda st: st.split(',')
+
     # A list of common arguments/flags used across cli parsers.
     common_args = [
         Argument(
-            'directory',
-            nargs='?',
-            default=os.getcwd(),
-            help='Directory to start searching for tests in'),
+            'directories',
+            nargs='*',
+            default=[os.getcwd()],
+            help='Space separated list of directories to start searching '
+                 'for tests in'),
         Argument(
             '--exclude-tags',
             action=StorePositionalTagsAction,
@@ -503,20 +508,23 @@ def define_common_args(config):
             help='A tag comparison used to select tests.'),
         Argument(
             '--isa',
-            action='append',
+            action='extend',
             default=[],
+            type=parse_comma_separated_string,
             help="Only tests that are valid with one of these ISAs. "
                  "Comma separated."),
         Argument(
             '--variant',
-            action='append',
+            action='extend',
             default=[],
+            type=parse_comma_separated_string,
             help="Only tests that are valid with one of these binary variants"
                  "(e.g., opt, debug). Comma separated."),
         Argument(
             '--length',
-            action='append',
+            action='extend',
             default=[],
+            type=parse_comma_separated_string,
             help="Only tests that are one of these lengths. Comma separated."),
         Argument(
             '--host',
@@ -594,8 +602,12 @@ def define_common_args(config):
     # one in the list will be saved.
     common_args = AttrDict({arg.name:arg for arg in common_args})
 
-@add_metaclass(abc.ABCMeta)
-class ArgParser(object):
+class ArgParser(object, metaclass=abc.ABCMeta):
+    class ExtendAction(argparse.Action):
+        def __call__(self, parser, namespace, values, option_string=None):
+            items = getattr(namespace, self.dest, [])
+            items.extend(values)
+            setattr(namespace, self.dest, items)
 
     def __init__(self, parser):
         # Copy public methods of the parser.
@@ -603,6 +615,7 @@ class ArgParser(object):
             if not attr.startswith('_'):
                 setattr(self, attr, getattr(parser, attr))
         self.parser = parser
+        self.parser.register('action', 'extend', ArgParser.ExtendAction)
         self.add_argument = self.parser.add_argument
 
         # Argument will be added to all parsers and subparsers.
@@ -634,7 +647,7 @@ class RunParser(ArgParser):
 
         common_args.uid.add_to(parser)
         common_args.skip_build.add_to(parser)
-        common_args.directory.add_to(parser)
+        common_args.directories.add_to(parser)
         common_args.build_dir.add_to(parser)
         common_args.base_dir.add_to(parser)
         common_args.bin_path.add_to(parser)
@@ -691,7 +704,7 @@ class ListParser(ArgParser):
             help='Quiet output (machine readable).'
         ).add_to(parser)
 
-        common_args.directory.add_to(parser)
+        common_args.directories.add_to(parser)
         common_args.bin_path.add_to(parser)
         common_args.isa.add_to(parser)
         common_args.variant.add_to(parser)
@@ -710,7 +723,7 @@ class RerunParser(ArgParser):
         super(RerunParser, self).__init__(parser)
 
         common_args.skip_build.add_to(parser)
-        common_args.directory.add_to(parser)
+        common_args.directories.add_to(parser)
         common_args.build_dir.add_to(parser)
         common_args.base_dir.add_to(parser)
         common_args.bin_path.add_to(parser)