Home | History | Annotate | Download | only in test
      1 import os
      2 import re
      3 
      4 import libcxx.test.config
      5 import libcxx.android.build
      6 import libcxx.android.compiler
      7 import libcxx.android.test.format
      8 
      9 
     10 class Configuration(libcxx.test.config.Configuration):
     11     def __init__(self, lit_config, config):
     12         super(Configuration, self).__init__(lit_config, config)
     13         self.build_cmds_dir = None
     14 
     15     def configure(self):
     16         self.configure_src_root()
     17         self.configure_build_cmds()
     18         self.configure_obj_root()
     19 
     20         self.configure_cxx()
     21         self.configure_triple()
     22         self.configure_features()
     23 
     24     def print_config_info(self):
     25         self.lit_config.note(
     26             'Using compiler: {}'.format(self.cxx.path))
     27         self.lit_config.note(
     28             'Using compile template: {}'.format(self.cxx.cxx_template))
     29         self.lit_config.note(
     30             'Using link template: {}'.format(self.cxx.link_template))
     31         self.lit_config.note('Using available_features: %s' %
     32                              list(self.config.available_features))
     33 
     34     def configure_obj_root(self):
     35         test_config_file = os.path.join(self.build_cmds_dir, 'testconfig.mk')
     36         if 'HOST_NATIVE_TEST' in open(test_config_file).read():
     37             self.libcxx_obj_root = os.getenv('ANDROID_HOST_OUT')
     38         else:
     39             self.libcxx_obj_root = os.getenv('ANDROID_PRODUCT_OUT')
     40 
     41     def configure_build_cmds(self):
     42         os.chdir(self.config.android_root)
     43         self.build_cmds_dir = os.path.join(self.libcxx_src_root, 'buildcmds')
     44         if not libcxx.android.build.mm(self.build_cmds_dir,
     45                                        self.config.android_root):
     46             raise RuntimeError('Could not generate build commands.')
     47 
     48     def configure_cxx(self):
     49         cxx_under_test_file = os.path.join(self.build_cmds_dir,
     50                                            'cxx_under_test')
     51         cxx_under_test = open(cxx_under_test_file).read().strip()
     52 
     53         cxx_template_file = os.path.join(self.build_cmds_dir, 'cxx.cmds')
     54         cxx_template = open(cxx_template_file).read().strip()
     55 
     56         link_template_file = os.path.join(self.build_cmds_dir, 'link.cmds')
     57         link_template = open(link_template_file).read().strip()
     58 
     59         self.cxx = libcxx.android.compiler.AndroidCXXCompiler(
     60             cxx_under_test, cxx_template, link_template)
     61 
     62     def configure_triple(self):
     63         self.config.target_triple = self.cxx.get_triple()
     64 
     65     def configure_features(self):
     66         self.config.available_features.add('long_tests')
     67         std_pattern = re.compile(r'-std=(c\+\+\d[0-9x-z])')
     68         match = std_pattern.search(self.cxx.cxx_template)
     69         if match:
     70             self.config.available_features.add(match.group(1))
     71 
     72     def get_test_format(self):
     73         mode = self.lit_config.params.get('android_mode', 'device')
     74         if mode == 'device':
     75             return libcxx.android.test.format.TestFormat(
     76                 self.cxx,
     77                 self.libcxx_src_root,
     78                 self.libcxx_obj_root,
     79                 getattr(self.config, 'device_dir', '/data/local/tmp/'),
     80                 getattr(self.config, 'timeout', '60'))
     81         elif mode == 'host':
     82             return libcxx.android.test.format.HostTestFormat(
     83                 self.cxx,
     84                 self.libcxx_src_root,
     85                 self.libcxx_obj_root,
     86                 getattr(self.config, 'timeout', '60'))
     87         else:
     88             raise RuntimeError('Invalid android_mode: {}'.format(mode))
     89