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