1# -*- Python -*- 2 3import os 4import platform 5 6# Configuration file for the 'lit' test runner. 7 8# name: The name of this test suite. 9config.name = 'Clang' 10 11# Tweak PATH for Win32 12if platform.system() == 'Windows': 13 # Seek sane tools in directories and set to $PATH. 14 path = getattr(config, 'lit_tools_dir', None) 15 path = lit.getToolsPath(path, 16 config.environment['PATH'], 17 ['cmp.exe', 'grep.exe', 'sed.exe']) 18 if path is not None: 19 path = os.path.pathsep.join((path, 20 config.environment['PATH'])) 21 config.environment['PATH'] = path 22 23# testFormat: The test format to use to interpret tests. 24# 25# For now we require '&&' between commands, until they get globally killed and 26# the test runner updated. 27execute_external = (platform.system() != 'Windows' 28 or lit.getBashPath() not in [None, ""]) 29config.test_format = lit.formats.ShTest(execute_external) 30 31# suffixes: A list of file extensions to treat as test files. 32config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl'] 33 34# test_source_root: The root path where tests are located. 35config.test_source_root = os.path.dirname(__file__) 36 37# test_exec_root: The root path where tests should be run. 38clang_obj_root = getattr(config, 'clang_obj_root', None) 39if clang_obj_root is not None: 40 config.test_exec_root = os.path.join(clang_obj_root, 'test') 41 42# Set llvm_{src,obj}_root for use by others. 43config.llvm_src_root = getattr(config, 'llvm_src_root', None) 44config.llvm_obj_root = getattr(config, 'llvm_obj_root', None) 45 46# Tweak the PATH to include the tools dir and the scripts dir. 47if clang_obj_root is not None: 48 llvm_tools_dir = getattr(config, 'llvm_tools_dir', None) 49 if not llvm_tools_dir: 50 lit.fatal('No LLVM tools dir set!') 51 path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH'])) 52 config.environment['PATH'] = path 53 54 llvm_libs_dir = getattr(config, 'llvm_libs_dir', None) 55 if not llvm_libs_dir: 56 lit.fatal('No LLVM libs dir set!') 57 path = os.path.pathsep.join((llvm_libs_dir, 58 config.environment.get('LD_LIBRARY_PATH',''))) 59 config.environment['LD_LIBRARY_PATH'] = path 60 61### 62 63# Check that the object root is known. 64if config.test_exec_root is None: 65 # Otherwise, we haven't loaded the site specific configuration (the user is 66 # probably trying to run on a test file directly, and either the site 67 # configuration hasn't been created by the build system, or we are in an 68 # out-of-tree build situation). 69 70 # Check for 'clang_site_config' user parameter, and use that if available. 71 site_cfg = lit.params.get('clang_site_config', None) 72 if site_cfg and os.path.exists(site_cfg): 73 lit.load_config(config, site_cfg) 74 raise SystemExit 75 76 # Try to detect the situation where we are using an out-of-tree build by 77 # looking for 'llvm-config'. 78 # 79 # FIXME: I debated (i.e., wrote and threw away) adding logic to 80 # automagically generate the lit.site.cfg if we are in some kind of fresh 81 # build situation. This means knowing how to invoke the build system though, 82 # and I decided it was too much magic. We should solve this by just having 83 # the .cfg files generated during the configuration step. 84 85 llvm_config = lit.util.which('llvm-config', config.environment['PATH']) 86 if not llvm_config: 87 lit.fatal('No site specific configuration available!') 88 89 # Get the source and object roots. 90 llvm_src_root = lit.util.capture(['llvm-config', '--src-root']).strip() 91 llvm_obj_root = lit.util.capture(['llvm-config', '--obj-root']).strip() 92 clang_src_root = os.path.join(llvm_src_root, "tools", "clang") 93 clang_obj_root = os.path.join(llvm_obj_root, "tools", "clang") 94 95 # Validate that we got a tree which points to here, using the standard 96 # tools/clang layout. 97 this_src_root = os.path.dirname(config.test_source_root) 98 if os.path.realpath(clang_src_root) != os.path.realpath(this_src_root): 99 lit.fatal('No site specific configuration available!') 100 101 # Check that the site specific configuration exists. 102 site_cfg = os.path.join(clang_obj_root, 'test', 'lit.site.cfg') 103 if not os.path.exists(site_cfg): 104 lit.fatal('No site specific configuration available! You may need to ' 105 'run "make test" in your Clang build directory.') 106 107 # Okay, that worked. Notify the user of the automagic, and reconfigure. 108 lit.note('using out-of-tree build at %r' % clang_obj_root) 109 lit.load_config(config, site_cfg) 110 raise SystemExit 111 112### 113 114# Discover the 'clang' and 'clangcc' to use. 115 116import os 117 118def inferClang(PATH): 119 # Determine which clang to use. 120 clang = os.getenv('CLANG') 121 122 # If the user set clang in the environment, definitely use that and don't 123 # try to validate. 124 if clang: 125 return clang 126 127 # Otherwise look in the path. 128 clang = lit.util.which('clang', PATH) 129 130 if not clang: 131 lit.fatal("couldn't find 'clang' program, try setting " 132 "CLANG in your environment") 133 134 return clang 135 136# When running under valgrind, we mangle '-vg' onto the end of the triple so we 137# can check it with XFAIL and XTARGET. 138if lit.useValgrind: 139 config.target_triple += '-vg' 140 141config.clang = inferClang(config.environment['PATH']).replace('\\', '/') 142if not lit.quiet: 143 lit.note('using clang: %r' % config.clang) 144config.substitutions.append( ('%clang_cc1', config.clang + ' -cc1') ) 145config.substitutions.append( ('%clangxx', ' ' + config.clang + 146 ' -ccc-clang-cxx -ccc-cxx ')) 147config.substitutions.append( ('%clang', ' ' + config.clang + ' ') ) 148config.substitutions.append( ('%test_debuginfo', ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') ) 149 150# FIXME: Find nicer way to prohibit this. 151config.substitutions.append( 152 (' clang ', """*** Do not use 'clang' in tests, use '%clang'. ***""") ) 153config.substitutions.append( 154 (' clang\+\+ ', """*** Do not use 'clang++' in tests, use '%clangxx'. ***""")) 155config.substitutions.append( 156 (' clang-cc ', 157 """*** Do not use 'clang-cc' in tests, use '%clang_cc1'. ***""") ) 158config.substitutions.append( 159 (' clang -cc1 ', 160 """*** Do not use 'clang -cc1' in tests, use '%clang_cc1'. ***""") ) 161config.substitutions.append( 162 (' %clang-cc1 ', 163 """*** invalid substitution, use '%clang_cc1'. ***""") ) 164 165### 166 167# Set available features we allow tests to conditionalize on. 168if platform.system() != 'Windows': 169 config.available_features.add('crash-recovery') 170 171# Shell execution 172if platform.system() not in ['Windows'] or lit.getBashPath() != '': 173 config.available_features.add('shell') 174 175# Registered Targets 176import subprocess 177import re 178import os 179 180def getRegisteredTargets(tool): 181 set_of_targets = set() 182 183 cmd = subprocess.Popen([tool, '-version'], stdout=subprocess.PIPE) 184 185 # Parse the stdout to get the list of registered targets. 186 parse_targets = False 187 for line in cmd.stdout: 188 if parse_targets: 189 m = re.match( r'(.*) - ', line) 190 if m is not None: 191 set_of_targets.add(m.group(1).strip() + '-registered-target') 192 else: 193 break 194 elif "Registered Targets:" in line: 195 parse_targets = True 196 197 return set_of_targets 198 199registered_targets = getRegisteredTargets(os.path.join(llvm_tools_dir, 'llc')) 200if len(registered_targets) > 0: 201 config.available_features.update(registered_targets) 202else: 203 lit.fatal('No Targets Registered with the LLVM Tools!') 204