183 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
| import os
 | |
| import itertools
 | |
| import platform
 | |
| import subprocess
 | |
| import sys
 | |
| 
 | |
| import lit.util
 | |
| from lit.llvm import llvm_config
 | |
| from lit.llvm.subst import FindTool
 | |
| from lit.llvm.subst import ToolSubst
 | |
| 
 | |
| 
 | |
| def _get_lldb_init_path(config):
 | |
|     return os.path.join(config.test_exec_root, 'lit-lldb-init')
 | |
| 
 | |
| 
 | |
| def _disallow(config, execName):
 | |
|   warning = '''
 | |
|     echo '*** Do not use \'{0}\' in tests; use \'%''{0}\'. ***' &&
 | |
|     exit 1 && echo
 | |
|   '''
 | |
|   config.substitutions.append((' {0} '.format(execName),
 | |
|                                warning.format(execName)))
 | |
| 
 | |
| 
 | |
| def use_lldb_substitutions(config):
 | |
|     # Set up substitutions for primary tools.  These tools must come from config.lldb_tools_dir
 | |
|     # which is basically the build output directory.  We do not want to find these in path or
 | |
|     # anywhere else, since they are specifically the programs which are actually being tested.
 | |
| 
 | |
|     dsname = 'debugserver' if platform.system() in ['Darwin'] else 'lldb-server'
 | |
|     dsargs = [] if platform.system() in ['Darwin'] else ['gdbserver']
 | |
| 
 | |
|     build_script = os.path.dirname(__file__)
 | |
|     build_script = os.path.join(build_script, 'build.py')
 | |
|     build_script_args = [build_script,
 | |
|                         '--compiler=any', # Default to best compiler
 | |
|                         '--arch=' + str(config.lldb_bitness)]
 | |
|     if config.lldb_lit_tools_dir:
 | |
|         build_script_args.append('--tools-dir={0}'.format(config.lldb_lit_tools_dir))
 | |
|     if config.lldb_tools_dir:
 | |
|         build_script_args.append('--tools-dir={0}'.format(config.lldb_tools_dir))
 | |
|     if config.llvm_libs_dir:
 | |
|         build_script_args.append('--libs-dir={0}'.format(config.llvm_libs_dir))
 | |
| 
 | |
|     lldb_init = _get_lldb_init_path(config)
 | |
| 
 | |
|     primary_tools = [
 | |
|         ToolSubst('%lldb',
 | |
|                   command=FindTool('lldb'),
 | |
|                   extra_args=['--no-lldbinit', '-S', lldb_init],
 | |
|                   unresolved='fatal'),
 | |
|         ToolSubst('%lldb-init',
 | |
|                   command=FindTool('lldb'),
 | |
|                   extra_args=['-S', lldb_init],
 | |
|                   unresolved='fatal'),
 | |
|         ToolSubst('%lldb-noinit',
 | |
|                   command=FindTool('lldb'),
 | |
|                   extra_args=['--no-lldbinit'],
 | |
|                   unresolved='fatal'),
 | |
|         ToolSubst('%lldb-server',
 | |
|                   command=FindTool("lldb-server"),
 | |
|                   extra_args=[],
 | |
|                   unresolved='ignore'),
 | |
|         ToolSubst('%debugserver',
 | |
|                   command=FindTool(dsname),
 | |
|                   extra_args=dsargs,
 | |
|                   unresolved='ignore'),
 | |
|         ToolSubst('%platformserver',
 | |
|                   command=FindTool('lldb-server'),
 | |
|                   extra_args=['platform'],
 | |
|                   unresolved='ignore'),
 | |
|         'lldb-test',
 | |
|         'lldb-instr',
 | |
|         'lldb-vscode',
 | |
|         ToolSubst('%build',
 | |
|                   command="'" + sys.executable + "'",
 | |
|                   extra_args=build_script_args)
 | |
|         ]
 | |
| 
 | |
|     _disallow(config, 'lldb')
 | |
|     _disallow(config, 'lldb-server')
 | |
|     _disallow(config, 'debugserver')
 | |
|     _disallow(config, 'platformserver')
 | |
| 
 | |
|     llvm_config.add_tool_substitutions(primary_tools, [config.lldb_tools_dir])
 | |
| 
 | |
| def _use_msvc_substitutions(config):
 | |
|     # If running from a Visual Studio Command prompt (e.g. vcvars), this will
 | |
|     # detect the include and lib paths, and find cl.exe and link.exe and create
 | |
|     # substitutions for each of them that explicitly specify /I and /L paths
 | |
|     cl = lit.util.which('cl')
 | |
|     link = lit.util.which('link')
 | |
| 
 | |
|     if not cl or not link:
 | |
|         return
 | |
| 
 | |
|     cl = '"' + cl + '"'
 | |
|     link = '"' + link + '"'
 | |
|     includes = os.getenv('INCLUDE', '').split(';')
 | |
|     libs = os.getenv('LIB', '').split(';')
 | |
| 
 | |
|     config.available_features.add('msvc')
 | |
|     compiler_flags = ['"/I{}"'.format(x) for x in includes if os.path.exists(x)]
 | |
|     linker_flags = ['"/LIBPATH:{}"'.format(x) for x in libs if os.path.exists(x)]
 | |
| 
 | |
|     tools = [
 | |
|         ToolSubst('%msvc_cl', command=cl, extra_args=compiler_flags),
 | |
|         ToolSubst('%msvc_link', command=link, extra_args=linker_flags)]
 | |
|     llvm_config.add_tool_substitutions(tools)
 | |
|     return
 | |
| 
 | |
| def use_support_substitutions(config):
 | |
|     # Set up substitutions for support tools.  These tools can be overridden at the CMake
 | |
|     # level (by specifying -DLLDB_LIT_TOOLS_DIR), installed, or as a last resort, we can use
 | |
|     # the just-built version.
 | |
|     host_flags = ['--target=' + config.host_triple]
 | |
|     if platform.system() in ['Darwin']:
 | |
|         try:
 | |
|             out = subprocess.check_output(['xcrun', '--show-sdk-path']).strip()
 | |
|             res = 0
 | |
|         except OSError:
 | |
|             res = -1
 | |
|         if res == 0 and out:
 | |
|             sdk_path = lit.util.to_string(out)
 | |
|             llvm_config.lit_config.note('using SDKROOT: %r' % sdk_path)
 | |
|             host_flags += ['-isysroot', sdk_path]
 | |
|     elif sys.platform != 'win32':
 | |
|         host_flags += ['-pthread']
 | |
| 
 | |
|     if sys.platform.startswith('netbsd'):
 | |
|         # needed e.g. to use freshly built libc++
 | |
|         host_flags += ['-L' + config.llvm_libs_dir,
 | |
|                   '-Wl,-rpath,' + config.llvm_libs_dir]
 | |
| 
 | |
|     # The clang module cache is used for building inferiors.
 | |
|     host_flags += ['-fmodules-cache-path={}'.format(config.clang_module_cache)]
 | |
| 
 | |
|     host_flags = ' '.join(host_flags)
 | |
|     config.substitutions.append(('%clang_host', '%clang ' + host_flags))
 | |
|     config.substitutions.append(('%clangxx_host', '%clangxx ' + host_flags))
 | |
|     config.substitutions.append(('%clang_cl_host', '%clang_cl --target='+config.host_triple))
 | |
| 
 | |
|     additional_tool_dirs=[]
 | |
|     if config.lldb_lit_tools_dir:
 | |
|         additional_tool_dirs.append(config.lldb_lit_tools_dir)
 | |
| 
 | |
|     llvm_config.use_clang(additional_flags=['--target=specify-a-target-or-use-a-_host-substitution'],
 | |
|                           additional_tool_dirs=additional_tool_dirs,
 | |
|                           required=True)
 | |
| 
 | |
| 
 | |
|     if sys.platform == 'win32':
 | |
|         _use_msvc_substitutions(config)
 | |
| 
 | |
|     have_lld = llvm_config.use_lld(additional_tool_dirs=additional_tool_dirs,
 | |
|                                    required=False)
 | |
|     if have_lld:
 | |
|         config.available_features.add('lld')
 | |
| 
 | |
| 
 | |
|     support_tools = ['yaml2obj', 'obj2yaml', 'llvm-dwp', 'llvm-pdbutil',
 | |
|                      'llvm-mc', 'llvm-readobj', 'llvm-objdump',
 | |
|                      'llvm-objcopy', 'lli']
 | |
|     additional_tool_dirs += [config.lldb_tools_dir, config.llvm_tools_dir]
 | |
|     llvm_config.add_tool_substitutions(support_tools, additional_tool_dirs)
 | |
| 
 | |
|     _disallow(config, 'clang')
 | |
| 
 | |
| def use_lldb_repro_substitutions(config, mode):
 | |
|     lldb_init = _get_lldb_init_path(config)
 | |
|     substitutions = [
 | |
|         ToolSubst(
 | |
|             '%lldb',
 | |
|             command=FindTool('lldb-repro'),
 | |
|             extra_args=[mode, '--no-lldbinit', '-S', lldb_init]),
 | |
|         ToolSubst(
 | |
|             '%lldb-init',
 | |
|             command=FindTool('lldb-repro'),
 | |
|             extra_args=[mode, '-S', lldb_init]),
 | |
|     ]
 | |
|     llvm_config.add_tool_substitutions(substitutions, [config.lldb_tools_dir])
 |